DEV/Language

[Kotlin] Enum Class에 인터페이스 적용

2024. 11. 17. 20:50
목차
  1. 0. 개요
  2. 1. 예제 코드
  3. 2. 인터페이스
  4. 3. 메서드 통합이 가능한 조건
  5. 4. 참고자료

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

 

 

728x90

'DEV > Language' 카테고리의 다른 글

[Java] Enum 안 변수를 key로 Enum 찾기  (1) 2023.08.04
[JAVA] 자바 Stream Map, FlatMap의 차이  (0) 2023.05.13
  1. 0. 개요
  2. 1. 예제 코드
  3. 2. 인터페이스
  4. 3. 메서드 통합이 가능한 조건
  5. 4. 참고자료
'DEV/Language' 카테고리의 다른 글
  • [Java] Enum 안 변수를 key로 Enum 찾기
  • [JAVA] 자바 Stream Map, FlatMap의 차이
l-eazzy
l-eazzy
귀찮고 귀찮은데 귀찮기 싫어서 개발하는 귀찮은 개발자.
귀찮은 개발자의 블로그귀찮고 귀찮은데 귀찮기 싫어서 개발하는 귀찮은 개발자.
l-eazzy
귀찮은 개발자의 블로그
l-eazzy
전체
오늘
어제
  • 분류 전체보기 (87)
    • DEV (67)
      • Language (3)
      • Spring (22)
      • Node (4)
      • Flutter (1)
      • Infra (14)
      • DataBase (2)
      • Airflow (2)
      • ErorrBox (8)
      • Etc (11)
    • REVIEW (7)
      • IT (7)
    • Daily (10)
      • 출사 (1)
      • 그냥 (1)
      • 오늘의 점심 (7)
    • 아무거나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • docker
  • Spring
  • 티스토리챌린지
  • QueryDSL
  • Airflow
  • AWS
  • 오블완
  • 강남
  • springboot
  • JPA

최근 댓글

최근 글

hELLO · Designed By 정상우.
l-eazzy
[Kotlin] Enum Class에 인터페이스 적용
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.