본문 바로가기

개발 여행/Java

[Java] ENUM(열거형 타입)

Enum은 단순히 상수에 이름을 붙여놓고, 읽기 쉽도록 코딩하는 것만 있는줄 알았다.

알고 보니까 그거보다는 기능이 좀 더 있었다. 사실 읽기 편하게 하는게 맞기는 한데, 그것보다는

설정값을 저장한다든지, 특정 분류에 대해 특징들을 모두 상수로 저장할 수도 있다는 점?

 

public enum Section {
    ENTERTAIN("1", "/ent/", "now", "service.ent"),
    MOVIE("2", "/movie", "mov", "service.mov"),
    MUSIC("3", "/music/", "mus", "service.mus")
     
    private String id;
    private String linkPrefix;
    private String shortName;
    private String serviceContentKey;
 
    Section(String id, String linkPrefix, String shortName, String contentKey) {
        this.id = id;
        this.linkPrefix = linkPrefix;
        this.shortName = shortName;
        this.serviceContentKey = contentKey;
    }
 
    public String getId() {
        return id;
    }
 
    public String getLinkPrefix() {
        return linkPrefix;
    }
 
    public String getShortName() {
        return shortName;
    }
 
    public String getServiceContentKey() {
        return serviceContentKey;
    }
}

일단 enum도 엄연히 클래스의 일종이다. 클래스가 할 수 있는 기본적인 일들(메서드 정의, 속성 정의)은 다 할 수 있다.

차이가 있다면 맨 앞 부분이 아닐까?

 

 

초기값 열거

ENTERTAIN, MOVIE 등의 요소들을 보면 단순히 0, 1, .. 과 같이 value에 이름을 매칭하는 것이 아니고,

더하여 Section에 대한 생성자도 존재하는데, 사실 생성자를 어디서 호출하는 것일까?

 

사실 열거된 초기값은 모두 생성자를 실제로 실행한 것과 다를 바 없다.

ENTERTAIN, MOVIE, … 등 맨 앞의 초기값들은, 모두 Section class의 생성자를 호출한 것이라고 읽어도 무방하다.

 

ex. Section.ENTERTAIN은 Section entertain = new Section(“106”, …) 것과 다를 바가 없다.

하나하나의 값이 모두 Section class.

 

 

게터세터(Getter, Setter) 활용

Section.ENTERTAIN.getId(), Section.MOVIE.getServiceContentKey()와 같이 getter를 사용할 수 있다.

뭐가 좋냐? 설정값 같은 부분으로 많이 활용할 있다.

이른바무슨 타입인지, ‘정렬 순서 무엇인지 등도 지정 가능하다는 .

 

 

이 예시만 하더라도, getLinkPrefix()를 통해 특정 문자열을 호출할 수 있는데,

public void setSection(Section section){
	this.section = section;
}
…
public String getUrl(Product product){
	return this.section.getLinkPrefix() + product.getId();
}

이런 식으로 Section 설정값을 저장해두고, 상품의 URL에 Prefix를 붙여서 반환하는 메서드를 만들 수도 있을 것이다.

여러 기본 작업을 수행하는 인터페이스를 만들고, 카테고리에 따라 설정값을 주입받은 뒤

설정값을 이용하여 작업하는 식으로 활용 가능해보인다.

 

 

 

기타 메서드 정의

 

메서드 정의 활용도 가능하다.

 

public void init(String message){
	log.info(“id = {}, message = {}”, this.id, message)
}

와 같이 정의하고 나면,

Section.MOVIE.init(“Hello”);

와 같이 직접 호출이 가능하다(MOVIE는 Section class의 인스턴스니까)

 

enum의 맨 앞 열거가 실제 인스턴스 생성과 다를 바 없음을 항상 주의하기.

 

 

cf. 파이썬에도 똑같은 기능이 있었는데 몰랐다. 찾아보니 처음 초기화 등 활용도가 동일하다.

 

'개발 여행 > Java' 카테고리의 다른 글

[Java] Resilience4j 예시 - CircuitBreaker  (0) 2023.01.24
[Java] Resilience4j가 뭐지?  (0) 2023.01.16