본문 바로가기
우아한테크코스 4기/레벨1

[Java] Enum타입 사용하기

by 나는후니 2022. 2. 19.

다음 주부터 진행되는 로또 미션의 프로그래밍 요구사항에는 java enum을 적용해 프로그래밍을 구현한다. 라는 내용이 있습니다.
이번 포스팅에서는 enum 타입이 무엇이고, 어떻게 사용할 수 있을지 직접 코드로 작성해보는 시간을 갖고자 합니다.

Enum을 사용하지 않으면 불편한 점?

enum 을 사용해야 하는지 알아보기에 앞서 과거 enum을 모르던 시절 사용자 입력값에 대한 선택지를 변환하여 특정 로직을 실행시키던 코드를 살펴봅시다.

로직 실행에 큰 문제는 없어보입니다만.. 사용하는 측면에서 문제가 많습니다.

  • 선택지가 변경되어 Yes가 1이 아닌 Hell Yes!! 가 1이 된다면?
  • selection 비교시 실수로 1이 아닌 100을 비교하는 코드가 있다면?

이렇게 상수를 열거형으로 사용하게 되면 타입 안정성이 보장되지 않을 뿐더러 하드 코딩으로 인해 컴파일 시점에서의 안정성 또한 누리지 못합니다.

게다가 사용자 입력값을 처리하고 해당 처리값에 대한 로직을 다시 메서드로 생성하게 됩니다. 이 하나의 과정이 다른 위치에서 관리되는 불편함도 생겨나는 것이죠.

 

자바는 이 불편함을 해결해 줄 enum 타입을 만들었습니다.

Enum 타입 사용기

자바의 열거타입은 그 자체로 클래스이며 상수 하나당 인스턴스를 하나씩 만들어 public static final 형태로 공개합니다.
상수를 쉼표로 구분하고 대문자로 표현하는 것이 관례이죠.

 

Enum 타입은 인스턴스가 통제되고 싱글턴 형태로 존재하기 때문에 인스턴스가 딱 하나씩 만 존재함을 보장할 수 있다는 장점이 있습니다.

그리고 실제 클래스이기 때문에 메서드나 필드 생성이 가능합니다. 덕분에 한 위치에서 모든 로직을 갖고 있을 수 있습니다.

Enum은 값이 변경되지 않는 상수입니다. final 예약어를 사용합시다!!

위의 선택지에서 selectionNumber를 처리하는 과정을 enum 클래스로 분리해보았습니다.

이제 각 응답은 1, 0 , -1의 값을 확정적으로 갖고 있을 수 있습니다.

또, 함수형 인터페이스를 인자로 받아 이를 사용할 수 있습니다.
덕분에 선택지 선택부터, 실행 로직까지 Selection이라는 enum 클래스에서 관리할 수 있게 됐습니다.

 

함수형 인터페이스의 사용이 어색하거나 자바 8 미만 버전을 사용하는 경우 아래와 같이 추상 메서드를 상속받아 사용할 수 있습니다.

위 사용기처럼 Enum 타입을 사용하면

  • 데이터 간의 관계를 효과적으로 표시하여 불필요한 코드를 제거할 수 있습니다.
    • Yes, No, Else가 각각 특정 상수를 인자로 갖고 있고 이를 getter로 쉽게 가져올 수 있습니다.
  • 상태와 행위를 한 곳에서 관리할 수 있습니다.
    • 선택지를 선택한 뒤 실행하는 로직을 한 곳에서 관리하여, 불필요한 코드 중복을 막거나 행위를 생성하지 않는 실수를 발생시킬 가능성이 낮습니다.

Enum으로 데이터 관리

또 Enum 타입을 이용하여 데이터를 관리할 수도 있습니다.
데이터를 관리하고 관리하는 그룹마다 다른 로직을 수행할 수 있다는 점에서 큰 장점이 있는 것 같습니다.

실제와는 같지 않지만 우아한 테크코스의 미션들을 레벨 별로 관리해야 하는 상황이 생겼다고 가정하여 코드를 작성했습니다.

출력내용 ㅎㅎ

위 코드처럼 레벨별로 미션을 관리함으로써 레벨에 따라 데이터를 다르게 관리할 수 있다는 장점이 있습니다.

우아한 테크코스 최종 코딩테스트 미션 같은 요구사항이 오더라도 위 내용처럼 enum 타입을 활용한다면 편리하게 요구사항을 수행할 수 있을것입니다.

정리

정리하자면 Enum 타입은 입니다. 하지만 필연적으로 Enum 타입을 사용할 수 없을 때도 있습니다.


무작정 Enum 타입을 쓰기보다는 Enum 타입을 사용할 때의 장점이 무엇인지 잘 생각해보고 사용하면 좋을 것 같습니다.

가령 컴파일 타임에 안정성을 가질 필요가 있다거나, 상수 값이 변화할 가능성이 있는 경우, 데이터 그룹을 구분하여 일부가 같은 행위를 공유하는 경우 등 Enum 타입이 최대한의 장점을 발휘할 수 있는 시점에 이를 사용해봅시다!!