-
[Java] 자바 Enum이란?Java 2022. 1. 1. 12:11728x90
Enum이란?
Enumeration의 앞의 4글자를 따서 Enum이라고 부르며 열거라는 의미를 가집니다.
JEK 1.5부터 관련이 있는 상수들의 집합을 사용할 때 사용합니다.
상수의 값 뿐만아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있습니다.
기존에 상수를 정의하는 방법은 아래와 같았습니다.
public static final string MALE = "MALE"; public static final string FEMALE = "FEMALE";
그러면 왜 Enum이란게 생겨나게 되었고 사용할까요?
런타임에서 발생할 수 있는 에러를 컴파일 단계에서 차단할 수 있음.(typesafe enum)
String gender; gender = MALE; gender = "strangeValue"
우리의 목적은 gender라는 변수에 성별의 정보를 담고 싶었습니다.
하지만 gender는 String 타입의 변수이고 이때 "strangeValue"라는 이상한 값이 들어가게 되어도 우리가 기대하는 값이 할당되었는지에 대한 유효성을 검사하는 로직이 없습니다.
하지만 자바입장에서는 String 타입에 String 변수가 들어왔으니 이상하지 않습니다.
따라서 엉뚱한 결과값을 얻을 수 있습니다.
이제 Enum을 사용해보겠습니다.
public class EnumTest { public enum Gender{ MALE,FEMALE } public static void main(String[] args) { Gender gender = Gender.MALE; System.out.println(gender.toString()); //MALE 출력됨 gender = "strangeValue"; //Type mismatch 에러 발생! } }
gender변수는 Gender 타입의 변수가 되었습니다.
따라서 string 타입의 이상한 값이 들어오게 된다면 타입 에러가 발생하게 됩니다.
Enum의 사용법
enum 열거형이름 {상수명1, 상수명2, ...}
동서남북 4방향을 상수로 정의하는 열거형 Direction을 만들어 보겠습니다.
enum Direction {EAST, SOUTH, WEST, NORTH }
열거형에 정의된 상수의 사용법 '열거형이름.상수명'
Direction dir = Direction.EAST;
열거형의 비교( '==' 연산자 사용 가능, 비교 연산자는 사용 불가능)
dir==Direction.EAST // true dir > Direction.WEST // error 발생 dir.compareTo(Direction.WEST) > 0 //compareTo ()는 사용가능
열거형을 비교하기 위해서는 '==' 또는 compareTo()를 사용해야 합니다.
'<', '>'와 같은 비교연산자는 사용할 수 없습니다.
compareTo()는 두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환합니다.
열거형에 추가 속성 부여하기
enum Direction{ EAST(1,">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4, "^"); private final int value; private final String symbol; Direction(int value, String symbol){ //접근제어자 private 생략됨 this.value = value; this.symbol = symbol; } public int getValue() {return value;} public String getSymbol() {return symbol;} }
위와 같이 열거형에 여러 값을 지정할 수 있습니다.
다만 그에 맞게 인스턴스 변수와 생성자를 새로 추가해야 합니다.
enum의 생성자는 제어자가 묵시적으로 private입니다.
enum은 컴파일 때 모든 값을 알아야 하고, 런타임 때 동적으로 어떤 값을 정해줄 수 없습니다.
그렇기 때문에 new를 사용할 수 없고 public으로 접근해서도 안되니 private 생성자가 사용됩니다.
Enum의 특징
상속을 지원하지 않음
모든 enum들은 내부적으로 java.lang.enum 클래스에 의해 상속되며, 자바는 다중 상속을 지원하지 않기 때문에 Enum은
다른 클래스를 상속받을 수 없습니다.
열거형으로 선언된 순서에 따라 0부터 index 값을 가진다.(순차적으로 증가)
클래스 변수와 마찬가지로 바로 사용이 가능하다.
생성자가 있을 수 있는데 앞에 private만 쓸 수 있고 생략 가능하다.
출처
자바의 정석 3rd Edition(남궁 성)
https://limkydev.tistory.com/50
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Enum.html
https://sjh836.tistory.com/134
https://velog.io/@kyle/%EC%9E%90%EB%B0%94-Enum-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9
https://velog.io/@im_joonchul/%EC%97%B4%EA%B1%B0%ED%98%95-Enumeration
728x90'Java' 카테고리의 다른 글
[Java] 상속(Inheritance)이란? (0) 2022.01.06 [Java] 오버로딩(Overloading)이란? (0) 2022.01.05 [Java] 제네릭/지네릭스(Generics)란? (0) 2021.12.30 [Java] 어노테이션(Annotation) (0) 2021.12.20 [Java] 인터페이스(Interface) (0) 2021.12.16