JAVA Programming

Growing_HJ·2024년 6월 5일

일기장

목록 보기
18/51

2024.06.03. MON <D + 14>
~2024.06.04. TUE <D + 15>, Enum (열거형)
A. Enum (열거형)
A-1. 열거형을 사용하는 이유 : 관련된 상수를 한 곳에 모아서 사용하기 위함.
A-2. 열거형의 기반: java.lang.Enum
name() => 상수의 이름을 문자열로 반환
ordinal() => 열거형 상수가 정의된 순서를 정수로 반환
valueOf() => 매개변수와 일치하는 열거형 상수를 반환
ex) Enum을 사용하지 않고 상수를 정의하는 방법

class Card{
	static final int CLOVER = 0;
    static final int HEART = 1;
    
    static int THREE = 1;
    static final int TWO = 0;
    
    final int kind;
    final int num;
}

ex) 위에 코드에 Enum을 추가하여 수정해 보기

class Card {
	enum Kind {CLOVER, HEART ...}
    enum Value {TWO, THREE, ...}
    
    final int kind;
    final int num;
}

A-3. 열거형의 활용 및 확장

  • 상수간의 비교에 "==" 연산자를 사용
    -> equals 메소드 보다는 연산이 빠름
    -> 열거형의 비교는 다른 열겨형과의 비교를 할 수 없음
  • 비교 연산자를 사용할 수 없음. 대신 ComparTo() 는 사용 가능!
    -> 비교 대상이 같으면 0 반환,
    -> 왼쪽이 크면 양수를 반환,
    -> 오른쪽이 크면 음수를 반환,
  • case 문에서 사용시, 반드시 상수의 이름을 사용할 것.
    A-3.1) 열거형의 확장: 상수의 불연속적인 값으로 설정하는 경우, 필요한 추가 사항
  1. 인스턴스 변수, 생성자(private, 내부적)를 반드시 추가해야함
  2. getter(외부에서 객체의 데이터를 읽을 때 사용)가 필요
  3. 인스턴스 변수, 생성자를 작성하지 않을 경우, 컴파일 에러가 발생
// enum 열거형을 생성해보자. 
enum Direction {EAST, SOUHT, WEST, NORTH}

// enum 열거형의 활용과 확장
enum Direction2 {EAST, SOUHT, WEST, NORTH}

// -> 내부적으로 관리되는 순서 정보 => 정수형으로, 0부터 시작함. 

public class EnumEx1 {
	public static void main(String[] args) {
		// enum 1. 상수 초기화 해보기.
		Direction d1 = Direction.EAST;
		Direction d2 = Direction.valueOf("WEST");
		Direction d3 = Enum.valueOf(Direction.class, "EAST");
	  //Direction d4 = Direction2.EAST;
		System.out.println("d1 = " + d1);
		System.out.println("d2 = " + d2);
		System.out.println("d3 = " + d3);
		
		System.out.println();
		// enum 열거형의 활용과 확장
		System.out.println("d1 == d2 => " + (d1 == d2));
		
		/*System.out.println("d1 == d4 => " + (d1 == d4));
		System.out.println("Direction.EAST == Direction2.EAST = " 
								+(Direction.EAST == Direction2.EAST)); -> 오류 발생 */
		
		// 2. Values 사용시, Enum의 상수 정보를 배열로 반환한다. 
		Direction[] dirArr = Direction.values();
		for(Direction d : dirArr) {
			System.out.printf("%s = %d %n", d.name(), d.ordinal());
		//3. switch 문을 사용해보자
		switch(d1) {
		case EAST:
			System.out.println("동쪽 - EAST");
			break;
		case SOUHT:
			System.out.println("서쪽 - SOUTH");
			break;
		default:
			System.out.println("없는 정보임.");
		}
	}
		
	} //end of main
} // end of class

A-4. 열거형의 상수의 구성 정보 (+ 불연속적인 상수값, + 상수값 외의 추가적인 정보)

enum Direction3 {
	// 상수 선언하기. 
	// EAST, SOUTH, WEST, NORTH - 상수 명
	EAST(1, ">"), SOUTH(2, "v"), WEST(3, "<"), NORTH(4, "^");
	/* 1. 생성자 필수
	   2. 인스턴스 상수 변수
	   3. 생성자에 인스턴스 상수 변수 초기화 */
	private static final Direction3[] DIR_ARR = Direction3.values();
	
	private final int value; // 상수값
	private final String symbol;
	
	Direction3 (int value, String symbol) {
		// 멤버변수 추가가 목표
		this.value = value;
		this.symbol = symbol;
	}
	// 상수값 게터
	public int getValue() {return value;}
	public String getSymbol() {return symbol;}
	
	// 정수(위치정보) 매개변수를 받아서 해당 상수를 반환하는 메소드. 
	public static Direction3 getDirection (int idx) {
		if(idx < 1 || idx > 4) {
			throw new IllegalArgumentException("Invalld: " + idx);
		}
		// oridinal()
		return DIR_ARR[idx-1];
	}
	
	public String toString() {
		return name() + " " + getSymbol(); 
	}
}

public class EnumEx2 {

	public static void main(String[] args) {
		for (Direction3 d : Direction3.values())
			System.out.printf("%s = %s %n ", d.name(), d.getSymbol());
		
	// 위치정보를 사용해서 상수를 반환하는 메소드 사용
		Direction3 d3 = Direction3.getDirection(1);
	// 상수명, 상수값, 심볼
		System.out.printf("d3 = %s, %d, %s\n", d3.name(), d3.getValue(), d3.getSymbol());
	} //end of main
} // end of class

0개의 댓글