우아한테크코스 테코톡

짱수의 Enum

https://youtu.be/qACxvjrb-xk?si=zWZeSmPMhVga47VL

짱수의 Enum

Enum의 생성배경

정수형 상수 클래스의 단점

  • 잘못된 입력이 검증되지 않는다
  • 상태와 로직이 분리되어 있다
    • 모든 것은 변경이 된다 이때 변경에 대해서 많은 곳에서 유지보수가 이루어지게 된다는 단점을 가지고 온다 결국 이것은 코드의 응집도가 떨어져 있다는 것을 보여주고 있다

단점의 보완

  • 타입으로 정의될 수 있다
  • 내부적으로 로직을 가질 수 있다

Enum의 소개

  • Enum은 클래스 인스턴스를 상수로 사용하기 위해서 제공되는 특수한 클래스 타입으로 자바 1.5 버전부터 제공되고 있다
  • Enum을 사용하는 방법은 간단하다 어떤 클래스를 만들듯이 Enum을 정의를 해주면서 내부에 어떤 상수들을 가질지를 열거 해주기만 하면 된다

장점

  • 타입 안정성
  • 상수가 책임(해동)을 가질 수 있다

Enum 파헤치기

java.lang.Enum 클래스를 상속한다

  • Enum 클래스 내부에는 Enum을 사용할 때 도움이 되는 많은 메서드들이 들어가 있는데 그 메서드들을 우리가 직접 구현하지 않더라도 자동으로 사용을 할 수 있게 된다
  • 컴파일 이후에 자바 안에 있는 Enum 클래스를 상속해야 된다 때문에 자바는 다중 상속을 할 수가 없으므로 다른 클래스의 상속이 불가능해진다

싱글톤 인스턴스의 집합니다.

  • Enum의 상수들은 미리 선언된 상수들에 대해서만 싱글톤 인스턴스로 관리가 되기 때문에 새로운 인스턴스를 생성을 할 수가 없는데 그 때문에 어떤 새로운 인스턴스를 생성을 할 수 있는 방법들이 전부 다 사용이 불가능하게 된다
  • private이 아닌 모든 생성자는 사용을 할 수가 없고 또한 새로운 개체를 생성을 할 수 있는 Object.clone(), Class.newInstance() 등의 메서드도 사용할 수가 없다
  • 생성자를 외부에 노출시킬 수 없다

필드 멤버를 가질 수 있다

  • Java Compiler 자체는 Enum 내부에 꼭 불변 클래스멤버(=필드)를 가지도록 강제하지는 않는다 그러니까 Enum 안에서 가변 클래스의 필드를 가지거나 그 값을 변동하거나 다 가능하다는 것이다
  • Enum을 사용하는가를 생각을 해본다면 Enum 클래스 내부에서 가변 클래스를 가지는 것은 그렇게 권장될 만한 사항은 아니다

행동을 가질 수 있다

  • Enum의 모든 상수들이 전부 다 각기 다른 행동을 제공을 해주기 위해서는 추상 메서드를 활용을 할 수가 있다
  • Enum 내부에 추상 메서드를 정의를 해주고 각각의 상수들은 서로 다른 행동을 추상 메서드를 구현을 해주는 식으로 각기 다른 동작을 구현을 해줄 수가 있다
  • 각기 다른 상수가 가져야 할 행동 자체를 함수형 인터페이스의 필드로 주어서 조금 더 가독성을 높일 수도 있다

Enum 잘 사용하기

  • 동일한 관심사의 값들을 열거하기
  • Enum 역시 하나의 클래스로 존재하기 때문에 너무 많은 책임이 내부에 존재하는 것은 권장하지 않는다 만약에 Enum 내부에서 어떤 로직을 구현해야 된다고 생각될 때는 정말로 그 로직이 Enum 클래스 내부에서 구현되어야 하는 값인지 즉 Enum의 책임인지를 다시 한번 고민을 해보는 것도 좋다
  • 런타임 시점에서 변경되지 않을 값들만 Enum으로 사용 Enum은 런타임 시점에는 값들이 추가되거나 삭제되기가 굉장히 어렵다

© 2020. All rights reserved.

SIKSIK