Kotlin enum 넌 뭐니?

2023. 9. 4. 21:54kotlin

Enum 클래스가 무엇인지 알아보고 어떻게 사용하고, 어떤 특징이 있는지 알아보자.

 

Enum은 무엇일까요???

Kotlin에서  Enum은 특별한 클래스입니다. 어떻게 특별하냐. Enum을 class 앞에 사용하면 클래스를 열거형 클래스로 사용이 가능해집니다. 다른 글들을 봐도 "열거형 클래스다"라는 말을 많이 볼 수 있습니다. 열거형? 열거?? 무슨 의미인지 알아보겠습니다.

 

먼저 아주 아주 간단한 Enum의 예를 하나 보겠습니다.

 

 

위의 코드를 보면 Fruit에 사과, 바나나, 오렌지가 있습니다.

여기서 Fruit는 Enum class

APPLE, BANANA, ORANGE = 인스턴스 = 이 자체로 사용이 가능하다!!

 

Enum안에는 자체 인스턴스를 생성할 수 있습니다. 이 말은 곧 생성과 동시에 사용이 가능한 객체를 바로 만들 수 있다는 말입니다. 그래서 아래처럼 바로 사용이 가능합니다.

 

 

doSomething이라는 작업의 결과가 만약에 Fruit 중에 하나로 결정할 수 있다면 다시 말해 어떠한 작업을 하고 그 결과가 열거된 여러 가지 중에 하나를 반환하는 작업을 한다면 이러한 상황에서 Enum은 사용하기에 좋습니다.

 

 

enum의 특징

위에서 짧게 봤던 것처럼 enum은 자체 인스턴스를 생성할 수 있는 것처럼 몇 가지 특징이 있습니다.

 

  1. 한정된 수의 인스턴스를 생성
  2. 각 enum 상수는 고유한 객체를 나타냄
  3. enum class에서 선언된 메서드와 프로퍼티는 각 enum 상수에서 사용할 수 있다.
  4. 내부에 추상 메서드를 선언하여 구현 가능
  5. 인터페이스를 상속받아 내부에 구현 가능 -> Strategy 패턴 등에서 유용

 

1. 한정된 수의 인스턴스를 생성

 

왜 한정된 수의 인스턴스를 생성한다고 했을까?? Enum 클래스는 열거형 클래스의 기능을 가진 특별한 클래스입니다.

만약 요일과 같은 7개의 결과를 반환하는 한정된 수의 인스턴스를 생성하려고 한다면 Enum 클래스의 사용을 고려해 볼 수 있습니다. 

 

2번은 위의 코드에서 알 수 있으므로 생략.

 

3번과 4번을 보면 enum 클래스에서 선언된 메서드와 프로퍼티는 각 enum 상수에서 사용할 수 있고 내부에 추상 메서드를 선언하여 구현이 가능합니다. 아래의 코드를 보겠습니다. 위의 코드를 약간 수정해 보겠습니다.

 

 

위의 Fruit class를 보면 abstract class로 tagPrice 메서드를 만들었습니다. 그리고 각 인스턴스에 구현을 하였습니다. main에 보면 result.tagPrice로 10을 넘겨주어 과일에 맞는 가격을 만들고 반환합니다. result는 enum 상수이므로 result를 이용해 추상 메서드를 구현한 각 인스턴스를 통해 메서드를 사용합니다. 또한 기존의 printfruit 하는 함수를 enum 클래스의 메서드로 만들어 책임을 넘겨주었습니다.

 

5. 인터페이스를 상속하여 구현 가능하다.

 

 

위의 코드를 보시면 Shape1, Shape2 두 개의 enum 클래스가 있습니다. 하나는 interface로 상속받아 구현한 것이고 다른 하나는 클래스 내에 추상 메서드를 선언하여 각 상수 인스턴스에 구현한 것입니다. 둘이 하는 것은 똑같지만 인터페이스를 통해 명확하게 enum class가 무엇을 할지 Strategy를 정해주어 Strategy 패턴에 적합합니다. 

 

이렇게 enum class의 기본적이 사용법을 알아보았습니다. 더 다양한 enum 클래스의 활용이 가능하지만 기본적인 것부터 천천히 알아가야겠죠. enum과 비슷한 제한된 객체를 만들어주는 Sealed라는 친구도 있습니다. 다음에는 Sealed Class에 대해 알아보는 시간을 갖겠습니다.

 

결론

enum 클래스는 제한된 것과 그리고 그 제한된 것들이 공통의 성질로 묶을 수 있다면(생성자 or 동일한 메서드 매개변수와 같은 것들)에 사용하기에 좋다!

'kotlin' 카테고리의 다른 글

Kotlin conf 2023!!  (0) 2023.05.07
함수형 프로그래밍이란  (0) 2023.01.10