-
Java - Enum에 대해서프로그래밍 언어/Java 2021. 1. 1. 13:08
Enum
여러분들 모두 Enum에 대해서 매우 친숙할 것으로 생각된다. 일할 때 코드를 작성하다보면 Enum을 자주 마주치게 되고 나도 아무 생각 없이 Enum을 만들어서 써야지라고 생각하며 그저 Enum을 사용해왔다. 개발자에게 가장 위험한 것 중 하나가 아닐까? 이런 자세 말이다. 돌아가니까 일단 사용하자. 하고 문제가 없다면 다행이지만 추후에 문제가 생겼을 때는 아주 망할 수도 있기 때문이다. 고로 오늘은 망할 일은 없지만 궁금하기 때문에 Enum에 대해서 정리해보도록 하겠다. 서론이길다.
Enum의 장점
먼저 Enum 이놈의 장점에 대해서 먼저 알아보자. 내가 사용하면서 느꼈던 점은 다음과 같고 다른 블로그들은 참고해본 것과 합쳐보겠다.
1. IDE의 도움으로 자동완성으로 생산성 증가, 오타 방지, 재사용성 증가로 리팩토링이 쉽다. -> 예를 들면 만약 하드코딩으로 어떤 타입을 다 넣었다고 하는데, 그 타입 이름이 바뀌었다고하면 일일이 찾아주거나 전체 검색해서 바꿔줘야하는데, Enum을 사용하면 Enum 값만 바꿔주면 된다. -> 오타 방지++, 생산성 증가++
2. 타입이 있는 언어를 사용한다면 사용할 수 있는 값들의 범위를 제한하여 조금 더 안정적인 개발을 할 수 있을 것이다.
3. Enum은 단순 값이 아닌 class이기 때문에 더더욱 활용이 가능하다.
Enum 클래스의 특징
아래는 Fight라는 enum class이다. enum 클래스의특징은 THREE, FOUR, FIVE처럼 클래스 내부에 이름을 자기 맘대로해서 구현할 수 있다는 점과 클래스 로드 시점에 생성되기 때문에 임의로 생성하여 사용할 수 없다는 특징이 있다. 생성자 자체가 private으로 되어 있고 public으로 바꾸면 에러가 난다. 이렇기 때문에 사실상 임의로 생성하여 사용할 수 없겠다.
간단하게 어떤 값들을 enumerate하게 사용하려면 생성자 같은게 따로 필요 없이 사용할 수 있다. 다음과 같이 선언하면 TAM = "TAM", PL = "PL"이라는 값을 가지게 된다. enum의 디폴트 생성자가 해당 값을 넣어준다. 접근은 RoleType.TAM 이렇게 하면 된다.
public enum RoleType { TAM, PL, DEVELOPER }
아래와 같은 경우는 응용해서 사용한 방법이다.
public enum Fight { THREE(3, 4_000), FOUR(4, 10_000), FIVE(5, 30_000); private final int match; private final int money; private int count; Fight(int match, int money) { // Default 생성자는 private 으로 설정되어 있음. this.match = match; this.money = money; } public void plusCount() { this.count++; } }
사용 방법은 Fight.THREE와 같은 상수 형태로 사용하면 되고, Fight.THREE.getMatch()이런 식으로 값을 가져오면 될 것이다.
또 Enum 객체들은 singleton으로 생성되어 전역에서 사용된다. 그렇기 때문에 Multi Thread 환경에서 사용하는 것은 위험할 수도 있다. 만약 plusCount를 외부에서 호출한다면 각 인스턴스의 count가 공유되고 있기 때문에 조심해야 한다.
다음 포스팅에서는 enum이 상속받은 메소드들에 대해서 알아보자.
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java - Enum에 대해서 (3, 마지막) (0) 2021.01.01 Java - Enum에 대해서 (2) (0) 2021.01.01 Java - Generic 메소드 (0) 2021.01.01 Java - Generic 개념 (0) 2021.01.01 Java- 생산성과 편의성을 높여주는 lombok (0) 2021.01.01