티스토리 뷰

728x90
반응형

목표

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

 

스터디 목차

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

 

 

1. enum 정의하는 방법

 

enum이란?

enumeration의 앞글자로 열거라는 뜻이고 JDK 1.5 부터 관련이 있는 상수들의 집합을 사용할 때 enum을 사용한다.

enum은 완전한 클래스이다. 

 

기존 방식의 문제

  • 한 클래스에 final static으로 다 선언하자니 네임충돌 발생할 수도 있고, 복잡함
  • 인터페이스를 사용하면 위 문제는 해결되나, 타입 안정성이 떨어짐

enum의 장점

  • 코드가 단순해지고, 가독성이 좋아짐
  • enum 키워드를 사용해서 구현의 의도가 열거임을 나타냄
  • 열거체를 비교할 때 실제 값뿐만이 아니라 타입까지도 체크함
  • 열거체의 상숫값이 재정의되더라도 다시 컴파일할 필요없음

 

enum 선언 방법

class 외부. 내부 외에 열거 타입 이름으로 소스파일(.java)를 생성해도 된다.

 

enum Season { //class 외부에서 선언
    봄, 여름, 가을, 겨울
}

public class enum_ex {
	public enum Season { //class 내부에서 선언
        봄, 여름, 가을, 겨울
    }
}

 

 

enum 사용법

public class enum_ex {
    public enum Season {
	    봄, 여름, 가을, 겨울
    }
	
    public static void main(String[] args) {
        Season season = Season.봄;
        System.out.println(season);
        System.out.print(Season.여름);
    }
}

 

 

 

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

 

1) values()

 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴한다.

 

enum Season {
    봄, 여름, 가을, 겨울
}

public class enum_ex {
    public static void main(String[] args) {
    	for(Season sea : Season.values()){
    	    System.out.println(sea); // 출력 : 봄, 여름, 가을, 겨울
        }
    }
}

 

2) valueOf()

매개 값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.

 

enum Season { //class 외부에서 선언
    봄, 여름, 가을, 겨울
}

public class enum_ex {

    public static void main(String[] args) {
    	Season seson = Season.valueOf("가을");
    	System.out.println(seson); // 출력 : 가을
    }
}

 

3) ordinal()

전체 열거 객체 중 몇번째 열거 객체인지 알려준다. 열거 객체의 순번은 0부터 시작된다.

 

enum Season {
    봄, 여름, 가을, 겨울
}

public class enum_ex {
    public static void main(String[] args) {
    	Season seson = Season.여름;
    	System.out.println(seson.ordinal()); // 출력 : 1
    }
}

 

4) name() 

열거 객체가 가지고 있는 문자열을 리턴한다. 이때 리턴되는 문자열은 열거 타입을 정의할때 사용한 상수 이름과 동일하다.

 

enum Season { //class 외부에서 선언
    봄, 여름, 가을, 겨울
}

public class enum_ex {

    public static void main(String[] args) {
    	Season seson = Season.가을;
    	String name = seson.name();
    	System.out.println(name); // 출력 : 가을
    }
}

 

5) compareTo() 

매개값으로 주어진 열거 객체를 기준으로 전후로 몇번째 위치하는지 비교한다.

만약 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수가, 순번이 늦다면 양수가 리턴된다.

 

enum Season { //class 외부에서 선언
    봄, 여름, 가을, 겨울
}

public class enum_ex {

    public static void main(String[] args) {
    	Season seson1 = Season.가을;
    	Season seson2 = Season.겨울;
    	
    	int result1 = seson1.compareTo(seson2);
    	int result2 = seson2.compareTo(seson1);
    	
    	System.out.println("result1 = " +result1); // 출력 : result = -1
    	System.out.println("result2 = " +result2); // 출력 : result = 1
    }
}

 

 

 

 

3. java.lang.Enum

 

모든 enum들은 내부적으로 java.lang.enum 클래스에 의해 상속된다. 

자바는 다중상속을 지원하지 않기 때문에 enum은 다른 클래스를 상속받을 수 없다.

 

enum생성자는 왜 private 인가?

 

java에서 enum타입은 열거형을 의미하는 특별한 형태의 클래스이다.

그렇기 때문에 일반 클래스와 같이 생성자가 있어야 한다. 물론 생성자를 만들어 주지 않아도 java가 default 생성자를 만들어주긴 하지만, enum의 경우에는 생성자의 접근제어자를 private로 지정한다.

 

enum타입은 고정된 상수들의 집합으로써, 런타임이 아닌 컴파일타임에 모든 값을 알고있어야 합니다. 즉 다른 패키지나 클래스에서 enum 타입에 접근해서 동적으로 어떤 값을 정해줄 수 없다. 

 

해당 enum클래스 내에서 까지도 new키워드로 인스턴스 생성이 불가능하다.

이렇게 하면 외부에서 접근 가능한 생성자가 없으므로 enum타입은 실제적으로 final과 다름이 없다.

 

 

 

4. EnumSet

 

java.util 패키지의 EnumSet 클래스는 열거 타입 상수의 값으로 구성된 집합을 효과적으로 표현한다.

 

기본적으로 EnumSet은 abstract 키워드가 사용되기 때문에 객체로써 생성 및 사용이 불가능하다. (new 연산자 사용불가)

 

public abstract class EnumSet { //EnumSet은 abstract하여 객체 생성이 불가능하다.
    ...
    
    //noneOf 메소드에서 상황에 따라 다른 구현체 객체들을 만들어서 반환해주고 있다.
    public static noneOf(...) {
        if (enumElementSize <= 64)
            return new RegularEnumSet<>(...);  
        else
            return new JumboEnumSet<>(...);
    }
}

 

메서드

  • EnumSet.allOf() : Enum 클래스 전체를 담는다.
  • EnumSet.noneOf() : 비어있는 EnumSet 반환
  • EnumSet.range() : Enum의 하위집합을 만든다.
  • EnumSet.complementOf() : 매개변수로 전달된 요소로 제외한다.
  • EnumSet.copyOf() : 다른 EnumSet의 모든 요소를 복사하여 EnumSet을 만들 수 있다.

장점

  • 사용자는 어떤 구현 객체가 적합한지 몰라도 상관없다.
  • 사용자는 빈번하게 발생되는 EnumSet 초기화 과정을 간단히 진행할 수 있다.
  • EnumSet의 확장성과 유지보수의 이점

 

 

 

 

 

Reference


sjh836.tistory.com/134

 

enum (이전 방식, 개념, 동작방식, 사용예제, 관련메소드)

참조문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html 1. enum 이란? enumeration의 앞글자로 열거라는 뜻이다. JDK 1.5 부터 관련이 있는 상수들의 집합을 사용할 때 enum을 사용한다. e..

sjh836.tistory.com

coding-factory.tistory.com/522

 

[Java] 열거 타입(Enum) 사용법 & 예제

프로그래밍을 하다보면 몇가지의 한정된 데이터들을 가지는 경우가 있습니다. 대표적으로는 "요일"이나 "계절" 같은것이지요 요일은 월,화,수,목,금,토,일 이렇게 7가지밖고 계절도 봄,여름,가을

coding-factory.tistory.com

siyoon210.tistory.com/152

 

EnumSet이 new 연산자를 사용하지 않는 이유

EnumSet을 사용하는 방법 EnumSet은 다른 컬렉션들과 다르게 new 연산자 사용이 불가능합니다. EnumSet은 아래와 같은 방법으로 사용합니다. //DayOfWeek라는 Enum을 다루는 Set으로 비어있는 Set을 반환 EnumSe

siyoon210.tistory.com

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30