본문 바로가기
Kotlin

중첩 클래스, 다양한 클래스

by oncerun 2023. 1. 15.
반응형

내부 클래스.

 

내부 클래스는 자바에서 다음과 같은 구조를 같는다.

public class JavaHouse {

  ...

  public class LivingRoom {
   ...
  }

}

 

내부 클래스를 코틀린에서 사용하는 방법을 알아보기 전에 내부 클래스의 단점을 조금 알고 가자.

 

우선 내부 클래스는 숨겨진 외부 클래스 정보를 사용할 수 있다.

내부 클래스에서 외부 클래스의 정보를 사용하고 있기 때문에 외부 클래스의 인스턴스를 GC 하려고 할 때 적절한 참조를 해제하는 코드가 내부 클래스에 없다면 해당 인스턴스는 영원히 GC 대상으로 마킹되지 않는다. 따라서 이는 메모리 누수가 생길 수 있다.

추가적으로 이를 디버깅하기 위해선 생각보다 많은 시간이 들어간다. 

 

그래서 보통 클래스 안에 클래스를 만들 때는 static클래스를 사용한다. 

 

코틀린은 이러한 가이드를 충실히 따른다.

 

class OuterClass()
{
    class InnerClass()
}

 

코틀린에서는 기본적으로 외부 클래스와 연결이 없는 중첩 클래스가 만들어진다.

만약 의도적으로 외부 클래스와 연결되는 클래스를 만들고 싶다면 inner, this@이라는 키워드를 사용해야 한다.

class OuterClass(
    private val address: String
){
    inner class InnerClass(
        private val area: Double
    ){
        val address: String
            get() = this@OuterClass.address
    }
}

 

 

다양한 클래스

 

1. Data Class

 

자바에서는 DTO를 만들기 위해 상당히 많은 작업을 진행해야 한다.

 

생성자, getter, equals, hashcode, toString까지 하지만 최근 recode 타입을 사용하면 이러한 메서드가 기본적으로 내장되어서 간단하게 Data Class를 만들 수 있다.

 

코틀린도 recode타입과 비슷하게 data라는 키워드를 통해 클래스를 쉽게 만들 수 있다.

data class PersonDto(
    val name: String,
    val age: Int
)

 

2. Enum Class

 

코틀린에서 Enum은 다음과 같이 생성한다.

enum class Country(
    private val code: String,
) {
    AMERICA("012")
}

 

Enum은 When 표현식과 사용할 때 다음과 같은 고민을 하지 않아도 된다.

1. Enum이지만 들어오지 않는 값에 대한 별도의 else문, Exception처리를 고민할 필요가 없다. 

2. Enum 클래스의 변경이 있다면 IDE에서 쉽게 알림을 주어 추가할 수 있다.

fun handleCountry(country: Country) {
    when (country) {
        Country.AMERICA -> TODO()
    }
}

 

3. Sealed Class

 

컴파일 타임 때 하위 클래스의 타입을 모두 기억한다. 따라서 런타임에 클래스 타입이 추가될 수 없다.

또 하위 클래스는 동일 패키지에 존재해야 한다. 

 

이러한 Sealed Class는 when 표현식과 사용할 때 하위 타입을 알고 있기 때문에 이점을 누릴 수 있다. 

 

보통 추상화가 필요한 Entity or DTO에는  Sealed Class가 적합할 수 있다. 

 

반응형

'Kotlin' 카테고리의 다른 글

Tip  (0) 2023.01.15
함수  (0) 2023.01.15
Object 키워드  (0) 2023.01.12
접근 제어  (0) 2023.01.02
상속  (0) 2023.01.01

댓글