Enum(Enumeration)
- 열거형
- 값들의 집합을 이루는 자료형
enum(열거 타입)
정의
- 서로 연관된 상수들의 집합
- 상수만을 다루는 enum 타입의 클래스를 만든 것
- 상수를 단순하게 정수로 취급하지 말고, 클래스로 객체화하여 관리하자는 취지
enum을 사용하는 이유
- 허용 가능한 값을 제한
- 수정 시 변경 범위가 최소화(enum만 수정하면 됨)
- 컴파일 시 데이터 타입 및 유효성을 체크할 수 있음
- 코드가 단순해지고 가독성이 좋아짐
- 인스턴스의 생성과 상속을 방지하여 상수값의 안전성이 보장
/* 상수를 여러개 쓰기 불편
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://limkydev.tistory.com/66
'JAVA' 카테고리의 다른 글
[JAVA] 에러와 예외, 예외의 종류 (0) | 2024.04.24 |
---|---|
[JAVA] 예외처리: try-catch문, finally문 (0) | 2024.04.24 |
[JAVA] Object.equals()와 String.equals(), ==연산자 (0) | 2024.04.24 |
[JAVA] StringBuffer클래스, StringBuilder클래스 (0) | 2024.04.24 |
[JAVA] 값 복사하기 : object클래스의 clone() 메서드 (0) | 2024.04.24 |