0. 개요
여태 Enum Class를 사용할 때 인터페이스를 상속하여 사용한 적이 거의 없었던 것 같았는데 코틀린 공식문서를 보던 중에 Enum Class에 인터페이스를 적용한 코드가 보여 궁금한 김에 포스팅 진행해보려 합니다.
1. 예제 코드
아래 예제 코드는 코틀린 공식 문서에서 가져온 예제입니다.
IntArithmetics Enum 클래스에 BinaryOperator, IntBinaryOperator 인터페이스들을 Implement 하여 사용하는 형식입니다.
import java.util.function.BinaryOperator
import java.util.function.IntBinaryOperator
enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
},
TIMES {
override fun apply(t: Int, u: Int): Int = t * u
};
override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}
fun main() {
val a = 13
val b = 31
for (f in IntArithmetics.entries) {
println("$f($a, $b) = ${f.apply(a, b)}")
}
}
두 인터페이스를 상속 받아 사용한다면, applyAsInt()와 apply() 메서드 두 개를 재정의 해야 합니다.
하지만 Enum 에서는 apply() 메서드만 재정의 하고 있는데, override fun applyAsInt(t: Int, u: Int) = apply(t, u) 코드를 보면 중복되는 메서드를 하나로 통합하여 사용하는 형태를 띠고 있습니다.
2. 인터페이스
사용된 인터페이스는 아래와 같습니다.
아래 이미지에서 볼 수 있다 시피 applyAsInt(), apply() 메서드를 재정의해야 하는 모습을 볼 수 있습니다.
특징 | BinaryOperator<T> | IntBinaryOperator |
입력/출력 타입 | 제네릭 타입 T | 원시 타입 int |
박싱 여부 | 박싱된 타입(Integer) 사용 | 박싱 없음, 원시 타입만 처리 |
성능 | 박싱/언박싱으로 인해 성능 저하 가능성 | 원시 타입만 처리하므로 성능 최적화 |
사용 목적 | 모든 타입에 대해 일반적으로 사용 가능 | int 타입 연산에 특화 |
3. 메서드 통합이 가능한 조건
중복 메서드를 하나로 통합하려면, 다음 조건을 만족해야 합니다:
a. 동일한 동작을 수행해야 함
- 두 메서드가 본질적으로 같은 작업을 수행해야 합니다.
- 예: apply와 applyAsInt는 두 숫자를 연산하고 결과를 반환하는 동작을 공유합니다.
b. 파라미터와 반환값이 호환 가능해야 함
- 두 메서드의 파라미터와 반환값이 서로 변환 가능해야 합니다.
- 예: Int와 int는 Kotlin의 박싱/언박싱 변환을 통해 호환됩니다.
c. 추가적인 특수 처리가 없어야 함
- 메서드마다 별도의 로직이나 예외 처리가 필요하지 않아야 합니다.
- 예: apply와 applyAsInt가 서로 다른 계산을 한다면 통합할 수 없습니다.
d. 위임 가능한 구조여야 함
- 하나의 메서드에서 다른 메서드를 호출해 동작을 위임할 수 있는 구조여야 합니다.
4. 참고자료
https://kotlinlang.org/docs/enum-classes.html#implementing-interfaces-in-enum-classes
Enum classes | Kotlin
kotlinlang.org
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
java.util.function (Java Platform SE 8 )
Interface Summary Interface Description BiConsumer Represents an operation that accepts two input arguments and returns no result. BiFunction Represents a function that accepts two arguments and produces a result. BinaryOperator Represents an operation u
docs.oracle.com
'DEV > Language' 카테고리의 다른 글
[Java] Enum 안 변수를 key로 Enum 찾기 (0) | 2023.08.04 |
---|---|
[JAVA] 자바 Stream Map, FlatMap의 차이 (0) | 2023.05.13 |