enum이란?

💡 enum이란 enumerated type의 줄임말로 열거형이라고 부르기도 하는데, 컴퓨터 프로그래밍에서 열거형(enumerated type, enumeration)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다.

이해하기 쉽게 말하자면, ‘고정된 상수들의 집합’이라고 볼 수 있겠다.
(boolean 자료형의 false와 true도 값이 미리 정의된 열거형이라고 볼 수 있다는 점!)

01. enum 클래스 구성

public enum Company {
	// 필드
	SK("에스케이"),
	LG("엘쥐"),
	KT("케이티"),
	SAMSUNG("삼성"),
	APPLE("애플");
    
	// 변수
	private final String value;
    
	// 생성자
	Company(String value) {
		this.value = value;
	}
    
	// 메소드
	public Stirng getValue() {
		return value;
	}
}
  1. 필드(열거형 상수)
    1. ,로 연결
    2. 대문자로 정의
    3. ()안에 상수의 값 입력
      (primitive 타입, reference 타입 가능, 심지어 메소드도 정의할 수 있음)
  2. 변수
    1. 매개변수로 들어온 값을 저장하는 변수도 선언해줄 수 있다.
  3. 생성자
    1. private 접근제한자여야 함, 따로 적지 않아도 묵시적으로 private임.
      (enum은 런타임이 아닌 컴파일 타임에 고정되어야 함. 따라서 컴파일 시 안정성을 보장하기 위해 private 생성자만 사용 가능하며 다른 패키지나 클래스에서 enum타입에 접근해서 동적을 값 지정 불가함.)
  4. 메소드
    1. valueOf(String arg)
    1. String 값을 enum에서 가져온다.
    값이 없으면 Exception 발생
    2. valueOf(Class class, String arg)
    1. 넘겨받은 class에서 String을 찾아, enum에서 가져온다.
    valueOf(String arg)는 내부적으로 자기 자신의 class를 가져오는 것이다.
    2. ex. Direction direction = Direction.valueOf(”WEST”);
    → direction 변수에 WEST의 값이 담겼다.
    3. values()
    1. enum의 요소들을 순서대로 enum타입의 배열로 리턴한다.
    ENUM$VALUES의 카피이므로, 너무 자주 호출하는 것은 좋지 않음
    2. ex. Direction[] arr = Direction.values();
    4. name()
    1. 호출된 값의 이름을 String으로 리턴한다.
    5. ordinal()
    1. 해당 값이 enum에 정의된 순서를 리턴한다. (index 값 리턴)
    6. compareTo(E o)
    1. 이 enum과 지정된 객체의 순서를 비교한다.
    지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수를 반환한다.
    7. equals(Object other)
    1. 지정된 객체가 이 enum 정수와 같은 경우, true를 반환한다.
    8. toString()
    1. 해당 상수의 이름을 문자열로 반환한다.
    name() 메소드와 같은 값을 반환하며, name()은 final로 선언된 메소드라 오버라이딩이 불가능하지만 toString()은 일반적인 Object 클래스의 메소드로 오버라이딩이 가능하다는 점에서 차이점이 있다.


02. 빠른 성능

열거형 상수간의 비교는 ==을 사용할 수 있다. equals()가 아닌 ==로 비교가 가능하다는 것은 그만큼 빠른 성능을 제공한다는 이야기이다. 하지만 <>와 같은 비교 연산자는 사용할 수 없지만 compareTo()는 사용이 가능하다.

03. enum의 활용

아래와 같이 enum 클래스가 정의되어 있다고 생각해보자.

public enum Company {
	// 필드
	SK("에스케이"),
	LG("엘쥐"),
	KT("케이티"),
	SAMSUNG("삼성"),
	APPLE("애플");
  
	// 변수
	private final String value;
  
	// 생성자
	Company(String value) {
		this.value = value;
	}
  
	// 메소드
	public Stirng getValue() {
		return value;
	}
}

TestEnum 클래스에서 for문을 사용한 예제이다.

public class TestEnum {
	public static void main(String[] args) {
  
		for(Company type : Company.values()) {
			System.out.println(type.getValue());
			// 에스케이, 엘쥐, 케이티, 삼성, 애플
		}
  
		System.out.println(Company.APPLE.getValue()); // 애플
	}
}

👉🏻 values() : enum에 선언된 상수 전부를 가져온다.

public class TestEnum {
	public static void main(String[] args) {
  
		for(Company type : Company.values()) {
			System.out.println(type);
			// SK, LG, KT, SAMSUNG, APPLE
		}
  
		System.out.println(Company.APPLE.ordinal()); // 4
	}
}

👉🏻 ordinal() : 해당 상수의 index 값을 출력한다.


TestEnum 클래스에서 switch문을 사용한 예제이다.

public class TestEnum {
  
	enum Company {SK, LG, KT, SAMSUNG, APPLE}
  
	public static void main(String[] args) {
		int test = 1;
  
		if(test == 1) {
			switchFt(Company.SAMSUNG);
		}
	}
  
	public static void switchFt(Company company) {
		switch(company) {
		case SK :
			System.out.println("SK입니다.");
			break;
		case LG :
			System.out.println("LG입니다.");
			break;
		case KT :
			System.out.println("KT입니다.");
			break;
		case SAMSUNG :
			System.out.println("SAMSUNG입니다.");
			break;
		case APPLE :
			System.out.println("APPLE입니다.");
			break;
		}
	}
}

👉🏻 switch 문에 열거형을 사용할 땐 case문에 열거형 타입의 이름은 적지 않고 상수의 이름만 적어야 한다는 제약이 있다.

04. 상수와 enum

상수를 효과적으로 쓰기 위해 enum 사용
https://opentutorials.org/module/516/6091

05. enum과 싱글톤

p.196의 아래를 보자.

위를 보게 되면 enum 클래스 객체를 만드는 방법은 getInstance() 메소드다.
어디서 많이 본 패턴! 바로 싱글톤!
싱글톤을 가장 잘 만드는 방법이 enum!

https://velog.io/@mooh2jj/멀티스레드환경에서의-싱글톤-객체-그리고-enum




참고

https://mine-it-record.tistory.com/204
https://eatnows.tistory.com/91
https://velog.io/@yongseok0419/상수-Constant-와-열거형-Enum#:~:text=· 변수와 마찬가지로 데이터를,는 대문자로 사용한다.
https://opentutorials.org/module/516/6091
https://velog.io/@mooh2jj/멀티스레드환경에서의-싱글톤-객체-그리고-enum

profile
불타오르는 진루나

0개의 댓글