반응형
Data, Enum, Sealed 클래스
Data Class
Java
public class JavaPersonDto {
private final String name;
private final int age;
public JavaPersonDto(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
JavaPersonDto that = (JavaPersonDto) o;
return age == that.age && Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "JavaPersonDto{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Kotlin
data class PersonDto(
val name: String,
val age: Int
)
- 계층간의 데이터를 전달하기 위한 DTO는 다음을 포함하고 있다.
- 데이터(필드)
- 생성자와 getter
- equals, hashCode
- toString
- IDE를 활용할 수도 있고, lombok을 활용할 수도 있지만 클래스가 장황해지거나, 클래스 생성 이후 추가적인 처리를 해줘야 하는 단점이 있다.
- 코틀린에서
data
키워드를 붙여주면equals
,hashCode
,toString
을 자동으로 만들어줕다. - 여기에
named argument
까지 활용한다면?builder pattern
을 사용하는 것 같은 효과도 있다.
Enum Class
Java
public enum JavaCountry {
KOREA("KO"),
AMERICA("US");
private final String code;
JavaCountry(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
Kotlin
fun handleCountry(country: Country) {
when (country) {
Country.KOREA -> TODO()
Country.AMERICA -> TODO()
Country.A -> TODO()
}
}
enum class Country(
private val code: String
) {
KOREA("KO"),
AMERICA("US"),
A("A")
;
}
- 자바의
Enum
과 동일하게 추가적인 클래스를 상속받을 수 없다.
인터페이스는 구현할 수 있으며, 각 코드가 싱클톤이다. Enum
을 이용해 분기처리를 할 때, 코틀린에서는when
을 이용해 읽기쉬운 코드로 바꿀 수 있다.- 또한 컴파일러가
Enum
에 대한 모든 코드를 알고 있기 때문에 다른 타입에 대한 로직을 작성하지 않아도 된다. Enum
에 변화가 있다면 알 수 있다.
- 또한 컴파일러가
Sealed Class, Sealed Interface
Kotlin
sealed class HyundaiCar(
val name: String,
val price: Long
)
class Avante : HyundaiCar("아반떼", 1_000L)
class Sonata : HyundaiCar("소나타", 2_000L)
class Grandeur : HyundaiCar("그렌저", 3_000L)
sealed
: 봉인을 한Sealed Class
는 컴파일 타임 때 하위 클래스의 타입을 모두 기억한다.- 즉, 런타임 때 클래스 타입이 추가될 수 없다.
- 따라서
Enum Class
에서when
을 이용하는 것과 같은 장점을 가진다. Abstract Class
와 다른점이 이것이다.
- 하위 클래스는 같은 패키지에 있어야 한다.
Enum
과 다른 점- 클래스를 상속받을 수 있다.
- 하위 클래스는 멀티 인스턴스가 가능하다.
반응형
'Java & Kotlin > Kotlin' 카테고리의 다른 글
[Kotlin] 람다 (0) | 2022.07.07 |
---|---|
[Kotlin] 함수 (0) | 2022.07.07 |
[Kotlin] 배열과 컬렉션 (0) | 2022.07.07 |
[Kotlin] 중첩 클래스를 다루는 방법 (0) | 2022.07.06 |
[Kotlin] object를 다루는 방법 (0) | 2022.07.06 |
[Kotlin] 접근제어를 다루는 방법 (0) | 2022.07.06 |