슬기로운 개발생활

온라인 자바 스터디 #11 - Enum

by coco3o
반응형

목표

자바의 열거형에 대해 학습하세요.

학습할 것 (필수)

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

Enum 정의하는 방법

우리는 흔히 상수를 정의할 때 final static int 와 같은 방식으로 상수를 정의한다.

상수 ? - final로 문자열, 숫자를 나타내는 자료형의 값을 고정함

하지만 이렇게 상수를 정의하여 코딩하는 경우 다양한 문제가 발생하게 된다.

따라서 이러한 문제점들을 보완하기 위해 Java 5 부터 새롭게 추가된 것이 바로 "Enum"이다.

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

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

 

만약 어떤 클래스안에 상수들로만 이루어져있다면, 반드시 클래스로 선언할 필요가 없다.이럴 땐,

class 대신 enum을 선언하여 해당 객체를 '상수의 집합'으로 나타낼 수 있다.

 

Enum의 장점

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

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

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

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

 

Enum을 정의하는 방법

enum class는 다른 클래스와 마찬가지로  별도의 java파일,  클래스 안,  클래스 밖 선언 가능

 

1. 별도의 .java 파일 생성

 

CarType.java

package study;

public enum CarType {
    SEDAN, SUV, SPORT
}

Owner.java

package study;

public class Owner {

    public String brand;
    public int price;
    public CarType type;
}

2. Class 내부에서 선언

package study;

public class Owner {

    public String brand;
    public int price;
    public enum CarType {
    
        SEDAN, SUV, SPORT
    }
}

3. Class 외부에서 선언

package study;

public class Owner {

    public String brand;
    public int price;
    public CarType type;
}
enum CarType {
    SEDAN, SUV, SPORT
}

* 특징 

  • 열거형으로 선언된 순서에 따라 0 부터 인덱스 값을 가진다. (순차적으로 증가된다.)
  • enum 열거형으로 지정된 상수들은 모두 대문자로 선언
  • 열거형 변수들을 선언한 후 세미콜론( ; )은 찍지 않는다.

Enum Class 사용하기

package study;

public class Owner {

    public String brand;
    public int price;
    public CarType type;

    public static void main(String[] args) {
        Owner owner = new Owner();

        owner.brand = "현대";
        owner.price = 55_000_000;
        owner.type = CarType.SEDAN;

        System.out.println("브랜드 명 : " + owner.brand);
        System.out.println("자동차 가격 : " + owner.price);
        System.out.println("자동차 타입 : " + owner.type);
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
브랜드 명 : 현대
자동차 가격 : 55000000
자동차 타입 : SEDAN

Process finished with exit code 0

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

1. values( ) : enum안에 존재하는 모든 값들을 반환

package study;

public class Owner {

    public static void main(String[] args) {
        for(CarType type : CarType.values()) {
            System.out.println(type);
        }
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
SEDAN
SUV
SPORT

Process finished with exit code 0

2. valueOf( ) : 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 리턴

일치하지 않는 경우 예외( IllegalArgumentException ) 발생

package study;

public class Owner {
    public String brand;
    public int price;
    public CarType type;

    public static void main(String[] args) {

        CarType type1 = CarType.SEDAN;
        CarType type2 = CarType.valueOf("SUV");

        System.out.println(type1);
        System.out.println(type2);
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
SEDAN
SUV

Process finished with exit code 0

원하는 Enum Type 가져오는 방법

*enum형 객체를 만들어서 가져오기 ㅡ> CarType type1 = CarType.SUV;

*valueOf( ) 메소드를 이용해서 가져오기 ㅡ> CarType type2 = CarType.valueOf("SEDAN");


3. ordinal( ) : 원소에 열거된 순서를 정수 값으로 리턴

package study;

public class Owner {
    public String brand;
    public int price;
    public CarType type;

    public static void main(String[] args) {
        Owner owner = new Owner();

        owner.brand = "현대";
        owner.price = 55_000_000;
        owner.type = CarType.SEDAN;
        System.out.println(owner.type.ordinal());
        
        CarType type = owner.type.SPORT;
        System.out.println(type.ordinal());
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
0
2

Process finished with exit code 0

4. name( ) : 열거 객체가 가지고 있는 문자열을 리턴

package study;

public class Owner {
    public String brand;
    public int price;
    public CarType type;

    public static void main(String[] args) {
        CarType type1 = CarType.SEDAN;
        String type = type1.name();
        System.out.println(type);
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
SEDAN

Process finished with exit code 0

5. compareTo( ) : 매개값으로 주어진 열거 객체를 기준으로 전 후로 위치 값의 차이를 반환

package study;

public class Owner {
    public String brand;
    public int price;
    public CarType type;

    public static void main(String[] args) {
        CarType type1 = CarType.SEDAN;
        CarType type2 = CarType.SPORT;

        int result1 = type1.compareTo(type2);
        int result2 = type2.compareTo(type1);

        System.out.println("result1 : " + result1);
        System.out.println("result2 : " + result2);
    }
}
enum CarType {
    SEDAN, SUV, SPORT
}
result1 : -2
result2 : 2

Process finished with exit code 0

 


java.lang.Enum

모든 enum들은 내부적으로 java.lang.Enum 클래스에 의해 상속된다.

클래스는 하나의 부모 클래스에 의해서만 상속되므로, enum은 다른 것을 상속할 수 없다.

위에서 다뤘던 values( ), ordinal( ), valueOf( )메소드들은 java.lang.Enum 내부에 존재한다.


EnumSet

EnumSet은 java.util 패키지에 정의되어 있으며, Set 자료구조의 특징을 따른다.

package study;

import java.util.EnumSet;

public class CarClass {
    public static void main(String[] args) {
        EnumSet<CarBrand> carBrands = EnumSet.allOf(CarBrand.class);
        // 모든 요소를 포함한 EnumSet 반환

        EnumSet<CarBrand> koreaBrand = EnumSet.of(CarBrand.HYUNDAI, CarBrand.KIA, CarBrand.SSANGYONG);
        // 특정 상수만 포함한 EnumSet 반환

        EnumSet<CarBrand> germanyBrand = EnumSet.complementOf(koreaBrand);
        // 특정 상수를 제외한 EnumSet 반환

        EnumSet<CarBrand> kia_Audi = EnumSet.range(CarBrand.KIA, CarBrand.AUDI);
        // 특정 범위의 EnumSet 반환 ( Kia ~ Audi )

        System.out.println(carBrands);
        System.out.println(koreaBrand);
        System.out.println(germanyBrand);
        System.out.println(kia_Audi);
    }
}
enum CarBrand {
    HYUNDAI, KIA, SSANGYONG, BENZ, AUDI, BMW
}
[HYUNDAI, KIA, SSANGYONG, BENZ, AUDI, BMW]
[HYUNDAI, KIA, SSANGYONG]
[BENZ, AUDI, BMW]
[KIA, SSANGYONG, BENZ, AUDI]

Process finished with exit code 0

 

references : 

limkydev.tistory.com/66

young-bin.tistory.com/77

 

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기