백엔드 공부 메모/JAVA

열거체, enum 클래스

볼륨조절불가 2024. 4. 27. 14:58
728x90

자바의 enum 클래스

1년에 해당하는 각 월을 데이터로 활용할 때는 1, 2, ..., 12의 값이 필요하고 무지개색을 데이터로 활용할 때는 빨주노초파남보가 필요한 경우처럼, 여러 개의 묶음 데이터를 다룰 때 각 데이터에는 한정된 값만 들어가는 경우가 있다.

 

이처럼 자주 쓰이는 값들을 상수로 정의하고 각 상수를 하나의 집합으로 묶어 편리하게 관리할 수 있는 타입을 열거 타입이라고 하며, 자바에서는 Enum 클래스라는 문법으로 열거 타입을 지원한다.

인터페이스, 어노테이션과 비슷한 맥락으로 사용자가 정의하는 모든 enum 클래스는 java.lang.Enum 클래스를 자동으로 상속하는 특수한 클래스이다.
자바에서 enum이 클래스로 정의되기 때문에, enum에 정의되는 각 상수는 객체 형태로 힙 메모리에 저장된다.
위와 같은 이유로 자바의 enum을 이용하면 상수 데이터 집합을 객체지향적으로 관리할 수 있다.

 

 


 

 

열거체의 장점

  • 열거체 비교시 값(상수)만 비교하지 않고 타입까지 체크
  • 열거체의 상수값이 재정의되더라도 다시 컴파일할 필요 없음
  • 코드 단순화, 가독성 향상
  • switch문에서 사용 가능
  • 정수 상수와 비슷한 성능
    • 열거 타입을 메모리에 올리는 공간과 초기화 시간이 있지만 체감될 정도는 아니라고 함

 

 


 

 

문법

열거체의 문법은 다음과 같다.

enum 열거체이름 {상수1이름, 상수2이름, ...}

 

중괄호 내에 상수 이름들을 배열처럼 나열하는 형식으로 열거체를 정의하면 된다.

 

메소드

모든 메소드는 아니지만, 꼭 알아야 하는 메소드를 정리해 보았다.

  • static Enum[] values()
    • 열거체의 모든 상수를 저장한 배열 생성 후 반환
  • static Enum valueOf(String name)
    • name과 일치하는 열거체 상수 반환
  • String name()
    • 열거체 상수의 이름 반환
  • int ordinal()
    • 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환

enum 클래스 사용 예시

enum Color {
	RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

public class Main {
	public static void main(String[] args) {
        Color c1 = Color.valueOf("GREEN");
        System.out.println("처음 c1의 값: " + c1);
        c1 = Color.INDIGO;
        System.out.println("상수 할당 후 c1의 값: " + c1);
        
        for(Color c : Color.values()) {
            System.out.println("Color 열거체에서 "+ c.ordinal() + "번째로 정의된 상수 : " + c);
        }
    }
}

 

위의 코드 실행 결과

 

 


 

 

자바의 enum 클래스 특징

우리가 열거체를 정의할 때 사용하는 enum 클래스는 무조건 java.lang.Enum 이라는 클래스를 상속한다고 했다.

 

이때 java.lang.Enum도 클래스이므로 Object를 상속한다.

 

그래서 다른 클래스처럼 필드, 메소드, 생성자를 정의할 수도 있고 Object에 정의된 toString(), equals() 등을 사용할 수 있다.

  • 위의 코드에서 println()에 인자로 c1을 전달했을 때 c1에 할당된 상수 이름을 출력할 수 있던 것도 내부에 toString()이 정의되었기 때문이다.
  • toString()의 내부 구현을 보면 Enum의 name 필드를 반환하도록 되어 있다.
    • 위의 예시에서 상수 이름만을 enum 클래스에 정의한 경우, 각 상수 이름이 name 필드에 저장된다.

하지만 몇몇 메소드는 개발자가 재정의하지 못하도록 언어 차원에서 막아두었다.

  • clone(), finalize(), hashCode(), equals() 이 4가지는 개발자가 오버라이딩하지 못한다.
  • enum은 고유한 상수로서 취급되어야 하는데 개발자가 오버라이딩하여 enum 클래스를 정의하면 고유한 상수로서의 성격을 가지지 못할 수도 있기 때문이다.

아래는 enum 클래스에 필드, 생성자, 메소드를 정의하여 상수를 실제 객체처럼 활용하는 예시이다.

enum Color {
    RED("빨강"),
    ORANGE("주황"),
    YELLOW("노랑"),
    GREEN("초록"),
    BLUE("파랑"),
    INDIGO("남색"),
    VIOLET("보라");
        
    private String kor;
    
    // Color 열거체 클래스 내부에서만 호출 가능
    private Color(String kor) {
        this.kor = kor;
    }
    public String getKor() {
        return this.kor;
    }
}

public class Main {
    public static void main(String[] args) {
        Color c1 = Color.RED;
	    System.out.println(c1.getKor());
    }
}

참고한 자료들

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

↑ enum에 대한 깊은 내용을 다뤄 공부하는데 정말 큰 도움이 됐습니다. 제 글을 다 읽은 분들은 이분 글도 꼭 읽어보시길 추천합니다!

 

https://www.tcpschool.com/java/java_api_enum

728x90

'백엔드 공부 메모 > JAVA' 카테고리의 다른 글

[JAVA] HttpURLConnection을 통한 REST 통신  (4) 2024.09.08
Lombok 사용법 간단정리  (0) 2024.03.20