코딩항해기

[JAVA] Enum 본문

JAVA

[JAVA] Enum

miniBcake 2024. 9. 28. 11:27

 
 

Enum 열거형 (Enumeration)

일련된 고정된 값(상수)를 나타내기 위한 특별한 데이터 유형이다.
기본적으로 Enum에 열거된 상수들은 추가적인 객체 생성 없이 외부에서 사용가능하고, 불변이기에 상수 앞에 아무것도 붙지 않지만  public static final이 생략되어있다. 그리고 상수이기 때문에 대문자로 적는 것을 원칙으로 한다.
 
장점으로는 허용 가능한 값을 제한할 수 있고, 수정 시 Enum만 수정하면 되기 때문에 변경 범위가 최소화된다. 컴파일 시 데이터 타입 및 유효성 체크가 가능하며 코드가 단순해지고 가독성이 좋아진다. 인스턴스의 생성과 상속을 방지하여 상수의 안전성이 보장된다.
 
 

Enum 예시

public enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
}

 
열거 시에는 콤마로, 끝날 시에는 세미콜론으로 마무리하며 생성자를 만들 수도 있다.
이를 사용할 때는 Enum명.상수명으로 사용할 수 있다.

public class Week {
    public static void main(String[] args) {
        Day day1 = Day.FRIDAY;
        System.out.println(day1);
    }
}
//출력 : FRIDAY

 
 

Enum기본 메서드

메소드설명리턴 타입
name()열거 객체의 문자열을 리턴String
ordinal()열거 객체의 순번(0부터 시작)을 리턴int
compareTo()열거 객체를 비교해서 순번 차이를 리턴 (빠르면 음수, 느리면 양수)int
valueOf(String name)문자열을 입력받아서 일치하는 열거 객체를 리턴enum
values()모든 열거 객체들을 배열로 리턴enum[]

 
Enum에서는 Object 클래스 메서드 중 4가지 메서드를 오버라이딩 할 수 없도록 final처리 되어 있는데, Enum은 고유한 상수이기 때문에 해당 메서드를 오버라이딩해버리면 고유성이 깨지기 때문이다.

final 메소드내용
clone()객체를 복제하기 위한 메소드
하지만, 이 메소드는 enum 클래스에서 사용불가
만약 호출될 경우엔 CloneNotSupportedException 이라는 예외 발생
finalize()GC가 발생할 때 처리하기 위한 메소드
hashCode()int 타입의 해시 코드 값을 리턴하는 메소드
equals()두 개의 객체가 동일한지를 확인하는 메소드

 
 
 

Enum 매핑

Enum에서 상수를 가져올 때 상수의 고유한 값을 출력하게 만들고 싶을 때는 Enum을 매핑할 수 있다.

public enum Day {
    SUNDAY("일요일"),
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일");
    
    //문자열을 저장할 필드
    private String dayName;
    
    //생성자
    private Day(String dayName){
    	this.dayName = dayName;
    }
    
    //Getter
    public String getDayName(){
    	retrun dayName;
    }
}
syso(Day.MONDAY.name());
syso(Day.MOMDAY.getDayName());

//출력
//MONDAY
//월요일

 
생성자를 이용하는 것으로 MONDAY("월요일") 에서 매개변수로 들어가는 문자열이 생성자의 인자로 들어가 필드에 담기게 되어 getter를 통해 불러와지는 것이다. 생성자가 여러 개의 매개변수를 받는다면 여러 개를 넣을 수 있다.
 
이러한 이용이 가능한 것은 Enum 상수 하나 당 자신의 인스턴스를 하나씩 만들어 필드로 공개하기 때문이다.
생략된 부분을 추가하면 public static final Day MONDAY = new Day("월요일"); 과 같은 형태가 된다.
 
매핑을 이용해 데이터를 그룹화 및 관리를 용이하게 할 수 있다. 
ex. SHINHAN("신한", Arrays.asList("Mr.Life 카드", "Deep Dream 카드", "Deep Oil 카드"))
 
 

Enum 확장

enum Operation {
    PLUS("+") {
   //정의된 메서드
        public double apply(double x, double y) {
            return x + y;
        }
    },
    MINUS("-") {
        public double apply(double x, double y) {
            return x - y;
        }
    },
    MULTI("*") {
        public double apply(double x, double y) {
            return x * y;
        }
    },
    DIVIDE("/") {
        public double apply(double x, double y) {
            return x / y;
        }
    };

    // 클래스 생성자와 멤버
    private final String symbol;
    Operation(String symbol) {
        this.symbol = symbol;
    }

    // toString을 재정의하여 열거 객체의 매핑된 문자열을 반환하도록
    @Override
    public String toString() {
        return symbol;
    }

    // 열거 객체의 메소드에 사용될 추상 메소드 정의
    public abstract double apply(double x, double y);
}

 
enum의 매핑 기능을 확장하면 상수 메서드로도 이용이 가능하다. 별도의 추상 메서드를 선언하면 생성자 외에도 메서드 정의까지 가능해진다. 각 상수마다 다른 역할을 하는 메서드를 갖게 되는 것이다. 이 방법은 상태와 행위를 한 곳에서 관리할 수 있어 용이하다.
 
람다식을 적용해 코드를 더욱 깔끔하게 적용할 수 있다.

// 함수형 인터페이스 임포트
import java.util.function.DoubleBinaryOperator;

enum Operation {
    PLUS("+", (x, y) -> x + y),
    MINUS("-", (x, y) -> x - y),
    TIMES("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);

    private final DoubleBinaryOperator op; // 람다식을 저장할 필드

    private final String symbol;

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    @Override
    public String toString() { return symbol; }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}

 
 
 
참고 사이트 : https://inpa.tistory.com/entry/...

'JAVA' 카테고리의 다른 글

[JAVA] 쿠키 Cookie  (0) 2024.10.12
[JAVA] 파라미터 전달해 main() 실행 (String[] args / eclipse, intellij)  (0) 2024.10.01
[JAVA] StringBuilder  (0) 2024.09.10
[JAVA] POJO  (0) 2024.08.21
[JAVA] 파일 입출력  (0) 2024.07.29