본문 바로가기
My Image
프로그래밍/Java

[Java] enum 이란?

by Lim-Ky 2017. 6. 27.
반응형

Enum class란?

 

우리가 흔히 상수를 정의할 때 final static string 과 같은 방식으로 상수를 정의를합니다. 하지만 이렇게 상수를 정의해서 코딩하는 경우 다양한 문제가 발생됩니다. 

따라서 이러한 문제점들을 보완하기 위해 자바 1.5버전부터 새롭게 추가된 것이 바로 "Enum" 입니다.

Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미합니다.

기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있습니다.

 

Enum의 장점

 

Enum을 사용하면서 우리가 얻을 수 있는 이점은 다음과 같습니다.

 

1. 코드가 단순해지며, 가독성이 좋습니다.

2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장됩니다.

3. enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크한다.

4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있습니다.

 

예제를 보면서 enum의 장점을 하나씩 찾아봅시다.

 

 

package EnumExample;

public class EnumExample {
	// 기존에 상수를 정의하는 방법
	public static final String MALE = "MALE";
	public static final String FEMALE = "FEMALE";

	public static void main(String[] args) {
		String gender1;
		gender1 = EnumExample.MALE;
		gender1 = EnumExample.FEMALE;
		// MALE, FEMALE이 아닌 상수 값이 할당 될 때 //컴파일시 에러가 나지 않음. -> 문제점 발생.
		gender1 = "boy";
		Gender gender2;
		gender2 = Gender.MALE;
		gender2 = Gender.FEMAL;
		// 컴파일 시 의도하지 않는 상수 값을 체크할 수 있음.
		// Enum으로 정의한 상수값만 할당 받을 수 있음.
		gender2 = "boy";
	}
}

// enum class를 이용해 Gender라는 새로운 상수들의 타입을 정의한다.
enum Gender { 
	MALE,
	FEMAL; 
}

위 코드를 분석해보겠습니다.

 

기존의 상수를 정의하는 방법에 따라 다음과 같이 상수를 정의했습니다.

public static final String MALE = "MALE";

public static final String FEMALE = "FEMALE";

 

그리고 String gender1; 을 통해 우리가 정의한 상수타입과 같은 String 타입의 변수 gender1을 선언합니다.

static 키워드를 통해 인스턴스없이 상수를 사용할 수 있도록 MALE, FEMALE 을 정의했기 때문에

 

다음과 같이 gender1의 각각 원하는 상수를 할당 할 수 있습니다.

gender1 = EnumExample.MALE;

gender1 = EnumExample.FEMALE;

 

여기까지는 큰 문제가 없어보입니다.

하지만 우리가 기대하는 MALE, FEMALE 의 상수가 아닌 gender1과 같은 타입이면서 엉뚱한 값이 들어간다면 이야기는 달라집니다.

즉 아래와 같이 gender1이라는 변수에 우리가 원치않는 "boy" 라는 값이 실수로 할당되었을 때 

따로 우리가 기대하는 상수값이 할당되었는지 안되었는지에 대한 유효성을 검사하는 로직이 들어가 있지 않다면,

런타임시 문제가 발생할 것이고, 우리가 원치않은 상수값이 애당초 할당되었기 때문에 엉뚱한 결과값을 얻을 수 있습니다.

 

gender1 = "boy";

 

이러한 문제가 발생하는 것은 자바 컴파일시 문제점을 발견할 수 없기 때문입니다.

자바입장에서는 String이라는 타입에 String 값이 할당되었기 때문에 이상하지 않습니다.

만약 상수가 무수히 많고 복잡하다면, 이 잠재적인 문제는 프로그램의 치명적인  오작동을 초래할 수 있습니다.

 

위 문제를 해결하기 위해 enum을 사용해봅시다.

 

예제 아래쪽 코드를 보면 enum을 통해 Gender라는 상수타입을 정의했습니다.

enum Gender{  
	MALE,
	FEMAL;    
}

 

그리고나서 다음과 같이 Gender 타입으로 gender2라는 변수를 선언합니다.

 

Gender gender2;

gender2가 Gender타입이기 때문에 다음과 같이 Gender타입인 MALE, FEMALE을 할당 할 수 있습니다.

gender2 = Gender.MALE;

gender2 = Gender.FEMAL;

 

여기서 의문점이 드셔야합니다. enum class의 인스턴스를 따로 생성하지 않고 바로 MALE, FEMALE 접근하였는데.

내부적으로 생략되었을 뿐 다음 class와 같습니다.

 

class Gender{

	public static final Gender MALE = new Gender();
	public static final Gender FEMALE = new Gender();

}

static이 생략되었을 뿐 엄연히 enum class 안에 정의된 상수들은 static 변수 효과를 나타내는 것이죠.

 

이제 아까와 같은 실수로 값을 잘못 할당했을 경우를 봅시다.

 

gender2 = "boy";

 

gender2라는 타입은 Gender라는 상수타입인데 String 타입인 boy를 할당하려고하니 컴파일에러가 발생됩니다.

즉 컴파일시 우리가 기대하지 않는 상수값의 할당을 사전에 체크할 수 있는 것입니다.

 

간단한 예제이지만 enum의 장점을 느낄 수 있었으면 좋겠습니다.

enum에 대해서 오늘은 enum이 어떤 녀석인지 알았다면 성공입니다. 

 

다음 시간은 enum을 좀더 심화해서 알아보고 또 enum을 어떻게 활용하는지에 대해서 알아보도록하겠습니다.

 

 

감사합니다~

 

 

2017/07/27 - [프로그래밍/Java] - [Java] Enum의 사용법

 

 

 

 

 

 

반응형

댓글