[Java] enum을 사용하는 이유를 알기 위한 활용 예제: class -> interface -> enum

김하밍·2024년 3월 8일
0

Java

목록 보기
28/46
 /*
  * 1. 사과
  * 2. 복숭아
  * 3. 바나나
  */

int type = 1;
switch(type) {
	case 1:
    	System.out.println(57);
        break;
    case 2:
    	System.out.println(34);
        break;
    case 3:
    	System.out.println(93);
        break;

과일의 종류에 따라 다른 kcal가 출력되어야 하는 프로그램이 설계되어야할 때, 위와 같이 숫자에 따른 과일의 종류가 적힌 표가 있어야만 int type = ? 에 직접 번호를 변경해야 하는 문제가 있습니다.

주석으로 작성되어있는 표를 주석이 필요없는 좋은 문법을 사용한 코드로 관리하는 방법

1. class
2. interface
3. enum

class ver.

class ConstantDemo {
	private final static Fruit APPLE = 1;
    private final static Fruit PEACH = 2;
	private final static Fruit BANANA = 3;
}

final을 붙여서 변수의 값이 한 번 정해지면 바뀌지 않는다는 것을 보장해주고, static을 붙여서 인스턴스마다 달라지는 정보가 아니라서 클래스의 소속으로 명시해줍니다.

하지만, 또 다른 그룹 '기업의 이름'에 대한 상수가 필요해질 수 있습니다.

private final static int GOOGLE = 1;
private final static int APPLE = 2;
private final static int ORACLE = 3;

이렇게 되면 과일애플과 기업애플의 변수이름이 겹치게 되어 컴파일러가 겹치는 이름이 있다고 오류를 내비춰줍니다. 이렇게 내가 모르는 사이에 발생하는 문제를 컴파일러가 잡아줄 수 있도록 자바 문법을 활용하여 코드를 작성하는 것, 드러날 수 있도록 아키텍처링을 하는 것은 중요합니다.
FRUIT_APPLE과 COMPANY_APPLE 과 같이 이름에서 명시해줄 수 있지만, 코드를 간결하게 해줄 수 있는 interface를 사용합니다.

interface ver.

interface FRUIT {
	int APPLE = 1, PEACH = 2, BANANA = 3;
}

interface COMPANY {
	int GOOGLE = 1, APPLE = 2, ORACLE = 3;
}

이렇게 문법적으로 해결할 수 있습니다.

하지만,

if(FRUIT.APPLE == COMPANY.APPLE) {
	System.out.println("과일애플과 기업애플은 같습니다.");
}

위와 같은 비교를 물어보는 코드가 존재할 수 있습니다.

과일과 기업은 서로 비교조차 할 수 없게 즉, 컴파일러가 에러를 발생시켜서 검증할 수 있게 만들어야 하는데, 만약에 두 APPLE끼리 똑같은 1로 선언되어 있다면 같아서 내부가 출력되는 문제가 발생합니다.

같은 그룹이 아니도록 해결하면 비교 자체가 불가능해질 것입니다.

class ver2.

class Fruit {
	public final static Fruit APPLE = new Fruit();
    public final static Fruit PEACH = new Fruit();
	public final static Fruit BANANA = new Fruit();
}

데이터 타입으로 Fruit를 지정하고, APPLE은 new Fruit() 으로 자기 자신을 인스턴스화해서 값을 상수에 넣습니다. 매번 인스턴스화를 각각 해주기 때문에 상수들은 모두 각자 다른 값을 가지게 됩니다.

이렇게 변경하고 나면, if문에서 컴파일러 에러가 납니다.

switch문의 조건으로 들어가있던 int형의 type은 int -> Fruit 그리고, Company 타입으로 변경해주어야 합니다.
하지만, 변경하더라도 switch의 조건으로는 제한된 데이터 타입만을 사용할 수 있기 때문에 switch문을 사용하지 못하게 됩니다.
switch문이 가독성이 좋은데 사용하지 못하게된다는 것은 디자인 패턴에 문제가 있다는 의미입니다.

그래서 swith문의 조건으로 들어갈 수 있는 enum을 사용하여 관리하도록 변경합니다.

enum ver.

enum {
	APPLE, PEACH, BANANA
}

enum {

enum을 사용하여 리팩토링한 위 코드는 class ver2. 와 같은 코드입니다.

enum은 열거형(enumerated type) 이라고 부릅니다.
열거형은 서로 연관된 상수들의 집합이며, 해당 예제에서는 FruitCompany가 서로 열거 관계인 셈입니다.


[함께 학습할 내용]
enum의 특성과 활용 예제

profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글