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 |