티스토리 뷰

자바 로고

 

 

 

 

Enum은 상수 역할을 하는 것은 알겠지만 정확히 어떻게 써야 할지를 몰라서 아예 안 쓰고 있었다.

이론만 공부해서는 실제 개발을 할 때 어떠한 방법으로 써야 할지를 모르겠고 어떻게 써야 잘 썼는지도 모르고 있었다.

그래서 이번에 Enum 열거형을 공부하면서 앞으로 내 코드에 녹여보고 사용해 보는 것이 목표로 작성하게 되었다.

 

코딩고양이
해피 고양이

 

 

 

 

 

 

열거형의 정의와 열거 타입 변수 선언

 

Enum(이넘)은 어떻게 선언 할까? 아래를 보자!

enum 열거형이름 { 상수명1, 상수명2, ...}

 

 

이것만 보고 다들 어떻게 사용하는지 알 수 있을까...?  모르는 사람이 보면 "어떻게 하란 말이야!" 라고 말이 나올 것 같다.

 

그래서 실제 선언을 해줄 때 아래처럼 생성한다.

다음에는 우선은 메소드까지만 알아보고 설명을 들으면 이해가 빠를 수가 있다. 

public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

 

손흥민 사진
손흥민 또잉

 

 

 

 

 

열거 객체의 메소드

 

제 글만 보는 게 아닌 공식 문서, 공식 JAVA API를 들어가서 아 이런 게 있구나를 봐야 합니다. 

JAVA17 API : Enum

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Enum.html

 

Enum (Java SE 17 & JDK 17)

Type Parameters: E - The type of the enum subclass All Implemented Interfaces: Serializable, Comparable , Constable This is the common base class of all Java language enumeration classes. More information about enums, including descriptions of the implicit

docs.oracle.com

 

 

1. name()

열거 객체가 가지고 있는 열거형 상수의 이름을 문자열(String)로 리턴합니다.

이때 리턴되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일합니다.

public enum Week {
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY
}
    
Week today = Week.SUNDAY;
String name = today.name();

System.out.println(name);
// 출력 : SUNDAY

 

 

 

2. ordinal()

열거형 상수가 정의된 순서로 0부터 정수로 반환합니다.

즉, 전체 열거 객체 중 몇 번째 열거 객체인지 인덱스 값을 리턴하는 것입니다.

public enum Week {
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY
}
    
Week today = Week.SUNDAY;
int index = today.ordinal();

System.out.pringln(index);
// 출력 : 6

 

 

 

3. compareTo()

열거형 상수끼리는 비교연산자가 사용불가능 합니다. 

그럼 이런 열거형 상수 끼리의 비교는 어떻게 할까요?! 바로 CompareTo()를 사용하여 비교합니다.

 

예를 들자면, 나.compareTo(비교할 자식) 이런 식으로 사용해 버리고 음수가 나오면 나보다 비교할 자식이 크다는 것이고 나하고 비교할 자식만 봤을 때 오름차순으로 정렬되어 있다고 생각하시면 됩니다.

그에 반대로 양수가 나온다면 나와 비교할 자식은 내림차순으로 정렬되어 있다고 생각하면 빠를 겁니다. 

public enum Week {
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY
}
    
Week me = Week.MONDAY;
Week other = Week.WEDNESDAY;
int aec = me.compareTo(other);
int desc = other.compareTo(me);


System.out.println(aec);
System.out.println(desc);
// 출력 
// -2
// 2

 

 

 

4. valueOf()

지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

public enum Week {
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY
}
    
Week result = Week.valueOf("MONDAY");

System.out.println(result);
// 출력 : MONDAY

 

이해가 되셨나요!? 안되셨나요!?

뭔가 이해가 절대 안 되었을 것 같아요 뭔가 조금 알고 계시는 분은 아 이런 것이구나 라고는 생각 들 거 같아요!

 

 

 

우선 Enum은 여러 상수를 정의할 때 사용하면 유용합니다.

그럼 상수 무엇일까요? 바로  변하지 않고 항상 일정한 값을 갖는 수입니다.!

그럼 진짜 실전으로 사용하면서 배웁시다! 어떻게 사용할까요? 

 

 

 

 

 

Enum 실전 예시 코드

 

일반적인 사용 방법으로는 앞서 위에 봤던 대로 속성 없이 상수를 나열만 하고 직접 접근하거나 메서드를 이용해서 접근하여 사용했다.

 

A) 일반적인 사용방법 + 속성 1개

 

A-1. Enum 파일 생성

더보기
public enum Food {
	PIZZA(20000), STEAK(35000), PASTA(15000), SALAD(9900);

	private final int price;
    
	private Food(int price) {
		this.price = price;
	}

	public int getPrice() {
		return price;
	}
}

 

A-2. 사용 및 구현

더보기
import java.util.ArrayList;
import java.util.List;

public class RestaurantOrder {
	private List<Food> order;

	public RestaurantOrder() {
		order = new ArrayList<>();
	}

	public void addFood(Food food) {
		order.add(food);
	}

	public int calculateTotalPrice() {
		int totalPrice = 0;
		for (Food food : order) {
			totalPrice += food.getPrice();
		}
		return totalPrice;
	}

	public static void main(String[] args) {
		RestaurantOrder order = new RestaurantOrder();

		// 음식을 주문에 추가합니다.
		order.addFood(Food.PIZZA);
		order.addFood(Food.STEAK);
		order.addFood(Food.PASTA);
		order.addFood(Food.SALAD);

		// 주문의 총 가격을 계산합니다.
		int totalPrice = order.calculateTotalPrice();
		System.out.println("총 가격: " + totalPrice);
	}
}

 

A-3. 실행 결과

더보기
총 가격: 79900

 

 

 

 

B) 일반적인 사용 방법 + 속성 2개 이상

 

B-1. Enum 파일 생성

더보기
public enum Color {

	RED("빨강",1000), GREEN("초록",1100), BLUE("파랑",1300); 
    
	private final String colorName;
	private final int pay;

	private Color(String colorName, int pay){ 
		this.colorName = colorName;
		this.pay      = pay;
	}
    
	public String getColor() { return colorName; }
	public int getPay() { return pay; }

	public void colorInfo(){ 
		System.out.println(colorName +"의 비용은 " + pay +"원 입니다."); 
	} 
}

 

B-2. 사용 및 실행 결과

더보기
Color.BLUE.colorInfo();
// 출력 : 파랑의 비용은 1300원 입니다.

Color color = Color.valueOf("RED");
System.out.println("색깔: " + color.getColor());
System.out.println("비용: " + color.getPay() + "원");
// 출력 : 색깔: 빨강
// 출력 : 비용: 1000원

Color color = Color.RED;
System.out.println("색깔: " + color.getColor());
System.out.println("색깔: " + color.name());
// 출력 값이 빨강으로 동일 하다 getColor 메소드는 Enum이름을 가져오는 식으로구현 했기 때문에

 

B-3. 상수를 가져오는 방법

더보기

Color.valueOf("RED") : (RED와 같은)주어진 문자열과 일치하는 Enum 상수를 반환합니다. 문자열과 일치하는 Enum 상수가 없을 경우 IllegalArgumentException이 발생합니다.

Color.RED : Enum에서 정의된 상수에 직접 접근하는 방법입니다.

 

즉, 두 방법 모두 Enum 상수를 반환하므로 결과적으로 동일한 Enum 상수를 가져옵니다

Color.RED처럼 사용하는 것은 더 직관적이고 간결한 방법이여서 일반적으로 많이 사용하는 방법입니다 또한, valueOf 메서드를 사용하는 것은 동적인 상황에서 문자열로부터 Enum 상수를 가져와야 할 때 사용합니다.

 

앞으로 저희가 사용하는 상황에 따라서 다르게 사용해 볼 수 있게 해볼까요?

 

 

 

 

 

 

 

C) 추상메소드 사용과 재정의

 

열거형에 추상 메서드를 선언할 일은 많지 않으므로 가볍게 참고만 하시면 됩니다!

C-1. Enum 파일 생성

더보기
public enum Transportation {
	BUS(1250)      {  int fare(int distance) {  return distance + BASIC_FARE; } },
	TRAIN(1250)    {  int fare(int distance) {  return distance - BASIC_FARE; } },
	SHIP(5000)     {  int fare(int distance) {  return (distance * BASIC_FARE) + 1000; } },
	AIRPLANE(6000) {  int fare(int distance) {  return (distance * BASIC_FARE) * 2; } };
    
    protected final int BASIC_FARE;	// protected로 해야 각 상수에서 접근 가능하다.
    
    private Transportation(int basicFare) {
		BASIC_FARE = basicFare;
    }
    
    public int getBasicFare() { return BASIC_FARE; }
    
    abstract int fare(int distance);	// 거리에 따른 요금 계산
}

 

 

C-2. 사용

더보기
System.out.println("BUS의 비용 : " + Transportation.BUS.fare(100));
System.out.println("TRAIN의 비용 : " + Transportation.TRAIN.fare(100));
System.out.println("SHIP의 비용 : " + Transportation.SHIP.fare(100));
System.out.println("AIRPLANE의 비용 : " + Transportation.AIRPLANE.fare(100));

 

C-3. 결과

더보기
BUS의 비용 : 1350
TRAIN의 비용 : 1350
SHIP의 비용 : 501000
AIRPLANE의 비용 : 1200000

 

 

 

 

예시 코드로 작성하는 것말고 어떠한 경우에 사용하게 될까? 라고 생각해보면

 관리자, 매니저, 사용자 같은 역할을 열거형으로 사용할 수 도 있을 것같다.

 

 

또한, CREATE, UPDATE, READ, DELETE와 같은 권한을 열거형으로 사용하여 사용자에게 권한을 주는 용도로도 사용할 수 있을 것 같다.

 

 

 

 

 

 

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함