JAVA - Enum 클래스

 


 

1. Enum

 

1.1. Enum의 정의

 Enum은 "열거형 타입"을 의미하며, Java에서 서로 연관된 상수들의 집합을 정의하기 위해 사용됩니다. Enum은 특정 값들만 가질 수 있도록 제한된 데이터 타입을 제공하여 코드를 간결하게 만듭니다.

  • 타입 안정성 제공: Enum은 컴파일 타임에 값이 결정되며, 허용되지 않은 값이 할당되는 것을 방지합니다.
  • 상수 그룹화: 관련 있는 상수들을 하나의 타입으로 묶어 표현합니다.
  • 객체 지향적 설계: 필드와 메서드를 추가하여 응집도를 높이고, 상수와 관련된 데이터 및 동작을 한곳에 모아 표현할 수 있습니다.

- 간단한 예시

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

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.FRIDAY; // Day 타입만 할당 가능
    }
}
  • Day는 MONDAY에서 SUNDAY까지 7개의 고정된 값만 가질 수 있는 타입이 됩니다.
  • Enum은 class와 유사하지만 변경할 수 없는 상수 집합이라는 점에서 다릅니다.

 

 

1.2. Enum 사용목적

 

1) 코드의 명확성과 가독성 향상

Enum을 사용하면 상수 값의 의미를 명확히 표현할 수 있습니다. 기존에는 상수를 정의하기 위해 static final 상수를 사용했지만, 이는 그룹화가 어려워 관리가 복잡했습니다. Enum은 상수를 하나의 타입으로 묶어주기 때문에, 읽고 이해하기 쉬운 코드를 작성할 수 있습니다.

public class Main {
    // Enum 선언
    public enum Color {
        RED,
        GREEN,
        BLUE;
    }

    public static void main(String[] args) {
        // 현재 색상을 Enum으로 저장
        Color currentColor = Color.RED;

        // 색상 출력
        switch (currentColor) {
            case RED:
                System.out.println("The color is Red");
                break;
            case GREEN:
                System.out.println("The color is Green");
                break;
            case BLUE:
                System.out.println("The color is Blue");
                break;
            default:
                System.out.println("Unknown color");
        }
    }
}

 

2) 타입 안전성 보장
 Enum은 특정 타입으로 제한된 상수 집합을 제공합니다. 잘못된 값(정수, 문자열 등)이 변수에 할당될 위험이 없고, 컴파일 시점에 잘못된 사용을 방지할 수 있습니다.

public class Main {
    // Enum 선언
    public enum Day {
        MONDAY,
        TUESDAY,
        WEDNESDAY;
    }

    public static void main(String[] args) {
        // 현재 요일을 Enum으로 저장
        Day today = Day.MONDAY;

        // 잘못된 값 할당 방지 (컴파일 오류 발생)
        // today = "FRIDAY";  // 오류
        // today = 1;         // 오류

        System.out.println("Today is: " + today);
    }
}

 

3) 확장성과 유지보수 용이
Enum은 상수 외에도 데이터를 포함하거나 메서드를 정의할 수 있어 유연합니다. 새로운 값을 추가하거나 관련 기능을 구현할 때 코드 변경이 쉽습니다.

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

    public boolean isWeekend() {
        return this == SATURDAY || this == SUNDAY; // 주말 여부 확인
    }
}

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.FRIDAY;

        if (today.isWeekend()) {
            System.out.println("It's a weekend!");
        } else {
            System.out.println("It's a weekday.");
        }
    }
}

 

 

2. 기본 문법과 활용

 

2.1. Enum 클래스 정의

 Enum은 enum 키워드를 사용하여 정의하며, 상수는 일반적으로 대문자로 작성합니다.

public class Main {
	public enum Day {
	    MONDAY,
	    TUESDAY,
	    WEDNESDAY,
	    THURSDAY,
	    FRIDAY,
	    SATURDAY,
	    SUNDAY
	}
    
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println("Today is: " + today); // 출력: Today is: MONDAY
    }
}

 

2.2. Enum과 Switch

 Enum은 힙 영역에 단일 객체로 저장되며, Enum 상수는 모두 참조 타입으로 동일한 메모리 주소를 가리키기 때문에 '==' 연산을 사용할 수 있습니다. 이는 switch 문에서 Enum을 비교할 때도 활용됩니다.

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

    public static void main(String[] args) {
        Day today = Day.MONDAY;

        switch (today) {
            case Day.MONDAY:
                System.out.println("Start of the work week.");
                break;
            case Day.FRIDAY:
                System.out.println("It's almost the weekend!");
                break;
            case Day.SATURDAY:
            case Day.SUNDAY:
                System.out.println("It's the weekend. Relax!");
                break;
            default:
                System.out.println("Midweek hustle.");
        }
    }
}

 

2.3. Enum에서 정의된 메소드들

 

1) name

 

  • 기능: 열거 객체의 이름(문자열)을 반환합니다.
  • 리턴 타입: String

 

public enum Color {
    RED, GREEN, BLUE
}

public class Main {
    public static void main(String[] args) {
        Color color = Color.RED;
        System.out.println(color.name()); // 출력: RED
    }
}

 

2. ordinal

  • 기능: 열거 객체의 선언 순서를 반환합니다(0부터 시작).
  • 리턴 타입: int
public enum Color {
    RED, GREEN, BLUE
}

public class Main {
    public static void main(String[] args) {
        Color color = Color.GREEN;
        System.out.println(color.ordinal()); // 출력: 1
    }
}

 

3. compareTo()

  • 기능: 열거 객체의 순서를 비교하여 차이를 반환합니다.
  • 리턴 타입: int
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY
}

public class Main {
    public static void main(String[] args) {
        Day day1 = Day.MONDAY;
        Day day2 = Day.WEDNESDAY;
        System.out.println(day1.compareTo(day2)); // 출력: -2 (MONDAY - WEDNESDAY)
    }
}

 

4. valueOf(String name)

  • 기능: 문자열을 입력받아 해당 이름의 열거 객체를 반환합니다. (대소문자 구분)
  • 리턴 타입: enum
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY
}

public class Main {
    public static void main(String[] args) {
        Day day = Day.valueOf("MONDAY");
        System.out.println(day); // 출력: MONDAY
    }
}

 

5. values()

  • 기능: 모든 열거 객체를 배열로 반환합니다.
  • 리턴 타입: enum[]
public enum Color {
    RED, GREEN, BLUE
}

public class Main {
    public static void main(String[] args) {
        for (Color color : Color.values()) {
            System.out.println(color);
        }
        // 출력:
        // RED
        // GREEN
        // BLUE
    }
}

 

 

3. Enum 활용

 

4.1. Enum 생성자

 Enum을 활용하여 특정 값이나 연관된 데이터와 매핑할 수 있습니다. enum을 매핑할 때에는 Map을 사용하여 매핑 관계를 관리하거나, enum 자체에 추가적인 메서드를 정의하여 처리할 수 있습니다.

public enum Day {
    MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);

    private final int dayNumber;

    // 생성자
    Day(int dayNumber) {
        this.dayNumber = dayNumber;
    }

    // Getter 메서드
    public int getDayNumber() {
        return dayNumber;
    }
}

public class Main {
    public static void main(String[] args) {
        // Enum을 사용하여 숫자와 요일을 매핑
        Day day = Day.WEDNESDAY;
        System.out.println("The day number of " + day + " is: " + day.getDayNumber());
    }
}

 

위와 같이 사용할 수 있는 이유는 enum은 각 상수마다 고유한 인스턴스를 생성하여 자동으로 public static final로 관리됩니다. 이로 인해 상수 값들이 자신의 인스턴스를 생성하고, 매핑을 통해 고유한 데이터를 다룰 수 있습니다.

//Enum 쓰기 전
public class Day {
    public static final Day MONDAY = new Day(1);
    public static final Day TUESDAY = new Day(2);
    public static final Day WEDNESDAY = new Day(3);
    public static final Day THURSDAY = new Day(4);
    public static final Day FRIDAY = new Day(5);
    public static final Day SATURDAY = new Day(6);
    public static final Day SUNDAY = new Day(7);

    private final int dayNumber;

    // 생성자
    private Day(int dayNumber) {
        this.dayNumber = dayNumber;
    }

    // Getter 메서드
    public int getDayNumber() {
        return dayNumber;
    }
}

 

Enum 생성자에는 여러 개의 값을 매핑할 수 있습니다.

public enum Day {
    MONDAY(1, "Start of the week", "Workday"),
    TUESDAY(2, "Second day", "Workday"),
    WEDNESDAY(3, "Mid week", "Workday"),
    THURSDAY(4, "Almost weekend", "Workday"),
    FRIDAY(5, "Last workday", "Workday"),
    SATURDAY(6, "Weekend", "Rest"),
    SUNDAY(7, "End of the week", "Rest");

    private final int dayNumber;
    private final String description;
    private final String type;

    // 생성자
    Day(int dayNumber, String description, String type) {
        this.dayNumber = dayNumber;
        this.description = description;
        this.type = type;
    }

    // Getter 메서드
    public int getDayNumber() {
        return dayNumber;
    }

    public String getDescription() {
        return description;
    }

    public String getType() {
        return type;
    }
}

public class Main {
    public static void main(String[] args) {
        // 예시: WEDNESDAY에 대해 여러 정보 출력
        Day day = Day.WEDNESDAY;
        System.out.println(day + ": " + day.getDayNumber() + ", " + day.getDescription() + ", " + day.getType());
    }
}

 


https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC

 

https://techblog.woowahan.com/2527

 

Java Enum 활용기 | 우아한형제들 기술블로그

안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 Enum에 관해

techblog.woowahan.com

'컴퓨터 > JAVA' 카테고리의 다른 글

JPA - 영속성 컨텍스트(Persistence Context)  (0) 2024.11.23
JAVA - 일급 컬렉션(First-Class Collection)  (0) 2024.10.31
JUnit5 기초  (0) 2024.10.24
객체지향 - SOLID(객체 지향 설계)  (0) 2024.10.05
JAVA - Generic(제너릭)  (0) 2024.09.30