Enum 클래스

개발공부기록하기·2024년 5월 2일

java

목록 보기
10/16

Enum : Enumeration(열거, 목록, 일람표) 의 뜻을 가지고 있고 열거형 맴버라 불리는 자료형이다, 쉽게 생각 하면 상수데이터들의 집합이다.

Enum은 C언어에서 그냥 정수, C++은 enum 타입이지만, JAVA에서는 독립적인 특수한 클래스로 구분된다.

Enum의 장점코드가 단순해지며 가독성이 좋아진다.
키워드 enum을 사용하기 떄문에 구현의 의도가 열거임을 분명하게 나타낼수있다.

Enum선언
Enum명은 클래스와 같이 첫문자를 대문자로 하고 나머지는 소문자로 구성한다
열거 상수는 모두 대문자로 작성한다.
열거 상수가 여러 단어로 구성될 경우, 단어 밑줄(_)로 연결한다.

enum CarMenue {
    GENESIS,
    AVANTE,
    SONATA,
    IONIQ,
    SM3,
    SM5;
}

Enum 메소드 종류
name() : 열거 객체의 문자열을 리턴
ordinal() : 열거 객체의 순번(0부터 시작)을 리턴
compareTo() : 각 열거 객체의 순번 차이를 리턴 한다.
values() : 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴

public class Main {
    public static void main(String[] args) {

        CarMenue car = CarMenue.Genesis;//car안에 GENESIS 값을 대입
        System.out.println(car);//Genesis 출력
        System.out.println();

        CarMenue[] car1 = CarMenue.values(); //열거 타입의 모든 열거 객체들을 배열로 만들어 리턴
        for (int i = 0; i < car1.length; i++) {
        System.out.println(car1[i]);//GENESIS,AVANTE,SONATA,IONIQ,SM3,SM5
        }
        System.out.println();

        String strCar = car1[1].name(); //열거 객체가 가지고 있는 문자열을 리턴
        System.out.println(strCar);//AVANTE

        System.out.println();
        int intCar = car.ordinal(); //열거 타입을 정의 할 때 주어진 순번을 리턴 처음 멘앞에 값 Genesis이므로 0 출력
        System.out.println(intCar);//0
        System.out.println();

        CarMenue car2 = CarMenue.IONIQ;
        int strINT = car2.compareTo(car); //car2는 IONIQ값이 대입되어 있어 확인시 4라는 값을 가지고 있고 car는 Genesis값이므로 값이 1이다. 즉 4 - 1의 값인데 결과 값은 3이다.
        System.out.println(strINT);
    }
}

Enum 매핑
Enum 상수에서 고유 값을 가지고 오고 싶을때 Enum 매핑을 통해서 데이터 값을 가지고 올수 있다.

enum CarMenue {
    Genesis("현대"),
    AVANTE("현대"),
    SONATA("현대"),
    IONIQ("현대"),
    SM3("삼성"),
    SM5("삼성");
    
    private final String CarMenue;
    
    CarMenue(String CarMenue) {
        this.CarMenue = CarMenue;
    }
    
    public String getCarMenue() {
        return CarMenue;
    }
}
public class Main {
    public static void main(String[] args) {
        CarMenue car1 = CarMenue.IONIQ;
        CarMenue car2 = CarMenue.SM3;

        System.out.println(car1);
        System.out.println(car1.getCarMenue());

        System.out.println(car2);
        System.out.println(car2.getCarMenue());
    }
}

Enum 확장
Enum은 상수로 값을 저장 및 매핑을 넘어서 메소드로서 활용이 가능하다.

enum CarMenue {
    Genesis("현대","RED") {
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    },
    AVANTE("현대","BLUE"){
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    },
    SONATA("현대","BLACK"){
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    },
    IONIQ("현대","WHITE"){
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    },
    SM3("삼성","IBORI"){
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    },
    SM5("삼성","SKYBLUE"){
        public String CarSelect(String car,String color ){
            String result = "차 종은 : " + car +"," + "색깔은 : " + color;
            return result;
        }
    };

    private final String CarMenue;
    private final String CarColor;

    CarMenue(String CarMenue,String CarColor) {
        this.CarMenue = CarMenue;
        this.CarColor = CarColor;
    }

    public String getCarMenue() {
        return CarMenue;
    }
    public String getCarColor() {
        return CarColor;
    }

    public abstract String CarSelect(String car,String color);
}
public class Main {
    public static void main(String[] args) {
        CarMenue car1 = CarMenue.IONIQ;
        System.out.println(car1.CarSelect(car1.getCarMenue(),car1.getCarColor()));
    }
}

람다식 활용

//두 개의 매개변수를 받아서 하나의 결과를 반환위해 BiFunction 사용
import java.util.function.BiFunction;

enum CarMenue {
    AVANTE("현대", "BLUE", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor)),
    Genesis("현대", "RED", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor)),
    IONIQ("현대", "WHITE", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor)),
    SM3("삼성", "IBORI", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor)),
    SM5("삼성", "SKYBLUE", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor)),
    SONATA("현대", "BLACK", (car, carcolor) -> ("차 종은 : " + car + "," + "색깔은 : " + carcolor));

    private final String CarMenue;
    private final String CarColor;
    //BiFunction는 람다 함수 저장하기 위해 사용
    private final BiFunction<String, String, String> result;

    CarMenue(String CarMenue, String CarColor,BiFunction<String, String, String> result ) {
        this.CarMenue = CarMenue;
        this.CarColor = CarColor;
        this.result = result;
    }

    public String getCarMenue() {
        return CarMenue;
    }

    public String getCarColor() {
        return CarColor;
    }
    //BiFunction의 값을 그대로 가지고 오면 주소값을 가지고 오므로 apply() 메서드를 통해 값을 가지고 온다.
    public String getResult() {
        return result.apply(CarMenue,CarColor);
    }
}
public class Main {
    public static void main(String[] args) {
        CarMenue car1 = CarMenue.IONIQ;
        System.out.println(car1.getResult());
    }
}

참고 문헌
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC
https://hstory0208.tistory.com/entry/Java%EC%9E%90%EB%B0%94-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

0개의 댓글