java week 11


목차



enum?


Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미한다.

기존에 상수를 정의하는 방법이였던 final static 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있다.

enum의 장점

  1. 코드가 단순해지며, 가독성이 좋다.

  2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장됩니다.

  3. enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크한다.

  4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있다.


enum 정의하는 방법


1. 별도의 .java 파일 생성

Grade.java

public enum Grade {
    VIP,GOLD,SILVER
}

customer.java

public class customer {
    public String name;
    public Grade grade;    
}

2. Class 내부에서 선언

customer.java

package EnumExample;

public class customer {
     
    public String name;
    public enum Grade {
        VIP,GOLD,SILVER
    } 
}

3. Class 외부에서 선언

customer.java

public class customer {
    public String name;
    public Grade grade;
}
enum Grade {
    VIP,GOLD,SILVER
}

특징

  • 열거형으로 선언된 순서에 따라 0 부터 인덱스 값을 가진다. 순차적으로 증가된다.

  • enum 열거형으로 지정된 상수들은 모두 대문자로 선언

  • 마지막에 열거형 변수들을 선언한 후 세미콜론(;)은 찍지 않는다.

    (상수와 연관된 문자를 연결시킬 경우 세미콜론(;) 찍는다.)

4. Enum 사용하기

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        customer customer = new customer();
         
        customer.name = "홍길동";
        customer.type = Grade.VIP;
         
        System.out.println("이름 : "+ customer.name);
        System.out.println("등급 : "+ customer.grade);
    }
 
}
 
enum Grade {
    VIP,GOLD,SILVER
}

enum이 제공하는 메소드 (values()와 valueOf())


values() : 열거된 모든 원소를 배열에 담아 순서대로 리턴

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        for(Grade grade : Grade.values()){
            System.out.println(grade);
        }
    }
 
}
 
enum Grade {
    VIP,GOLD,SILVER
}

결과

VIP
GOLD
SILVER

valueOf()

매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 리턴, 없을경우 IllegalArgumentException 예외를 발생

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        Grade g1 = Grade.VIP;
        Grade g2 = Grade.valueOf("GOLD");
         
        System.out.println(g1);
        System.out.println(g2);
    }
 
}
 
enum Grade {
    VIP,GOLD,SILVER
}

결과

VIP
GOLD

원하는 EnumType가져오는 방법

*enum형 객체를 만들어서 가져오기. -> Grade g1 = Grade.VIP;

*valueOf() 메소드를 이용해서 가져오기. -> Grade g2 = Grade.valueOf(“GOLD”);

ordinal()

전체 열거 객체 중 몇번째 열거 객체인지 알려준다. 열거 객체의 순번은 0부터 시작된다.

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        Grade g1 = Grade.VIP;
     
        System.out.println(g1.ordinal());
    }
 
}
 
enum Grade {
    VIP,GOLD,SILVER
}

결과

0

name()

열거 객체가 가지고 있는 문자열을 리턴한다. 이때 리턴되는 문자열은 열거 타입을 정의할때 사용한 상수 이름과 동일하다.

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        Grade g1 = Grade.VIP;
        String name = g1.name()
        System.out.println(name);
    }
 
}
 
enum Grade {
    VIP,GOLD,SILVER
}

결과

VIP
public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        Grade g1 = Grade.VIP;
        String name = g1.name()
        System.out.println(name);
    }
 
}
 
enum Grade {
    VIP("vip에용"),GOLD,SILVER
}

결과

vip에용

compareTo()

매개값으로 주어진 열거 객체를 기준으로 전후로 몇번째 위치하는지 비교한다.

만약 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수가, 순번이 늦다면 양수가 리턴된다.

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        Grade g1 = Grade.VIP;
        Grade g2 = Grade.GOLD;
        
        int result1 = g1.compareTo(g2);
    	int result2 = g2.compareTo(g1);
    	
    	System.out.println("result1 = " +result1); // 출력 : result = -1
    	System.out.println("result2 = " +result2); // 출력 : result = 1
    }
 
}
 
enum Grade {
    VIP("vip에용"),GOLD,SILVER
}

결과

-1
 1

java.lang.Enum


enum 클래스는 java.lang.Enum 클래스를 상속 받도록 되어있다.

그러므로 enum클래슨는 다중상속이 불가능하여, 다른클래스를 상속 받을 수 없다.

java에서 enum은 열거형이라는 특별한 클래스

enum은 고정된 상수값이기에 컴파일시간에 모든 값이 정해져야 한다. 따라서 다른 패키지나 클래스에서 동적으로 enum의 값을 동적으로 바꿀 수가 없어야한다.

그렇기에 Enum 생성자는 private로 구현


EnumSet


Set 인터페이스를 기반으로 하면서 enum 열거요소를 배열처럼 요소들을 다룰수 있는 기능을 제공한다.

enum Grade {
    VIP,GOLD,SILVER
}

public class customer {
    public String name;
    public Grade grade;
     
    public static void main(String[] args){
        EnumSet es1 = EnumSet.EnumSet.allOf(Grade.class); //집합의 전체를 배열로 저장
        EnumSet es2 = EnumSet.of(Grade.VIP, Grade.GOLD); //원하는 집합만 선택한 of
        EnumSet es3 = EnumSet.complementOf(set2); // 여집합: SILVER가 들어감
        EnumSet es4 = EnumSet.range(Grade.VIP, Grade.SILVER); // 범위 vip~silver

        es2.add(Grade.SILVER); //실버 추가
        es2.remove(Grade.VIP); //vip 삭제

        System.out.println("es1 = " + es1);
        System.out.println("es2 = " + es2);
        System.out.println("es3 = " + es3);
        System.out.println("es4 = " + es4);
    }
}

결과

es1 = [vip, gold, silver]
es2 = [gold, silver]
es3 = [silver]
es4 = [vip, gold, silver]

EnumSet은 위처럼 상수를 Bit vector 형식으로 사용되기에 매우 효율적이지만, 비트 플래그의 대안으로 사용될 수 있을 정도로 고수준의 클래스를 구현해야합니다.


참고


- enum?

  • https://limkydev.tistory.com/50

- enum 정의하는 방법

  • https://limkydev.tistory.com/66

- enum이 제공하는 메소드 (values()와 valueOf())

  • https://wookcode.tistory.com/23?category=979588

- java.lang.Enum

  • https://wookcode.tistory.com/23?category=979588

- EnumSet




© 2019.04. by salmon2

Powered by theorydb