학습 목표
-
enum 정의하는 방법
-
enum이 제공하는 메소드 (values()와 valueOf())
-
java.lang.Enum
-
EnumSet
enum은 자바 5.0부터 사용할 수 있게 되었다.
상수는 유일무이 고정된 값.
enum 정의하는 방법
상수의 그룹을 미리 정할 수 있는 것이 열거형(enumerated type)이다. 서로 연관된 상수들의 집합이라고 할 수 있다.
문법적으로 미리 상수를 고정시켜서, 런타임 에러를 방지하고, 컴파일시에 발견할 수 있도록 한다.
(좋은 프로그래밍은 자기자신을 견제해야 한다.)
class Fruit{
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}
class Company{
public static final Company GOOGLE = new Company();
public static final Company APPLE = new Company();
public static final Company ORACLE = new Company();
}
public class ConstantDemo{
public static void main(String[] args)
if(Fruit.APPLE == Company.APPLE) // 컴파일 에러 생김.
Fruit type = Fruit.APPLE;
switch(type){
case Fruit.APPLE: //사용 불가
case Fruit.PEACH: //사용 불가
case Fruit.BANANA: //사용 불가
}
그러나 위와 같은 방법으로 switch 문을 사용할 때 일부 클래스 타입(Byte, String....)만 사용할 수 있기 때문에 위에 reference 타입 객체는 사용 할 수 없다.
위의 예제에서는 Fruit와 Company가 말하자면 열거인 셈이다. 이러한 패턴을 자바 1.5부터 문법적으로 지원하기 시작했는데 그것이 열거형이다. 이전 코드를 enum으로 바꿔보자.
/*
class Fruit{
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}
*/
enum Fruit{
APPLE, PEACH, BANANA
Fruit () {
System.out.pringln("Call Constrctor"+this);
}
}
class Company{
public static final Company GOOGLE = new Company();
public static final Company APPLE = new Company();
public static final Company ORACLE = new Company();
}
public class ConstantDemo{
public static void main(String[] args)
Fruit type = Fruit.APPLE;
switch(type){
case APPLE: //사용 가능
case PEACH: //사용 가능
case BANANA: //사용 가능
}
enum을 사용하는 장점
-
코드가 단순해진다.
-
인스턴스의 생성과 상속을 방지한다.
-
키워드로 enum을 사용하면 구현의 의도와 열거임을 분명하게 들어낼 수 있다.
enum이 제공하는 메소드 (values()와 valueOf())
클래스로 상수를 정의하게 되면 각각의 클래스를 배열처럼 열거할 수 없다. 그러나 enum이 제공하는 values()를 활용하면 배열처럼 정의된 상수를 꺼내서 쓸 수 있다.
valueOf(String name) 는 구체적인 이름을 명시하면 value값을 return할 수 있다.
enum Fruit{
APPLE("red"), PEACH("pink"), BANANA("yellow"); //생성자 호출
public String color;
public String getColor(){
return this.color;
}
Fruit (String color) {
System.out.pringln("Call Constrctor"+this);
this.color = color;
}//생성시에 과일의 색깔까지 함께 생성된다.
}
public class ConstantDemo{
public static void main(String[] args)
Fruit type = Fruit.APPLE;
switch(type){
case APPLE: //사용 가능
System.out.pringln(57+" kcal, color "+Fruit.APPLE.color);
break;
case PEACH: //사용 가능
System.out.pringln(34+" kcal, color "+Fruit.PEACH.color);
break;
case BANANA: //사용 가능
System.out.pringln(93+" kcal, color "+Fruit.BANANA.color);
break;
for(Fruit f : Fruit.values()){
System.out.println(f+", "+ f.getColor());
}
//클래스를 열거하여 사용할 수 있다.
}
열거형의 특성
-
열거형은 연관된 값들을 저장한다.
-
또 그 값들이 변경되지 않도록 보장한다.
-
뿐만 아니라 열거형 자체가 클래스이기 때문에 열거형 내부의 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 큰 역할을 할 수 있다.
java.lang.Enum
compareTo(E o) : this.enum과 다른 객체를 비교할 수 있다.
describeConstable() : descriptor 리턴
equals(Object other) : 상수값비교
EnumSet
enum 타입을 Set 인터페이스를 활용하여 효율적으로 실행 시킬 수 있다.
enumSet 특징
-
AbstractSet을 상속, SetInterface를 인터페이스
-
Collecton멤버 이다.
-
HashSet보다 퍼포먼스가 좋다.
-
모든 enumSet 요소는 단일 열거형 타입이 set이 생성되었을 때 구체화 된다.
allOf (Class elementType) |
모든 요소들을 보여준다. |
noneOf (Class elementType) |
empty enum으로 만들어준다 |
copyOf (Collection c) |
enumset을 복사해 준다. |
of (E e) |
This method is used to create an enum set initially, containing a single specified element. |
range (E from, E to) |
This method is used to initially create an enum set that contains the range of specified elements. |
clone() |
This method is used to return a copy of the specific set. |
샘플 예제
import java.util.EnumSet;
enum example
{
one, two, three, four, five
};
public class main
{
public static void main(String[] args)
{
// Creating a set
EnumSet<example> set1, set2, set3, set4;
// Adding elements
set1 = EnumSet.of(example.four, example.three,
example.two, example.one);
set2 = EnumSet.complementOf(set1);
set3 = EnumSet.allOf(example.class);
set4 = EnumSet.range(example.one, example.three);
System.out.println("Set 1: " + set1);
System.out.println("Set 2: " + set2);
System.out.println("Set 3: " + set3);
System.out.println("Set 4: " + set4);
}
}
출처
'Backend > Java' 카테고리의 다른 글
JAVA 상속 (0) | 2021.02.20 |
---|---|
annotations (0) | 2021.02.06 |
[Java] 클래스 (0) | 2021.01.20 |
[Java] 선택문, 반복문 (0) | 2021.01.18 |
Java 예외 처리 정리 (0) | 2021.01.16 |