[자바] enum

Kyu·2021년 2월 9일
0

Java 공부기록

목록 보기
31/40

enum 이 도입된 배경

예를들어.

public final static int APPLE = 1;
public final static int PEACH = 2;

public final static int GOOGLE = 1;
public final static int APPLE = 2;

APPLE이 겹친다.

어떻게 해결?

이름앞에 주석을 달아준다

FRUITE_APPLE
COMPANY_APPLE

더 간결하게 하려면?

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

더 간결 해졌다.

왜?

  1. 앞에 public static final 이라는 것을 암시적으로 가지고 있다.

  2. 아깐 접두사를 붙여서 각각의 이름의 충돌성을 낮추려고했는데 지금은 인터페이스를 통해서 그것이 과일인지 기업인지 상수를 격리시켰기떄문에 이름이 충돌할 확률이 없다.

그래도 문제가?

예를들어 FRUIT.APPLE == COMPANY.APPLE 하면,
상수가 똑같을 시에 실제로 true라고 나온다. 원래는 비교조차 안되는 건데 말이다.
그리고 컴파일 시에 문제도 없기 때문에 나중에 문제찾기가 굉장히 어렵다.

이 문제를 해결하려면?

먼저 문제가 발생한 원인을 보자
이유는 int라는 같은 데이터타입을 사용하기때문에 비교가 가능하다
만약에 좌,우항이 서로 다른 데이터타입을 사용하면 비교가 불가능할것이다

그러면 데이터타입을 다르게해보자.

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

class Company {
	public static final Fruit GOOGLE = new Fruit();
	public static final Fruit APPLE = new Fruit();
	public static final Fruit ORACLE = new Fruit();
}

데이터타입이 다르기 때문에 아예 서로 비교할 수가 없다

그런데 또 문제점이?

주로 상수를 쓰면 switch 문과 같이 사용하는데 switch 문에 들어올수있는 데이터타입은 primitive 데이터 타입과 그것을 참조형으로 바꾼것과 지금 배울 enum 밖에 쓸 수 없다.

enum 은 그럼 어떻게 사용하는가?

enum Fruit {
	APPLE, PEACH, BANANA;
}

위에 있는 class Fruit 보다 이와 같이 간결하게 사용이 가능하다.

enum을 굳이 사용하는 이유는?

  1. 코드가 단순해진다.
  2. enum도 사실상 클래스이지만 인스턴스 생성과 상속이 안되기 때문에 그것을 방지한다.
  3. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.

enum과 생성자


사진은 Fruit에 color라는 상태를 주었을 떄를 보여준다.
먼저 필드에 변수를 선언하고 그것을 생성자로 사진과 같이 사용하면 된다.

enum도 클래스이기 때문에 메소드도 사용이 가능하다.
color를 꺼낼 때 데이터를 보호하기 위해서
String을 리턴하는 getColor() 메소드를 만들어서 꺼내는 것도 바람직한 생각이다.

enum 하나씩 모두 호출

for(Fruit f : Fruit.values()){
	print(f);
}
profile
TIL 남기는 공간입니다

0개의 댓글