[Java] ENUM

벼랑 끝 코딩·2025년 2월 26일
0

Java

목록 보기
21/40

데이터 입력

우리는 종종 객체 간에 데이터를 공유할 때, 상태를 입력해야 하는 경우가 있다.
예를 들어, 인증을 위해 휴대폰 기종과 번호를 입력해야 한다고 가정하자.

public void sendSmartphoneType(String type, String phoneNumber) {
	// 메서드 바디
}

// 사용 예시
sendSmartphoneType(SKT, 01012345678);
sendSmartphoneType(UPLUS, 01012345678);
sendSmartphoneType(KT, 01012345678);

문제점

sendSmartphoneType(SKT, 01012345678);
sendSmartphoneType(UPLUS, 01012345678);
sendSmartphoneType(KT, 01012345678);

하지만 이 경우, 통신사 매개변수를 입력할 때,
사용자가 무조건 올바르게 입력할 수 있을 것이란 보장이 없다.
키보드가 한번 더 눌려서 'SKTT' 라고 입력하지 않을거란 보장이 있는가?

아니면, 통신 3사 이외에 다른 통신사가 있다고 가정할 때,
지정하지 않은 통신사를 입력되지 않을 것이란 보장이 있는가?

public void sendSmartphoneType(String type, String phoneNumber)

메서드의 통신사 유형 매개변수는 String이기 때문에
사용자는 String 범주 내에서 그 무엇이든 입력할 수 있다.

여기서 우리는 기대하지 않은 값이 입력되는 문제가 있을 수 있다는 점을 알 수 있다.

타입 안전 열거형 패턴

기대하지 않은 값이 입력되는 것을 막기 위해,
타입 안전 열거형 패턴이라는 개념이 등장한다.

class Type {

	// ** 상수 사용 전용 클래스인 Type이 외부에서 생성되지 않도록 private 생성자 **
	private Type() {
    }

	// ** 상수 선언 **
	public static final Type SKT = new Type();
    public static final Type UPLUS = new Type();
    public static final Type KT = new Type();
}

public void sendSmartphoneType(Type type, String phoneNumber)

private 생성자

먼저, 상수 사용만을 위한 클래스인 Type을
외부에서 누군가 잘못 생성하는 일이 없도록, private 생성자를 만들어둔다.

private Type() {
}

이럴 경우, 누군가 'Type 클래스는 뭐지?' 하면서 생성해서 사용할 일이 없고,
온전히 Type 클래스 내부에 선언된 상수만을 활용할 수 있는 구조가 만들어진다.

타입 변경

예를 들어 String 타입의 매개 변수를 사용할 경우,
사용자가 String 타입 범주 내에서 임의의 값을 입력할 수 있다는 문제가 있었다.
타입을 제한하기 위해, 생성한 클래스로 인스턴스를 생성하여 타입을 변경한다.

public static final Type SKT = new Type();
public static final Type UPLUS = new Type();
public static final Type KT = new Type();

이제 사용자는 메서드를 사용할 때, 매개변수에 정해진 타입만을 사용해야 하는데
그 타입에 사용할 수 있는 것은 상수들 뿐이라,
임의의 값이 입력될 걱정이 없다!

sendSmartphoneType(TYPE.SKT, 01012345678);
sendSmartphoneType(TYPE.UPLUS, 01012345678);
sendSmartphoneType(TYPE.KT, 01012345678);

ENUM

하지만 이 과정은 꽤나 번거롭다.
데이터를 한정하여 입력을 받는 메서드가 늘어날 때마다,
클래스를 생성한 뒤 private 생성자를 만들고
public static final 키워드를 사용한 상수를 일일이 만들어야 한다.

자바는 타입 열거형 패턴을 보다 편리하게 이용하기 위한 ENUM을 지원한다.
ENUM은 enum 키워드를 사용하여 생성할 수 있다.

enum Type {
	SKT, UPLUS, KT
}
  • ENUM은 private 생성자를 자동 생성하여 외부 생성을 제한한다.
  • ENUM은 변수에 private static final 키워드를 상수화하고, 객체를 자동 생성한다.

ENUM도 클래스다.

ENUM도 클래스이기 때문에 필드를 가질 수 있으며, 생성자로 초기화할 수 있다.
또한, 메서드도 가질 수 있다.

enum Type {
	SKT(10), UPLUS(9), KT(8) // 필드 생성자 초기화
    
    private int price; // 필드 선언
    
    private Type(int price) {
    	this.price = price;
    }
    
    public int getPrice() { // get() 메서드
    	return price;
    }
    
    public int getDiscountPrice(int discount) { // 또 다른 메서드
    	return price - discount;
    }
}

통신사 별 가격이 있다고 하면, 필드를 생성한 후 값을 초기화할 수 있다.
그리고 그 값은 get() 메서드를 통하여 얻을 수도 있다.
다른 매개변수를 포함한 다양한 메서드도 선언할 수 있다.

마무리

데이터 입력을 제한하기 위한 ENUM을 알아봤다.
ENUM은 또한 클래스이기 때문에,
필드와 메서드 선언이 가능했다.
ENUM을 최대치로 활용할 수 있는 방법에 대해 앞으로도 계속 고민해보자.

profile
복습에 대한 비판과 지적을 부탁드립니다

0개의 댓글