[Java] 열거형 - enum

2025. 2. 9. 23:12·TIL/Java

열거형이 왜 생겼을까?

열거형이 무엇인지보다 열거형이 생겨난 흐름에 대해서 알아보도록 하겠다

 

자바를 통해 애플리케이션을 작성할 때, 모든 데이터를 숫자를 통해서만 관리할 수는 없다. int형 long형 때로는 문자열을 통해서 데이터를 받고, 조작해야 한다. 예를 들어 자바를 통해 주유소 기계를 만든다고 생각해보자

요구사항

기름은 3가지를 선택할 수 있으며, 기름별로 요금이 다르다.

  • 경유  -> 1L : 1000
  • 휘발유 -> 1L : 2000
  • 고급유 -> 1L : 3000

주유 받을 기름을 선택하고, 몇 리터를 넣을지 선택하면 얼마를 내야하는지 계산하도록 만들어보자

 

import java.util.Scanner;

public class OilMachineMain {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("주유 받을 기름을 입력해주세요 : ");
        String oil = sc.nextLine();
        System.out.println("주유 받을 양을 입력해주세요 : ");
        int amount = Integer.parseInt(sc.nextLine());
        
        if (oil.equals("경유")){
            System.out.println("금액은 " + 1000 * amount + " 원입니다");
        } else if (oil.equals("휘발유")) {
            System.out.println("금액은 " + 2000 * amount + " 원입니다");
        } else if (oil.equals("고급유")) {
            System.out.println("금액은 " + 1000 * amount + " 원입니다");
        } else{
            System.out.println("존재하지 않는 기름 종류 입니다");
        }
    }
}

 

이렇게 되면 간단하게 주유소 기계의 기능을 구현한 것 같지만 그렇지 않다

 

문제점

  • 오타가 나면 제대로 된 금액을 알 수 없다
  • 기름 값 변동이 생겼을 때, 매번 코드를 수정해주어야 한다
  • 새로운 기름이 생겼을 때도 코드를 수정해주어야 한다

물론 지금은 매우 간단한 로직만을 갖고 있기에 문제 없겠지만 규모가 커지고 기능이 다양해지면 유지보수가 쉽지 않을 것이다.

public class Oil {

    public static final String 경유 = "경유";
    public static final String 휘발유 = "휘발유";
    public static final String 고급유 = "고급유";

}
import java.util.Scanner;

public class OilMachineMain2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("주유 받을 기름을 입력해주세요 : ");
        String oil = sc.nextLine();
        System.out.println("주유 받을 양을 입력해주세요 : ");
        int amount = Integer.parseInt(sc.nextLine());

        if (oil.equals(Oil.경유)){
            System.out.println("금액은 " + 1000 * amount + " 원입니다");
        } else if (oil.equals(Oil.휘발유)) {
            System.out.println("금액은 " + 2000 * amount + " 원입니다");
        } else if (oil.equals(Oil.고급유)) {
            System.out.println("금액은 " + 1000 * amount + " 원입니다");
        } else{
            System.out.println("존재하지 않는 기름 종류 입니다");
        }
    }
}

 

다음과 같은 문자열 상수를 만들어보았지만 여전히 String을 받아서 String과 비교할 수 있기 때문에 의도치 않은 값이 들어올 수 있다.

또한 Oil 객체를 직접 만드는 일이 생길 수도 있다

애초에 현재 목록에 있는 값만 가질 수 있는 자료형이 필요하다

 

타입 안전 열거형 패턴

  • 위에서 발생한 문제를 해결하기 위해 오랜 기간 고민 끝에 나온 결과가 바로 타입 안전 열거형 패턴이다
  • 타입 안전 열거형 패턴을 활용하게 되면 목록에 있는 값만 활용할 수 있다
  • 이를 직접 구현해볼 수 있다
public class OilTypeEnum {

    public static final OilTypeEnum 경유 = new OilTypeEnum();
    public static final OilTypeEnum 휘발유 = new OilTypeEnum();
    public static final OilTypeEnum 고급유 = new OilTypeEnum();

    private OilTypeEnum() {
        
    }
}

 

타입 안전 열거형 패턴을 사용하게 되면 정해진 객체만 사용할 수 있기 때문에 잘못된 값을 입력하는 근본적인 문제를 방지할 수 있다

또한 생성자를 private으로 설정해두어 현재 나열된 목록 외에는 생성 및 선택이 불가능하다

 

다만 이 패턴을 구현하려면 많은 코드를 작성해야 한다. 따라서 자바에서 enum 을 제공해준다

 

열거형 - Enum Type

public enum OilType{
   경유, 휘발유, 고급유
}

 

이렇게 하면 위와 동일한 기능을 하게 된다

 

열거형은 사실 클래스이기 때문에 내부에서 필드, 메서드 등 모두 선언이 가능하다

이를 모두 활용해서 기존 코드를 리팩터링 해보자

 

package enumeration.blog;

public enum OilEnum {
    경유(1000),
    휘발유(2000),
    고급유(3000);

    private int pricePerL ;

    OilEnum(int price) {
        this.pricePerL = price;
    }

    public int getTotalPrice(int amount) {
        return pricePerL * amount;
    }
}
import java.util.Scanner;

public class OilMachineMain4 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        OilEnum oil = OilEnum.경유;
        System.out.println("주유 받을 양을 입력해주세요 : ");
        int amount = Integer.parseInt(sc.nextLine());

        if (oil == OilEnum.경유){
            System.out.println("금액은 " + OilEnum.경유.getTotalPrice(amount) + " 원입니다");
        } else if (oil == OilEnum.휘발유) {
            System.out.println("금액은 " + OilEnum.휘발유.getTotalPrice(amount) + " 원입니다");
        } else if (oil == OilEnum.고급유) {
            System.out.println("금액은 " + OilEnum.고급유.getTotalPrice(amount) + " 원입니다");
        } else{
            System.out.println("존재하지 않는 기름 종류 입니다");
        }
    }
}

'TIL > Java' 카테고리의 다른 글

[Java] 제네릭 개요  (1) 2025.02.15
[Java] 날짜와 시간 데이터 다루기  (0) 2025.02.11
[Java] 래퍼 클래스  (1) 2025.02.09
[Java] String 클래스  (0) 2025.02.07
[Java] 불변 객체  (0) 2025.02.06
'TIL/Java' 카테고리의 다른 글
  • [Java] 제네릭 개요
  • [Java] 날짜와 시간 데이터 다루기
  • [Java] 래퍼 클래스
  • [Java] String 클래스
Charlie.han
Charlie.han
백엔드 개발자가 되기 위해 공부한 것들(Java, Spring, SQL, 네트워크, AWS 등)을 기록하고 공유하는 블로그입니다.
  • Charlie.han
    Chalie's Devlog
    Charlie.han
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • TIL (32)
        • Java (20)
        • Spring (2)
        • SQL (5)
        • 알고리즘 (4)
        • 트러블슈팅 (1)
      • WIL (0)
        • 카카오테크 부트캠프 (0)
  • 태그

    인스턴스
    unsupported characters for the charset 'iso-8859-1'
    sql limit
    static메서드
    프로그래머스 소수찾기
    default메서드
    다형성
    불변객체
    프로그래머스 베스트앨범
    static 필드
    데이터베이스
    jdk란?
    프로그래머스
    sql where
    컬렉션프레임워크
    자바
    인터페이스
    제네릭 클래스
    프로그래머스 베스트앨범 자바
    타입안전열거형
    프로그래머스 소수찾기 자바
    인텔리제이한글
    Java
    SQL
    object
    인텔리제이 한글 깨짐
    super()
    묵시적형변환
    string
    참조공유
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Charlie.han
[Java] 열거형 - enum
상단으로

티스토리툴바