본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 11주차 과제: Enum

by 읽고 쓰는 개발자 2021. 2. 24.

github.com/whiteship/live-study/issues/11

 

11주차 과제: Enum · Issue #11 · whiteship/live-study

목표 자바의 열거형에 대해 학습하세요. 학습할 것 (필수) enum 정의하는 방법 enum이 제공하는 메소드 (values()와 valueOf()) java.lang.Enum EnumSet 마감일시 2021년 1월 30일 토요일 오후 1시까지.

github.com

목표

자바의 열거형에 대해 학습하세요.

학습할 것 (필수)

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

출처 : https://www.javatpoint.com/enum-in-java

1. enum 정의하는 방법

열거 타입(enum) : 한정된 값만을 갖는 데이터 타입. 몇 개의 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 데이터 타입.

열거 타입 선언 : 관례적으로 첫 문자를 대문자로, 나머지는 소문자로 구성 (클래스와 동일한 명명규칙)

public enum 열거타입이름 {
	// 열거 상수 : 관례적으로 모두 대문자로 선언
}

열거 타입 변수 : 열거 상수 중 선택 (참조 타입이기 때문에 null 값 저장 가능)

열거 타입 변수 = 열거타입.열거상수;

열거 상수도 객체. 메소드 영역에서 열거 객체(heap영역)을 참조! 

 

  • 열거 타입에 생성자, 메소드, 필드 추가 가능
  • 열거의 생성자는 언제나 private ( 생략 가능. but 접근 제한 변경은 컴파일 오류)
  • enum 인스턴스 각각에 메소드 추가 가능.(열거에 정의된 메소드를 Override하는 것이어야 함)
  • 정적 멤버 추가 가능 ( 열거 상수가 정적 멤버보다 먼저 생성되기 때문에, 열거 생성자에서 정적 멤버 참조 불가)

2. enum이 제공하는 메소드 (values()와 valueOf())

리턴 타입 메소드(매개변수) 설명
열거 타입 (번지리턴) valuesOf(String name) 주어진 문자열의 열거 객체를 리턴
열거 배열 ( 열거타입 배열) values() 모든 열거 객체들을 배열로 리턴
Week weekDay = Week.valueOf("SATURDAY");

Week[] days = Week.values();

3. java.lang.Enum

기술적으로 E 열거 타입은 Enum<E>를 확장하며, Enum<E>의 메소드를 상속한다.

 

java.lang.Enum<E> 클래스의 메소드 

메소드 설명
String toString()
String name()
enum 선언에 지정한 대로 인스턴스 이름을 반환한다.
name 메소드는 final이다.
int ordinal() enum 선언에서 인스턴스 위치를 반환한다.
int compareTo(Enum<E> other) 이 인스턴스와 other를 순서 값으로 비교한다.
static T valueOf(Class<T> type, String name) 이름에 해당하는 인스턴스를 반환한다. 이 메소드 대신 열거 타입의 valueOf 또는 values 메소드를 사용한다.
Class<E> getDeclaringClass() 인스턴스를 정의한 클래스를 얻는다(인스턴스에 바디가 있으면 getClass()와 다른 결과를 반환한다).
int hashCode()
protected void finalize()
이 메소드들은 각각 대응하는 Object 메소드를 호출하며, final이다.
protected Object clone() CloneNotSupportedException을 던진다.

 

4. EnumSet

EnumsSet : 열거 타입 상수의 값으로 구성된 집합을 효과적으로 표현해준다. Set 인터페이스를 완벽히 구현하며, type-safe하고, 타 Set 구현체와 함께 사용 가능하다.

class Text2{
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}
    
    // 어떤 Set을 넘겨도 되지만, EnumSet이 가장 좋다.
    public void applyStyles(Set<Style> styles){}
}
//applyStyles에 enumSet 인스턴스를 건네는 클라이언트 코드
text2.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));

출처 : medium.com/lucky-sonnie/item-36-%EB%B9%84%ED%8A%B8-%ED%95%84%EB%93%9C-%EB%8C%80%EC%8B%A0-enumset%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC-4facbb3f0d57

 

[item 36] 비트 필드 대신 EnumSet을 사용하라

열거한 값들이 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 거듭제곱을 할당한 정수 열거 패턴을 사용해왔다.

medium.com

 

 

출처 : 이것이 자바다 (신용권 저), 가장 빨리 만나는 코어 자바9 (카이 호스트만 저), Practical 모던 자바 (장윤기 저)