Java to Kotlin (13) - 중첩 클래스 외 다양한 클래스 를 다루는 방법

이동명·2024년 6월 19일
0

kotlin

목록 보기
13/19
post-thumbnail

중첩 클래스의 종류

자바에서는 어딘가에 소속되어 있는 클래스, 여러 종류가 있었다.

Static을 사용하는 중첩 클래스

  • 클래스 안에 static을 붙인 클래스 밖의 클래스 직접 참조 불가

Static을 사용하지 않는 중첩 클래스

  • 내부 클래스(Inner Class) : 클래스 안의 클래스, 밖의 클래스 직접 참조 가능

  • 지역 클래스(Local Class) : 메소드 내부에 클래스를 정의

  • 익명 클래스(Anonymous Class) : 일회성 클래스

아래는 자바 내부 클래스 코드 입니다.

  • 바깥 클래스랑 연결되어있음.

따라서 이렇게 사용하곤 했다. 만약 이곳에 static을 붙였다면 사용할 수 없게 됡 것이다.

하지만 내부클래스가 외부클래스를 참조함으로써 생기는 문제도 몇가지 있다.

  • 내부 클래스는 숨겨진 외부 클래스 정보를 가지고 있어,
    참조를 해지하지 못하는 경우 메모리 누수가 생길 수 있고,
    이를 디버깅 하기 어렵다.

  • 내부 클래스의 직렬화 형태가 명확하게 정의되지 않아
    직렬화에 있어 제한이 있다.

  • 참고 : Effective Java 3rd Edition – Item24, Item86

따라서 Effective Java 에서는 클래스 안에 클래스를 만들 때는 static 클래스를 사용하라 라고 합니다.

코틀린의 중첩 클래스와 내부 클래스

코틀린에서는 위의 가이드를 준수하고 있다. 아래는 코틀린 코드이다.

일단 간단한 내부 클래스는 아래처럼 사용한다.

아래는 권장되지 않았던 내부에서 외부클래스를 참조하는 코드이다.

정리하자면,

코틀린에서는 기본적으로 바깥 클래스 참조하지 않는다.
바깥 클래스를 참조하고 싶다면 inner 키워드를 추가한다.

Data Class

아래는 자바에서 계층간의 데이터를 전달하기 위한 DTO(Data Transfer Object) 입니다.

  • 그 외에도 생성자와 getter, equals, hashCode, toString 등등을 구현해서 사용합니다.

하지만 클래스가 장황해지거나, 클래스 생성 이후 추가적인 처리를 해줘야 하는 단점이 있다. 그로인해 record가 나왔지만 일단 생략하겠습니다.

아래는 더욱 간단명료한 코틀린의 DTO이다.

  • data 키워드를 붙여주면 equals, hashCode, toString을 자동으로 만들어줍니다

  • named argument까지 활용하면 builder pattern을 쓰는 것 같은 효과도 있습니다

Enum Class

아래는 자바 Enum 코드 입니다. 특징으로는

  • 추가적인 클래스를 상속받을 수 없다.

  • 인터페이스는 구현할 수 있다.

  • 각 코드가 싱글톤이다

아래는 코틀린으로 작성한 코드 입니다.

딱히 다른건 없지만 코틀린에서 when은 Enum Class 혹은 Sealed Class와
함께 사용할 경우, 더욱더 진가를 발휘한다

아래의 자바코드는 return을 하게될 시 else 로직 처리에 대한 애매함이 있습니다.

아래는 코틀린으로 작성한 코드 입니다.

  • 컴파일러가 country의 모든 타입을 알고 있어 다른 타입에 대한 로직(else)을 작성하지 않아도 된다.

  • Enum에 변화가 있으면 알 수 있다. 변화 시 IDE에서 경고 혹은 알림을 줍니다.

Sealed Class, Sealed Interface

상속이 가능하도록 추상클래스를 만들까 하는데, 외부에서는 이 클래스를 상속받지 않았으면 좋겠다 . 하위 클래스를 봉인하자 라는 니즈에서 등장하였다.

특징으로는,

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

  • 하위 클래스는 같은 패키지에 있어야 한다.

  • Enum과 다른 점: 클래스를 상속가능, 하위 클래스는 멀티 인스턴스가 가능

아래는 코틀린의 Sealed Class 이다.

when & Enum 처럼 활용가능.

추상화가 필요한 Entity or DTO에 sealed class를 활용하면 좋다.

(JDK17 에서도 Sealed Class가 추가되었습니다.)


다음 포스팅에선 배열과 컬렉션을 공부해보도록 하겠습니다.

profile
Web Developer

0개의 댓글