WY J
학습 공간
WY J
  • 분류 전체보기 (95)
    • Java (38)
      • 알고리즘 (5)
      • 자료구조 (4)
      • 기초 (9)
      • OOP (10)
      • Collection (3)
      • Effective (5)
      • reator (2)
    • HTML&CSS (5)
    • macOS (3)
    • Git (5)
    • Network (5)
    • MySQL (2)
    • Spring Boot (31)
      • Core (5)
      • MVC (15)
      • Security (10)
    • 알고리즘 (1)
    • Cloud (3)
      • AWS (3)
    • Docker (1)
    • Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
WY J

학습 공간

Java/Effective

[Java Effective] 열거체(enumeration type)

2022. 7. 18. 18:00

열거체(enumeration type)

 

열거형 사용 배경

// 다른 범주에 속하는 상수를 정의할 때, 상수명이 중복되는 경우가 발생할 수 있다.
public static final int SPRING = 1;
public static final int SUMMER = 2;

public static final int DJANGO  = 1;
public static final int SPRING  = 2; // 계절의 SPRING과 중복

// 인터페이스를 사용하여 상수를 구분할 수 있지만,
interface Seasons {
	int SPRING = 1, SUMMER = 2;
}
interface Frameworks {
	int DJANGO = 1, SPRING = 2;
}

// 의미적으로 서로 비교할 수 없는 개념임에도 에러가 발생하지 않는 타입 안정성의 문제가 생김
if (Seasons.SPRING == Frameworks.SPRING) {...}

// 상수명 중복과 타입 안정성의 문제까지 해결되지만, 사용자 정의 타입이기 때문에 switch문에 사용할 수 없다.
class Seasons {
    public static final Seasons SPRING = new Seasons();
    public static final Seasons SUMMER = new Seasons();
}
class Frameworks {
    public static final Frameworks DJANGO  = new Frameworks();
    public static final Frameworks SPRING  = new Frameworks();
}

 

위처럼 여러 상수를 정의하여 사용할 경우, 문제를 해결하기 위한 방법으로 enum을 사용한다.

타입에 대한 안정성을 보장 받을 수 있고, 중복 상수명을 사용할 수 있으면서도, switch문에서도 사용할 수 있다.

switch의 조건으로는 'char, byte, short, int, Character, Byte, Short, Integer, String 또는 enum'타입만 가능하다.

 

 

switch문에서 enum 사용 예제

enum Seasons { // 자동적으로 0부터 시작하는 정수값이 할당됨
SPRING, // 정수값 0 할당
SUMMER  // 정수값 1 할당
    }

public class Main {
    public static void main(String[] args) {
        Seasons seasons = Seasons.SPRING;
        switch (seasons) {
            case SPRING:
                System.out.println("봄");
                break;
            case SUMMER:
                System.out.println("여름");
                break;
        }
    }
}

//출력: 봄

 

열거형 사용 방법

관례적으로 대문자를 사용하고, 각각의 상수들에는 따로 값을 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당된다.

열거형에 선언된 상수에 접근하는 방법은 static 변수를 참조하는 것과 동일하게 열거형이름.상수명 을 통해서 가능하다.

 

열거형의 메소드

리턴 타입메소드(매개변수) 설명
String name() 열거 객체가 가지고 있는 문자열을 리턴하며, 리턴되는 문자열은 열거타입을 정의할 때 사용한 상수 이름과 동일합니다.
int ordinal() 열거 객체의 순번(0부터 시작)을 리턴합니다.
int compareTo(비교값) 주어진 매개값과 비교해서 순번 차이를 리턴합니다.
열거 타입 valueOf(String name) 주어진 문자열의 열거 객체를 리턴합니다.
열거 배열 values() 모든 열거 객체들을 배열로 리턴합니다.

 

enum Level {
  LOW, // 0
  MEDIUM, // 1
  HIGH // 2
}

public class EnumTest {
    public static void main(String[] args) {
        Level level = Level.MEDIUM;
        // 모든 열거 객체들을 배열로 리턴
        Level[] allLevels = Level.values();
        // for each문으로 배열을 순회하며 정보를 x에 넘겨줌
        for(Level x : allLevels) {
            // 열거 객체가 가지고 있는 문자열과 순번을 출력
            System.out.printf("%s=%d%n", x.name(), x.ordinal());
        }
        // 지정된 열거형에서 이름과 일치하는 열거형 객체를 리턴
        Level findLevel = Level.valueOf("LOW");
        System.out.println(findLevel);
        // 리턴된 상수가 의도했던 상수와 일치하는 지 여부를 불리언 값으로 확인
        System.out.println(Level.LOW == Level.valueOf("LOW"));

        switch(level) {
            case LOW:
                System.out.println("낮은 레벨");
                break;
            case MEDIUM:
                System.out.println("중간 레벨");
                break;
            case HIGH:
                System.out.println("높은 레벨");
                break;
        }
    }
}

//출력값
LOW=0
MEDIUM=1
HIGH=2
LOW
true
중간 레벨

'Java > Effective' 카테고리의 다른 글

[Java Effective] 스레드(Thread)  (0) 2022.07.20
[Java Effective] 스트림(Stream)  (0) 2022.07.19
[Java Effective] 람다식(Lambda Expression)  (0) 2022.07.18
[Java Effective] 애너테이션(Annotation)  (0) 2022.07.18
    'Java/Effective' 카테고리의 다른 글
    • [Java Effective] 스레드(Thread)
    • [Java Effective] 스트림(Stream)
    • [Java Effective] 람다식(Lambda Expression)
    • [Java Effective] 애너테이션(Annotation)
    WY J
    WY J

    티스토리툴바