[Java] 열거형 ENUM

szlee·2024년 8월 14일
0

Java

목록 보기
28/34

< 김영한의 실전 자바 - 중급편 > 강의를 보고 이해한 내용을 바탕으로 합니다.





열거형이 생겨난 이유는 무엇일까?

문자열 타입 안정성

예를 들어 문자열을 사용한다면

  • 타입의 안정성 부족 : 문자열은 오타가 발생하기 쉽고, 유효하지 않은 값이 입력될 수 있다.
    • 값의 제한 부족 : 잘못된 문자열을 실수로 입력할 가능성이 있다.
    • 컴파일 오류 감지 불가 : 이러한 잘못된 값은 컴파일 시에는 감지되지 않고 런타임에서만 문제가 발견되므로 디버깅이 어려워질 수 있다.
  • 데이터 일관성 : "GOLD", "gold", "Gold" 등 다양한 형식으로 문자열을 입력할 수 있어 일관성이 떨어진다.

=> 이러한 문제를 해결하기 위해서는 특정 범위로 값을 제한해야 한다.
예를 들어 BASIC, GOLD, DIAMOND 라는 정확한 문자만 메서드에 전달되어야 한다.
하지만 String은 어떤 문자열이든 받을 수 있기 때문에 자바 문법 관점에서는 아무런 문제가 없게된다.

문자열이 아닌 상수를 사용한다면? public static final String BASIC = "BASIC"
상수는 미리 정의한 변수명을 사용하므로 문자열을 직접 사용하는 것보다 안전하다.
하지만 문자열 상수를 사용해도 근본적으로 문제를 해결할 수는 없다.
왜냐하면, String 타입은 어떤 문자열이든 입력할 수 있기 때문에 어떤 개발자가 실수로 해당 클래스에 있는 문자열 상수를 사용하지 않고 직접 문자열을 사용해도 막을 수 있는 방법이 없기 때문이다.

열거형 - Enum Type

자바는 타입 안전 열거형 패턴을 매우 편리하게 사용할 수 있는 열거형(Enum Type)을 제공한다.
Enumeration은 일련의 명명된 상수들의 집합을 정의하는 것을 의미하며, 프로그래밍에서는 이러한 상수들을 사용하여 코드 내에서 미리 정의된 값들의 집합을 나타낸다.
=> 자바의 enum은 타입 안정성을 제공하고 코드의 가독성을 높이며 예상 가능한 값들의 집합을 표현하는데 사용된다.

public enum Grade {
 	BASIC, GOLD, DIAMOND
}
  • 열거형 정의 시 class 대신 enum을 사용한다. (하지만 열거형도 클래스다.)
  • 원하는 상수의 이름을 나열한다.
  • 열거형은 자동으로 java.lang.Enum을 상속받는다.
  • 외부에서 임의로 생성할 수 없다.

열거형(ENUM)의 장점

  • 타입 안정성 향상 : 열거형은 사전에 정의된 상수들로만 구성되므로 유효하지 않은 값이 입력될 가능성이 없다
  • 간결성 및 일관성 : 열거형을 사용하면 코드가 더 간결해지고 명확해지며 데이터의 일관성이 보장된다.
  • 확장성 : 새로운 회원 등급 타입을 추가하고 싶을 때 ENUM에 새로운 상수를 추가하면 된다.

주요 메서드

모든 열거형은 java.lang.Enum 클래스를 자동으로 상속받는다.
추가로 다른 클래스를 상속 받을 수 없다.
인터페이스를 구현할 수 있다.

  • values() : 모든 ENUM 상수를 포함하는 배열을 반환한다.
  • valuesOf(String name) : 주어진 이름과 일치하는 ENUM 상수를 반환한다.
  • name() : ENUM 상수의 이름을 문자열로 반환한다.
  • ordinal() : ENUM 상수의 선언 순서(0부터 시작)를 반환한다.
    • ordinal()은 가급적 사용하지 않는 것이 좋다.
    • 이 값을 사용하다가 중간에 상수를 선언하는 위치가 변경되면 전체 상수의 위치가 모두 변경될 수 있기 때문!
  • toString() : ENUM 상수의 이름을 문자열로 반환한다. name()메서드와 유사하지만 toString()은 직접 오버라이드 가능하다.
public enum Grade {
 	BASIC(10), GOLD(20), DIAMOND(30);
    
 	private final int discountPercent;
    
 	Grade(int discountPercent) {
 		this.discountPercent = discountPercent;
 	}
    
 	public int getDiscountPercent() {
 		return discountPercent;
 	}
    
 	//추가
 	public int discount(int price) {
 		return price * discountPercent / 100;
 	}
}
profile
🌱

0개의 댓글