🎯 모든 예제 소스는 ‣에서 확인할 수 있습니다.
✅ 자바에는 특수한 목적의 참조 타입이 두 가지 있다. 하나는 클래스의 일종인 열거 타입과 인터페이스 일종인 애너테이션인데 이 타입들을 올바르게 사용하는 방법을 알아본다.
열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다.
열거 타입을 지원하기 전에는 정수 열거 패턴 기법을 많이 사용했었는데, 이 기법은 타입 안전을 보장할 방법이 없으며 표현력도 좋지 않다.
하지만 열거 타입은 컴파일타임 타입 안전성을 제공하고, 다른 타입의 값을 넘기려 하면 컴파일 오류가 난다.
또한 각자의 이름공간이 있어서 이름이 같은 상수도 평화롭게 공존하며 새로운 상수를 추가하거나 순서를 바꿔도 다시 컴파일 하지 않아도 된다.
공개되는 건 오직 필드의 이름뿐이라, 정수 열거 패턴과 달리 상수 값이 클라이언트로 컴파일되어 각인되지 않기 때문이다.
마지막으로, 열거 타입의 toString 메서드는 출력하기에 적합한 문자열을 내어준다.
enum class Planet(mass: Double, radius: Double) {
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6),
EARTH(5.975e+24, 6.378e6),
MARS(6.419e+23, 3.393e6),
;
val mass: Double = mass
val radius: Double = radius
private val surfaceGravity: Double
private object Const {
const val G = 6.67300E-11
}
init {
this.surfaceGravity = Const.G * mass / (radius * radius)
}
fun surfaceWeight(mass: Double) = mass * surfaceGravity
}
다음은 행성의 질량과 반지름을 열거 타입으로 만들고, 상수 각각의 특정 데이터를 연결 짓기 위해 생성자에서 데이터를 받아 인스턴스 필드에 저장을 했다.
이렇게 복잡한 구조 또한 어렵지 않게 열거 타입으로 선언할 수 있다.
📢 코틀린으로 변환하는 과정에서 재밌는 사실을 하나 알았다. 기존 const 상수형 선언 시 companion object를 통해 많이 사용했는데, 이렇게 된다면 실제 companion 클래스를 정적 클래스로 만들어 내부 인스턴스 참조형으로 생성이 된다.
→ 하지만, object로 감싸고 선언을 하게 된다면, 내부 정적 인스턴스를 생성하여 해당 인스턴스에 참조를 걸어주는 것을 볼 수 있다. 백그라운드 변환이 가장 적으므로 읽기에도, 성능적인 측면에도 더 좋다는 것을 알 수 있다.