2022. 9. 9. 18:24ㆍDev/Java
상수를 정의 하는 방법
- enum
Java 에서 상수를 정의하기 위해 enum을 작성하는 법은 class 대신에 소문자로 enum 으로 작성하고 정의 하고자 하는 상수는 대문자 알파벳으로 작성하면 된다.
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
enum type 은 매우 독특한데 enum의 각 열거 상수(위 예시의 MONDAY, TUESDAY...)들은 각각 하나의 객체들이고 이는 최상위 Object 를 상속 받고 있음을 의미한다. 그렇기 때문에 우리가 기대할 수 있는 여러 method 들이 존재한다. 또한 하나의 객체이기 때문에 추상메소드나 인터페이스의 구현을 추가할 수도 있다.
또한 컴파일 시점 형 안정성(compile-time type safety)을 제공하는데 코드에서 반드시 해당 enum 을 받도록 선언되어 있다면 다른 enum type을 받을 수 없다. 반드시 선언된 enum type 의 열거상수 중 하나가 와야 하는 것이다.
- public static final
public class DayOfWeekUtilClass {
public static final String MONDAY = "MONDAY";
public static final String TUESDAY = "TUESDAY";
public static final String WEDNESDAY = "WEDNESDAY";
public static final String THURSDAY = "THURSDAY";
public static final String FRIDAY = "FRIDAY";
public static final String SATURDAY = "SATURDAY";
public static final String SUNDAY = "SUNDAY";
// util class 의 객체 생성을 막기 위한 private constructor
private DayOfWeekUtilClass() {
throw new IllegalStateException("This is util class");
}
}
- interface
// bad practice. do not use this pattern.
public interface DayOfWeekInterface {
String MONDAY = "MONDAY";
String TUESDAY = "TUESDAY";
String WEDNESDAY = "WEDNESDAY";
String THURSDAY = "THURSDAY";
String FRIDAY = "FRIDAY";
String SATURDAY = "SATURDAY";
String SUNDAY = "SUNDAY";
}
이 중, 마지막의 '상수로만' 정의된 인터페이스를 작성하는 방법은 매우 안좋은 방법이다(인터페이스에 상수를 정의한 것이 잘못 되었다는게 아니라, 상수로만 이루어진 인터페이스가 잘못 되었다는 것임). Effective Java 에서는 이를 이렇게 설명하고 있다.
인터페이스를 구현하는 클래스를 만들게 되면, 그 인터페이스는 해당 클래스의 객체를 참조할 수 있는 자료형(type) 역할을 하게 된다. 인터페이스를 구현해 클래스를 만든다는 것은, 해당 클래스의 객체로 어떤 일을 할 수 있는지 클라이언트에게 알리는 행위다. 다른 목적으로 인터페이스를 정의하고 사용하는 거은 적절치 못하다.
- Effective Java 2/E. Rule 19. 인터페이스는 자료형을 정의할 때만 사용하라.
해당 챕터에서 더 다양하게 설명하고 있지만 요약하자면, 상수를 정의하는 것은 인터페이스의 역할이 아니다. 만약 상수가 해당 클래스에 강하게 묶여 있다면 (강하게 묶여있는)해당 클래스나 인터페이스에 추가하거나 enum에 정의해서 추가하거나 객체생성이 불가능한 유틸클래스로 만들어야 한다.
'Dev > Java' 카테고리의 다른 글
[short-note] Spring Webflux: Webclient SOCKS5 Proxy setting with Auth(ID/PW) (0) | 2023.02.06 |
---|---|
조건이 복잡한 IF/ELSE-IF 문 리팩토링 (1) | 2023.01.06 |
[Spring] 같은 계층의 N개의 의존성 리팩토링 (0) | 2022.10.11 |
enum 의 활용(2) - method 추가 (0) | 2022.09.22 |
enum 의 활용(1) - 상수에 value 추가 (1) | 2022.09.19 |