Kotlin의 다양한 클래스 다루기
Data Class
Java - 계층간의 데이터를 전달하기 위한 DTO(Data Transfer Object)
1
2
3
4
5
6
7
8
9
10
public class JavaPersonDto {
private final String name;
private final int age;
public JavaPersonDto(String name, int age) {
this.name = name;
this.age = age;
}
}
DTO가 가지는 추가적인 method
Data
(필드)- 생성자 /
getter
equals
/hashCode
toString
Kotlin의 DTO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fun main(){
var dtoV1 = PersonDTO("김용준", 29)
var dtoV2 = PersonDTO("김용준", 100)
println(dtoV1.name == dtoV2.name)
println(dtoV1.age == dtoV2.age)
println(dtoV1)
}
// data 키워드를 붙이면 data class 라고 한다.
// equals / hashCode / toString 을 자동으로 만들어 준다.
data class PersonDTO (
val name: String,
val age: Int
)
- named argument를 사용하면 builder pattern과 같은 효과
- 출력 값
- true
false
PersonDTO(name=김용준, age=29)
- true
Java - JDK16
- Kotlin의
data class
같은record class
도입
Enum Class
Java의 Enum Class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum JavaCountry {
KOREA("KO"), AMERICA("US");
private final String code;
JavaCountry(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
- 추가적인 클래스를 상속받을 수 없다.
- 인터페이스는 구현할 수 있으며, 각 코드(KOREA, AMERICA)가 싱글톤
Kotlin의 Enum Class
1
2
3
4
5
enum class Country (
private val code: String
){
KOREA("KO"), AMERICA("US")
}
when
Enum Class
혹은Sealed Class
와 함께 사용할 경우, 진가를 발휘한다.
Java의 Enum 분기 처리
1
2
3
4
5
6
7
8
9
private static void handleCountry(JavaCountry country) {
if (country == JavaCountry.KOREA) {
// 로직 처리
}
if (country == JavaCountry.AMERICA) {
// 로직 처리
}
}
if
가 많아 지면 가독성이 안좋아 지고,else
로직 처리도 해줘야 한다.
Kotlin의 Enum 분기 처리
1
2
3
4
5
6
fun handleCountry(country: Country) {
when (country) {
Country.AMERICA -> println("한국")
Country.KOREA -> println("미국")
}
}
Country
라는Enum Class
를 받아서when
을 사용if
문을 남발하지 않아도 되고, 의미없는else
처리를 하지 않아도 된다.enum
의 변화가 있으면 알 수 있다.- 사라진 경우, 추가된 경우
IDE
에서warning
으로 알림
- 사라진 경우, 추가된 경우
Sealed Class, Sealed Interface
Sealed Class란?
- “봉인을 한” 이라는 뜻
- 상속이 가능하도록 추상클래스를 만드는데 외부에서 해당 클래스를 상속받지 않았으면 할 때 사용
- 즉, 하위 클래스를 봉인
- 컴파일 타입 때 하위 클래스의 타입을 모두 기억
- 런타임에 클래스 타입이 추가될 수 없다.
- 하위 클래스는
Sealed Class
와 같은 패키지에 있어야 한다.
Enum과 다른 점
- 클래스를 상속받을 수 있다.
- 하위 클래스는 멀티 인스턴스가 가능
Kotlin의 Sealed Class
1
2
3
4
5
6
7
8
sealed class HyundaiCar (
val name: String,
val price: Long
)
class Avante : HyundaiCar("아반떼", 1_000L)
class Sonata : HyundaiCar("소나타", 2_000L)
class Grandeur : HyundaiCar("그렌저", 3_000L)
- class 앞에
sealed
를 명시 - 같은 패키지 내에
Avante / Sonata / Grandeur
class를 생성
Enum Class와 같이 when 사용 가능
1
2
3
4
5
6
7
private fun handlerCar(car: HyundaiCar){
when (car){
is Avante -> println("아반떼")
is Grandeur -> println("그렌저")
is Sonata -> println("소나타")
}
}
when
안에Sealed Class
가 들어 간다면is
를 이용해서 분기 처리 가능
Sealed Class의 사용
- 추상화가 필요한
Entity
orDTO
에 활용 JDK17
에도Sealed Class
가 추가됨 (문법은 다름)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.