자바의 정석 12장 (31일차) - 열거형 (enum)

728x90

열거형 - Enum

관련된 상수들을 같이 묶어놓은 것

타입과 값을 둘다 체크함으로써 안전한 열거형을 제공

 

아래의 예시를 보면 ETH 가격과 XRP가격이 같더라도 다른 종류이기 때문에 false를 출력하는 것이 논리적으로 맞지만, 실행 시 true가 실행된다

		Coin c = new Coin();
		System.out.println(c.ETHPrice == c.XRPPrice)
	}
}
class Coin{
	String BTC;
	String ETH;
	String XRP;
	
	int ETHPrice = 100;
	int XRPPrice = 100;
}

 

열겨형 선언

따라서 열겨형을 선언하여 종류를 구분한다음 값을 비교를 하면 논리적으로 생각한대로 false가 출력이 된다.

 

1. 일단 먼저 enum을 선언하는 방법을 알아보자

enum name2 {BTC, ETH, XRP};
0,1,2

위와 같이 선언을 하여 종류를 구분하고 각각의 값(지정을 하지 않을 시)은 인덱스 값과 같이 배정이 된다. (0, 1, 2).

 

 

2. enum으로 종류를 구분했으면 아래와 같이 3가지 방법중 1개를 선택하여 출력한다.

enum name2 {BTC, ETH, XRP};
		name2 n1 = name2.valueOf("BTC");
		name2 n2 = name2.BTC;
		name2 n3 = name2.valueOf(name2.class, "BTC");
//		name 이라는 enum을 생성하여 지정한 요소를 추출하는 방법은 총 3가지가 있다

		System.out.println(n1);
		System.out.println(n2);
		System.out.println(n3);
//		BTC
//		BTC
//		BTC

 

 

3. 출력을 하고 각각의 인덱스 값을 반환해주는 메서드는 ordinal()!

enum name2 {BTC, ETH, XRP};
		int n1index = name2.BTC.ordinal();
		int n2index = name2.ETH.ordinal();
		int n3index = name2.XRP.ordinal(); 
//		각각의 인덱스 값을 가져오는 메서드 = ordinal()
		System.out.println(n1index);
		System.out.println(n2index);
		System.out.println(n3index);
//		0
//		1
//		2

 

4. 이제 종류를 구분했으니 각각의 값을 따로 배정하여 구별을 가능하게 해준다.

 

순서:

  1. 값을 각각 매겨줄 때 코드가 약간 복잡해지는데, 일단 구별된 요소옆에 () 소괄호를 만들어 그 안에 값을 넣어준다
  2. 넣어준 후에 마지막에 세미콜론으로 꼭 닫아줄 것!!
  3. 값을 다 매긴 후에 대괄호를 닫지 말고 바로 아래에 값을 담아줄 멤버변수를 하나 선언한다.
  4. 멤버변수를 생성자로 초기화시켜준 후에,  그 값을 return하는 getValue()의 메서드를 생성해준다

결과값: 1000

enum name
	{BTC(1000), ETH(500), XRP(500);
	final int value;
	
	private name(int value) {
		this.value = value;
	}
	
	int getValue() {
		return value;
	}
}

    int v1 = name.BTC.getValue();
    System.out.println(v1);

 

5. 이의 메서드를 사용해서 값을 비교해주면 값의 숫자가 같더라도 false가 출력되는 것을 볼 수 있다.

*값을 비교해주기위해 종류의 값과 인덱스를 비교하여 출력하였다.

		int v1 = name.BTC.getValue();
		int v2 = name.ETH.getValue();
		int v3 = name.XRP.getValue();
		
		System.out.println(v2 == v3 && name.ETH.ordinal() == name.XRP.ordinal());

열거형을 선언할 때 주의점

열거형 안에 들어가는 요소개별의 객체이므로 비교연산자를 사용할 수 없다.

아래의 값은 당연히 false가 출력된다.

	enum name2 {BTC, ETH, XRP};
 	System.out.println(name.BTC == name.ETH);

 

열거형은 각각의 객체의 값을 비교하는 것이기 때문에 compareTo나 equals를 사용해야 한다.

아래의 값은 우측의 값이 왼쪽, 즉 비교당하는 값보다 크기 때문에 양수가 나온다

*만약 우측의 값이 더 작으면 음수가 나온다 : (예시: name.BTC.compareTO(name.ETH) )

	enum name2 {BTC, ETH, XRP};
        System.out.println("compareTo"+name.XRP.compareTo(name.ETH));
	enum name2 {BTC, ETH, XRP};
 	System.out.println(name.BTC.equals(name.ETH));
728x90