본문 바로가기

Language/Java

[JAVA]열거형

1.열거형 클래스 (enum class) 정의

요일: 월, 화, 수, 목, 금, 토, 일

달력: JAN, FEB, MAR, APR, MAY, JUNE .... 

과 같이 서로 관련 있는 상수들을 모아놓고, 해당 상수들에 대해 정의한 클래스

 

*상수란?

열거형 클래스 안의 핵심이 되는 값을 이야기 하는 것이지, 꼭 숫자일 필요 없다. 정수, 실수, 문자열 모두 가능하다. 

위의 예를 해당 정의에 따라 나누어보면, 

 

클래스 이름: 요일 / 상수: 월, 화, 수, 목, 금, 토, 일

클래스 이름: 달력/ 상수: JAN, FEB, MAR, APR, MAY, JUNE .... 

 

이다. 

 

2. 문법적 특징

1. 열거된 상수들은 차례대로 0부터 시작하는 index를 가진다. 

2. 상수들은 모두 대문자로 적어야한다.

3. 상수와 특정 값들을 연결시키지 않은 경우에는, 상수 선언 후 세미콜론(;)을 붙이지 않는다. 

enum Day {
MON,TUE,WEN,TUR,FRI,SAT,SUN
}

4. 상수와 특정 값들을 연결시키는 경우에는 상수 선언 후 세미콜론(;)을 붙인다.  

enum Day {
	//요일의 상수(영어표기)과 특정 값(한글표기)을 연결 시키는 것
	MON("월"),TUE("화"),WED("수"),TUR("목"),FRI("금"),SAT("토"),SUN("일");
	
    //상수의 인스턴스 변수 -> 상수 하나 하나 작은 객체라고 생각하는 것이 편하다.
    private final String KOR;
    
    //인스턴스 변수에 값을 넣는 생성자
    Day(String name) {
    	this.KOR = name;
    }
    
    //상수들의 한글표기라는 변수를 반환하는 매소드
    public String getKOR(){
    	return KOR;
    }
}

 

3. 열거형 선언 

(1) 열거형 클래스 선언

//클래스 외부 

enum 클래스이름 {
	상수1, 상수2, 상수3, ...
}

//클래스 내부 
public class Test {

	public enum 클래스 이름 {
    	상수1, 상수2, 상수3, ...
    }


}

(2) 열거형 클래스 사용법 (상수를 변수에 넣기 )

//어떤 클래스의 내부

열거형 클래스 이름 	변수 이름 =	 클래스이름.	변수에 넣고 싶은 상수;

//위의 Day 열거형 클래스를 이용한다고 치면

Day day1 = Day.MON;

*예시

//변수안에 상수 집어넣기
Resolution resolution = Resolution.FHD;
System.out.println(resolution); // FHD가 찍힌다.

System.out.println("동영상 녹화 품질 : ");

//switch-case 문 이용
switch (resolution) {
	
    // resolution == HD 이면
    case HD:
        System.out.println("일반화질");
        break;
    case FHD:
        System.out.println("고화질");
        break;
    case UHD:
        System.out.println("초고화질");
        break;
}

4. 열거형 매소드

열거형 클래스가 기본적으로 사용할 수 있는 매소드들이 있다. 우리는 거기서 가장 많이 쓰이는 것만 알아보자. 

앞에 적힌 ClassName은 예시이다. 이 곳에는 자신이 매소드를 쓰려고 하는 열거형 클래스의 이름을 쓰면 된다.

(1) ClassName.valueOf( String arg )

()안의 문자열과 같은 값의 상수를 반환. 없으면 Exception이 발생한다.

*예시

enum Resolution {
	HD,FHD,UHD
}


public class Enum_Ex{
	//UHD와 같은 상수 찾아서 가져온 뒤 resolution이란 변수에 저장 
	Resolution resolution = Resolution.valueOf("UHD");
}

** 심화

ClassName.valueOf(Class<T> class, String arg)

넘겨받은 class 에서 해당 String을 찾아 그것과 같은 값을 enum 속 상수를 찾아 반환

(2) ClassName.values()

enum 클래스 내의 상수를 차례대로 반환 

(3) 상수.name()

호출된 상수를 String 으로 반환

(4) 상수.ordinal()

호출된 상수의 index를 반환

 

**예시

//선언
enum Day {MON,TUE,WED,TUR,FRI,SAT,SUN}

public class enum_EX {
	
    //for-each 구문 > 열거형 클래스를 순회
    // today라는 Day형 변수에 Day의 상수들을 차례대로 대입 
    // 현재 대입된 상수의 이름, index를 출력
    
    for (Day today : Day.values()){
    	System.out,println("오늘의 요일은 : " + today.name() + "이고 요일의 순서는 " + today.ordinal());
    }

}

5. 변수, 생성자, 매소드를 이용해 상수와 특정 값 연결시키기

먼저 각 상수에 대해 넣을 값을 상수 옆의 ()안에 넣어줘야 한다.

 

enum 클래스 내의 변수를 통해서 각 상수에 대한 정보를 기술할 수 있다. 

enum 클래스의 생성자는 상수와 변수를 이어준다. 

enum 클래스의 Getter 매소드는 상수의 변수 값을 반환해서 무엇이 들어있는지 보여준다.

 

*예시

 

enum Day {
	//요일의 상수(영어표기)과 특정 값(한글표기)을 연결 시키는 것
	MON("월"),TUE("화"),WED("수"),TUR("목"),FRI("금"),SAT("토"),SUN("일");
	
    //상수의 인스턴스 변수
    private final String KOR;
    
    //인스턴스 변수에 값을 넣는 생성자
    Day(String name) {
    	this.KOR = name;
    }
    
    //상수들의 한글표기라는 변수를 반환하는 매소드
    public String getKOR(){
    	return KOR;
    }
}

**변수가 2개 이상일 때의 예시

//선언 - 각 상수에 넣을 값도 같이!
enum Direction {
EAST(1, "<"), WEST(2, ">"), NORTH(3, "^"), SOUTH(4,"V")

private final int index;
private final String symbol;

Direction(int first_One, String secoend_One)
{
	this.index = first_One;
    this.symbol = secoend_One;
}

// this.이 필요없다. 매소드 호출 시 상수이름.Getter매소드()라서 무슨 상수인지 특정해진다.
public int getIndex(){
	return index;
}

public String getSymbol(){
	return symbol;
}

}


//하나씩 값들이 잘 들어있나 호출
public class enum_EX {
	for(Direction D : Direction.values()) {
            System.out.println(Direction.name() + " : " + Direction.getindex() 
            						+ " : " + Direction.getSymbol());
    }
}

4.점검

(1) 열거형이란? / 상수란? 

(2) 열거형 문법적 특징(4가지)

(3) 열거형 클래스 선언 / 열거형 자료형 변수 안에 상수 값 집어 넣기

(4) 열거형 클래스의 매소드 각각 뜻 ClassName.valueOf(), ClassName.values(), 상수.name(), 상수.ordinal()

(5)인스턴스 변수, 생성자, 매소드를 이용해 상수와 특정 값 연결시키기 > 코드 보고 이해만 하자 

'Language > Java' 카테고리의 다른 글

[JAVA] Interface (인터페이스)  (0) 2023.02.02
[JAVA] 추상화와 추상화 클래스  (0) 2023.02.01
[JAVA]final  (0) 2023.01.29
Chap07_13 참조(reference)  (0) 2023.01.29
[JAVA] Super  (0) 2023.01.28