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/hashCodetoString
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 / Grandeurclass를 생성
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의 사용
- 추상화가 필요한
EntityorDTO에 활용 JDK17에도Sealed Class가 추가됨 (문법은 다름)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.