[Java] enum의 생성자와 열거상수 필드 알아보기.

2021-02-13


enum에는 단순 열거 상수형 필드 값만 주는 것이 아닌, 생성자를 통해서 새로운 열거 상수와 대응하는 데이터를 생성자를 통해서 연결시킬 수 있는데, 오늘은 그 방법을 알아보자.


- 전체코드 

 

생성자가 있다는 것은 매개변수 값을 줄 수 있다는 소리이다. 하지만 방법이 조금 특이하다. 일단 아래 전체 코드를 한번 쭉 살펴보자.

package practice_00_enum;

public class Main3 {
	
	// 열거타입은 클래스 내부에서도 생성할 수 있다.
	public enum Number{
		NO_1("홍길동"),
		NO_2("둘리"),
		NO_3("고길동");
		// 마지막 열거상수 소괄호 옆에는 ; 을 적어주어야 한다.
		
		private String name;
		// 열겨형 상수와는 다른 값을 연결하기 위해
		// 선언한 변수
		
		//enum의 생성자는 private만 허용한다.
		private Number(String name) {
			this.name = name;
			// name 을 매개값으로 전달받아 
			// 열거상수 옆 ( ) 에 있는 데이터를
			// 하나씩 가져온다.
		}
		
		
		public String getName() {
			return name;
		} // 열거형 메소드
		
	}
	
	public static void main(String[] args) {
		
		System.out.println(Number.NO_1.name);
		System.out.println(Number.NO_1.getName());
		// 두 출력문 모두 결과가 같다.
	}

}

- 열거상수 

 

이제 차근차근 코드를 하나씩 분석해보도록 하며, 우선 열거상수 필드 부터 살펴보자.

		NO_1("홍길동"),
		NO_2("둘리"),
		NO_3("고길동");

 

위와 같이 상수 필드 옆에 소괄호가 선언되어 있고, 그 안에 String 타입의 매개변수가 들어가는 것을 볼 수 있다. 즉 enum의 생성자는 열거 상수 옆에 붙는 형식으로 사용된다. (그 이유는 enum의 생성자는 private이기 때문에 외부에서 접근할 수 없다.)


- 생성자

 

예로 첫번째 열거상수 No_1의 소괄호(생성자)에는 "홍길동"이라는 문자열이 생성자의 매개값으로 들어갔다. 그러면 코드는 아래와 같이 실행될 것이다. 

		private String name;
		// 열겨형 상수와는 다른 값을 연결하기 위해
		// 선언한 변수
		
		//enum의 생성자는 private만 허용한다.
		private Number("홍길동") {
			this.name = "홍길동";
			// name 을 매개값으로 전달받아 
			// 열거상수 옆 ( ) 에 있는 데이터를
			// 하나씩 가져온다.
		}

 

코드를 살펴보면 선언된 변수 name("홍길동") 이 생성자의 매개값으로 들어가게 된다. 이후 생성자안에서 this.name으로 열거상수에 대응되는 또 다른 데이터가 하나 생기는 것을 확인할 수 있다. 즉 name이 "홍길동"으로 초기화 되면서, NO_1의 인스턴스 값으로 "홍길동"이 들어가는 것이다.


- 실행결과

 

	public static void main(String[] args) {
		
		System.out.println(Number.NO_1.name);
		System.out.println(Number.NO_1.getName());
		// 두 출력문 모두 결과가 같다.
	}

메인메소드 내부의 출력문으로 각 열거상수의 name 필드를 확인하면 아래와 같다. (getName 메서드로 Name을 리턴하는 방식으로 출력해도 결과는 똑같다.)