본문 바로가기
Language/Java

[ Java ] Enum 클래스

by ㅇ달빛천사ㅇ 2023. 1. 25.
728x90

프로그래머스 Lv.0 양꼬치 문제를 풀고 다른 사람의 풀이를 보며 공부를 하던 중, 뭔가 문제 난이도에 비해 엄청난 코드를 발견했다!

뭔가 약간 too much가 아닌가 싶기도 하지만 변수명 정하는 방법이나 내가 모르는 Enum클래스 등 여러가지로 주의깊게 보고 싶은 부분이 많아서 오늘은 Enum 클래스에 대해 알아보기로 했다.

class Solution {
    public int solution(int n, int k) {
        int lambTotalPrice = totalPrice(Menu.LAMB, n);
        int drinkTotalPrice = totalPrice(Menu.DRINK, k);
        int discountPrice = discount(Menu.DRINK, n);

        int totalPay = lambTotalPrice + drinkTotalPrice - discountPrice;
        return totalPay;
    }

    private int totalPrice(Menu menu, int quantity) {
     return menu.getPrice() * quantity;   
    }

    private int discount(Menu menu, int lambQuantity) {
        // 양꼬치 10인분에 음료수 하나
        int point = lambQuantity / 10;

        return menu.getPrice() * point;
    }
}

enum Menu {

    LAMB("양꼬치", 12000),
    DRINK("음료수", 2000);

    private final String name;
    private final int price;

    Menu(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
}

여담으로 내가 쓴 풀이는... 2줄이면 정답이 나왔다.^^

class Solution {
    public int solution(int n, int k) {
        int answer = 12000 * n + 2000 * (k - (int)(n / 10));
        return answer;
    }
}

참고한 웹페이지

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


열거체(enumeration type)

C와 C++에서는 열거체를 사용할 수 있지만, JDK1.5 이전의 자바에서는 열거체를 사용할 수 없었습니다.

JDK 1.5부터 C언어의 열거체보다 더욱 향상된 열거체를 정의한 Enum 클래스를 사용할 수 있습니다.

 

자바 열거체의 장점

1. 열거체를 비교할 때 실제 값뿐만 아니라 타입까지도 체크

2. 열거체를 상숫값이 재정의되더라도 다시 컴파일할 필요가 없음


열거체의 정의 및 사용

enum 키워드를 사용하여 열거체를 정의할 수 있습니다.

// enum 열거체이름 {상수1이름, 상수2이름, ...}
enum Food{PIZZA, RICE, BURGER, CAKE, RAMEN, SUSHI, STEAK, PASTA}

열거체를 사용하는 방법

# 열거체이름.상수이름
Food.STEAK

열거체의 상숫값 정의 및 추가

위와 같이 정의된 열거체의 첫 번째 상숫값은 0부터 설정되며,

그 다음은 바로 앞의 상숫값보다 1만큼 증가되며 설정됩니다.

또한, 불규칙한 값을 상숫값으로 설정하고 싶으면

상수의 이름 옆에 괄호(())을 추가하고, 그 안에 원하는 상숫값을 명시할 수 있습니다.

 

하지만 이때에는 불규칙한 특정 값을 저장할 수 있는 인스턴스 변수와 생성자를 다음과 같이 별도로 추가해야만 합니다.

enum Food{
	PIZZA(10), RICE(-1), BURGER(-13), CAKE(3), RAMEN(100), SUSHI(2), STEAK(0), PASTA(1);
    
    private final int value;
    Food(int value) { this.value = value;}
    public int getValue() { return value;}
}

java.lang.Enum클래스

Enum클래스는 모든 자바 열거체의 공통된 조상 클래스입니다.

Enum클래스에는 열거체를 조작하기 위한  다양한 메소드가 포함되어 있습니다.

 

values() 메소드

해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환합니다.

이 메소드는 자바의 모든 열거체에 컴파일러가 자동으로 추가해 주는 메소드입니다.

enum Food{PIZZA, RICE, BURGER, CAKE, RAMEN, SUSHI, STEAK, PASTA}

public class Enum01 {
	public static void main(String[] args) {
    	Food[] arr = Food.values();
        for(Food fd : arr) {
        	System.out.println(fd);
        }
   	}
}

/* 실행 결과
PIZZA
RICE
BURGER
CAKE
RAMEN
SUSHI
STEAK
PASTA
*/

 

valueOf() 메소드

전달된 문자열과 일치하는 해당 열거체의 상수를 반환합니다.

enum Food{PIZZA, RICE, BURGER, CAKE, RAMEN, SUSHI, STEAK, PASTA}


public class Enum02 {

	public static void main(String[] args) {

		Food fd = Food.valueOf("STEAK");
		System.out.println(fd);  // STEAK
	}

}

 

Ordinal() 메소드

해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환합니다.

이때 반환되는 값은 열거체 정의에서 해당 열거체 상수가 정의된 순서!

(상숫값 자체가 아님을 명심하자!!)

enum Food{PIZZA, RICE, BURGER, CAKE, RAMEN, SUSHI, STEAK, PASTA}

public class Enum03 {

	public static void main(String[] args) {
		int idx = Food.STEAK.ordinal();
        System.out.println(idx);  // 6
	}

}

다음 예제는 불규칙한 상숫값을 가지는 열거체에서 ordinal()메소드를 사용한 예제입니다.

enum Food{
	PIZZA(10), RICE(-1), BURGER(-13), CAKE(3), RAMEN(100), SUSHI(2), STEAK(0), PASTA(1);
    
    private final int value;
    Food(int value) { this.value = value;}
    public int getValue() { return value;}
}
public class Enum03 {

	public static void main(String[] args) {
        System.out.println(Food.STEAK.ordinal());  // 6
	}

}

 

대표적인 Enum메소드

메소드 설명
static E values() 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환함.
static E valueOf(String name) 전달된 문자열과 일치하는 해당 열거체의 상수를 반환함.
protected void finalize() 해당 Enum 클래스가 final 메소드를 가질 수 없게 됨.
String name() 해당 열거체 상수의 이름을 반환함.
int ordinal() 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환함.

 

728x90