열거형 - 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. 이제 종류를 구분했으니 각각의 값을 따로 배정하여 구별을 가능하게 해준다.
순서:
- 값을 각각 매겨줄 때 코드가 약간 복잡해지는데, 일단 구별된 요소옆에 () 소괄호를 만들어 그 안에 값을 넣어준다
- 넣어준 후에 마지막에 세미콜론으로 꼭 닫아줄 것!!
- 값을 다 매긴 후에 대괄호를 닫지 말고 바로 아래에 값을 담아줄 멤버변수를 하나 선언한다.
- 멤버변수를 생성자로 초기화시켜준 후에, 그 값을 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));
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 12장 (33일차) - 데몬쓰레드 & 쓰레드 실행과정 (0) | 2022.02.24 |
---|---|
자바의 정석 12장 (32일차) - 스레드 (0) | 2022.02.24 |
자바의 정석 12장 (31일차) - 와일드카드 <?> & 지네릭스 형변환 (0) | 2022.02.22 |
자바의 정석 12장 (30일차) - 지네릭스(Generics) & 타입 변수 & 제약 (0) | 2022.02.21 |
자바의 정석 11장 (30일차) - Collections 클래스 (0) | 2022.02.21 |