JAVA

[JAVA] enum(열거 타입, 사용하기, 사용하는 이유)

정공자씨 2024. 4. 24. 12:26

 

 

Enum(Enumeration)
- 열거형
- 값들의 집합을 이루는 자료형

 

enum(열거 타입)

정의

  • 서로 연관된 상수들의 집합
  • 상수만을 다루는 enum 타입의 클래스를 만든 것
  • 상수를 단순하게 정수로 취급하지 말고, 클래스로 객체화하여 관리하자는 취지

 

enum을 사용하는 이유

  1. 허용 가능한 값을 제한
  2. 수정 시 변경 범위가 최소화(enum만 수정하면 됨)
  3. 컴파일 시 데이터 타입 및 유효성을 체크할 수 있음
  4. 코드가 단순해지고 가독성이 좋아짐
  5. 인스턴스의 생성과 상속을 방지하여 상수값의 안전성이 보장
/* 상수를 여러개 쓰기 불편
 public static final String SUN = "SUN"
 public static final String MON = "MON"
 public static final String TUE = "TUE"
 public static final String WED = "WED"
 public static final String THU = "THU"
 public static final String FRI = "FRI"
 public static final String SAT = "SAT"
 */

// 상수를 관리하기 편함
public enum Day {
    SUN, MON, TUE, WED, THU, FRI, SAT
}

 

특징

  • enum은 인터페이스처럼 독립된 특수한 클래스로 구분
    • 즉, enum객체로 구분하여, 참조(reference) 타입임
    • enum의 상수값은 heap area(힙 영역)에 저장됨

 

 

 

 

enum의 문법

1. enum 선언 형식

접근제한자 enum enum클래스명 {  
	상수, 상수, 상수;     // 콤마(,)로 열거
}
  • 일반 클래스와 똑같이 .java 확장자를 가지고
  • class 키워드 대신에 enum 키워드로 정의
  • 구현 블록 안에 상수를 콤마(,)로 구분해서 나열
  • 상수는 모두 대문자로 작성
// Coffee.java 파일
// enum 클래스로 커피종류를 상수화 함
public enum Coffee {  // Enum 클래스
    AMERICANO,
    CAPPUCCINO,
    CAFELATTE
}

 

2. enum은 클래스 외부, 클래스 내부에도 선언할 수 있음

 

1) 클래스 내부

// Cafe.java
public class Cafe { // Cafe 클래스

   // Enum 클래스
   public enum Coffee {
        AMERICANO,
        CAPPUCCINO,
        CAFELATTE
   }    
   
   // main 메서드
   public static void main(String[] args) { }
}

 

2) 클래스 외부

// Coffee.java
public enum Coffee {  // Enum 클래스(enum 객체)
    AMERICANO,
    CAPPUCCINO,
    CAFELATTE
}
// Cafe.java
public class Cafe { // Cafe 클래스 

   // main 메서드
   public static void main(String[] args) { }
}

 

 

3. enum의 객체 생성

1) enum 객체 생성

enum클래스명.상수이름

 

2. enum 객체 생성하여, 참조변수에 담아서 사용

enum클래스명 변수 = enum클래스명.상수이름

 

public class Cafe {
    public static void main(String[] args) {   
    
        //enum클래스명 변수 = enum클래스명.상수명
        Coffee americano = Coffee.AMERICANO
    }	   
}
  • 열거타입의 변수(americano)를 선언해주고,
  • 열거타입.상수명으로 상수에 접근하여, 변수(americano)에 대입하여 사용

 

열거 타입(enum) 변수

1. 열거 타입도 데이터 타입의 일종으로, 변수를 선언하고 대입할 수 있음

Day today = Day.MON;


2. 열거 타입 변수에 null을 저장할 수 있음, 열거 타입은 참조 타입(reference)이기 때문

Day sunday = null;

 

3. 참조 타입의 변수는 객체의 위치값을 참조하는 변수임

 

 

예시

public class EnumTest {
	
    public enum Day {
        SUN, MON, TUE, WED, THU, FRI, SAT
    }

    public static void main(String[] args) {
        Day day = Day.WED;  // 열거타입의 변수를 선언하여, 값을 대입해서 사용

        switch (day) {
        case MON:
            System.out.println("Monday");			
            break;
        case TUE:
            System.out.println("Tuesday");			
            break;
        case WED:
            System.out.println("Wendesday");			
            break;
        case SAT:
            System.out.println("Surprising day");			
            break;
        default:
            break;
        }
    }
}

 

 

 

메모리에 올라가는 열거 타입

  • 열거타입(enum)은 일종의 클래스
  • 상수 1개당 인스턴스 1개를 만들어서 public static final 필드로 공개
  • 열거 타입의 인스턴스는 사용자가 직접 생성할 수 없고, 인스턴스는 실행 시에 1번만 생성
    • singleton 보장할 때 사용

  • method area에는 클래스와 클래스 변수(static 변수)가 저장
    • 따라서, 열거 타입인 클래스도 이 메소드 영역에 올라감
  • heap area에는 객체 인스턴스가 올라감

 

[ enum ]

1. 클래스처럼 보이게 하는 상수
2. 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의하는 것
3. Enum 클래스 형을 기반으로 한 클래스형 선언 

 

 

 

 

 

 

 

출처

 

https://hudi.blog/java-enum/

https://limkydev.tistory.com/66

 

https://rachel0115.tistory.com/entry/Java-%EC%97%B4%EA%B1%B0%ED%98%95-%ED%81%B4%EB%9E%98%EC%8A%A4-Enum

 

 

https://codingwell.tistory.com/77