enum

심야·2022년 9월 22일
0

웹 개발

목록 보기
15/47

enum

클래스가 상수 만으로 만들어져 있을 경우에는 class라고 선언하는 부분에 enum이라고 선언하면 "이 객체는 상수의 집합이다"라는 것을 명시적으로 나타낼 수 있다.

	enum Day
    {
    	MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
    }
    enum Month
    {
    	JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
    }
    
	public class EnumExample{
    	public static void main(String[] args)
        {
        	Day day = Day.MONDAY;
            
            switch(day)
            {
           		case MONDAY:
                	System.out.println("월요일입니다.");
                    break;
                case TUESDAY:
                	System.out.println("화요일입니다.");
                    break;
                case WEDNESDAY:
                	System.out.println("수요일입니다.");
                    break;
                    
                    //생략..
        }
    

Enum을 사용하는 이유

  • 코드가 단순해지며 가독성이 좋아진다.
  • 인스턴스 생성과 상속을 방지한다.
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낸다.

enum과 생성자

  1. enum 클래스 원소에 추가 속성 부여
    enum의 각 열거형 상수에 추가 속성을 부여할 수 있다. 아래 코드와 같이 Left, Right을 나타내는 상수에 krName 속성을 추가한다.

    public enum RoadSide
    {
    	Left("왼쪽")
        Right("오른쪽")
        
        private String krName;
        
        private RoadSide()
        {}
        
        private RoadSide(String krName)
        {
        	this.krName = krName;
        }
        
        public String getKrName()
        {
        	return krName;
        }
    }

    getter method로 krName 속성을 필요할 때에 가져다 쓸 수 있다. 이처럼 메소드나 필드를 enum타입에 추가하면 enum 상수에 데이터를 연관시킬 수 있다.

  2. enum 생성자는 왜 private인가?
    enum 타입은 열거형을 의미하는 클래스이다. 따라서 일반 클래스처럼 생성자가 있어야 한다. 그런데 enum은 다른 클래스들과 달리 생성자의 접근 제어자를 private만 허용한다. public, protected로 하게되면 아래와 같은 에러가 발생한다.

    enum 타입은 고정된 상수들의 집합으로써 런타임이 아닌 컴파일타임에 모든 값을 알아야 한다. 즉, 다른 패키지나 클래스에서 enum타입에 접근해서 동적으로 값을 정해줄 수 없다. 따라서 컴파일 시에 타입안정성이 보장되며 생성자의 접근제어자를 private으로 사용하는 것이다. 만약에 생성자가 private이 아니라 public이면 누구든지 instance를 생성해 잘못된 값을 추가할 수 있다. 다시 말하지만 enum 타입은 고정된 상수들의 집합이다. 접근제어자를 private으로 설정했기 때문에 외부에서 접근 가능한 생성자가 없다. 그래서 enum 타입은 final과 다름이 없다. 그리고 enum 클래스 외부에서나 내부에서나 enum의 인스턴스를 생성할 수 없고 상속을 받을 수도 없다. 선언된 enum 상수만 존재할 뿐이다. private 제어자로 인해 인스턴스 생성을 제어하는 enum 특성은 싱글톤의 성질을 갖게된다.

enum 활용

if문 사용 줄이기

public enum PowerSwitch {
    ON("켜짐"),
    OFF("꺼짐");

    private String krName;

    private PowerSwitch() {
        // constructor
    }

    private PowerSwitch(String krName) {
        this.krName = krName;
    }

    public String getKrName() {
        return krName;
    }

    public PowerSwitch opposite() {
        if (this == PowerSwitch.ON) {
            return PowerSwitch.OFF;
        } else {
            return PowerSwitch.ON;
        }
    }

}

아래 코드를 보면 직접 powerSwitch 변수에 ON 상수를 할당한다. 그리고 Switch 변수로 opposite()메소드를 호출하면 OFF상수를 반환한다. oppposite()메소드가 없다면 if 구문을 사용해 powerSwitch 변수에 있는 값을 확인해야 한다. 하지만 opposite()메소드를 호출해 한 번에 확인이 가능하다. 그리고 displayByPowerSwitch() 메소드로 ON 또는 OFF에 따른 작업을 수행한다. enum 덕분에 메인 메소드에서는 if문을 사용하지 않고 간단하게 ON/OFF 작업을 구현할 수 있다.

public class PowerSwitchMan {
    public static void main(String[] args) {
        PowerSwitch powerSwitch = PowerSwitch.ON;
        displayByPowerSwitch(powerSwitch.opposite());
    }

    public static void displayByPowerSwitch(PowerSwitch powerSwitch) {
        if (powerSwitch == PowerSwitch.ON) {
            System.out.println("전원을 ON 합니다.");
        } else {
            System.out.println("전원을 OFF 합니다.");
        }

    }
}
profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글