Limky의 삽질블로그

[Java] Enum의 사용법 본문

Java

[Java] Enum의 사용법

Limky Lim-Ky 2017.07.27 15:29


안녕하세요. 지난 시간엔 EnumClass가 무엇이고 어떤 장점들이 있는지 알아보았습니다.

2017/06/27 - [Java] - [Java] enum 이란? (enum 개념익히기)


이번 시간은 Enum 사용방법을 더 알아보면서 Enum에 대한 이해를 심화시켜보겠습니다.


지난 시간 공부했던 Enum에 대해서 잠시 정리하자면,


1. 클래스처럼 보이게 하는 상수

2. 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의하는 것

3. Enum 클래스 형을 기반으로 한 클래스형 선언 


정도로 요약할 수 있습니다.


1. Enum을 이용한 열거형 선언하기


EnumClass는 다른 클래스와 마찬가지로 별도의 java파일, 클래스 안, 클래스 밖 선언 가능



1) 별도의 .java 선언


DevType.java

package EnumExample;

public enum DevType {

	MOBILE, WEB, SERVER
}

Developer.java

package EnumExample;

public class Developer {
	
	public String name;
	public int career;
	public DevType type;
	
}



2) Class 내부에서 선언


Developer.java

package EnumExample;
package EnumExample;

public class Developer {
	
	public String name;
	public int career;
	public enum DevType {

		MOBILE, WEB, SERVER
	}

}



3) Class 외부에서 선언


Develoer.java

package EnumExample;

public class Developer {
	
	public String name;
	public int career;
	public DevType type;

}

enum DevType {

	MOBILE, WEB, SERVER
}

* 특징

- 열거형으로 선언된 순서에 따라 0 부터 인덱스 값을 가진다. 순차적으로 증가된다.

- enum 열거형으로 지정된 상수들은 모두 대문자로 선언

- 마지막에 열거형 변수들을 선언한 후 세미콜론(;)은 찍지 않는다.

  (상수와 연관된 문자를 연결시킬 경우 세미콜론(;) 찍는다. 맨아래 예제 나와있음.)



2. Enum Class 사용하기.

package EnumExample; public class Developer { public String name; public int career; public DevType type; public static void main(String[] args){ Developer developer = new Developer(); developer.name = "홍길동"; developer.career = 3; developer.type = DevType.WEB; System.out.println("개발자 이름 : "+ developer.name); System.out.println("개발자 경력 : "+ developer.career); System.out.println("직무파트 : "+ developer.type); } } enum DevType { MOBILE, WEB, SERVER }

*결과

개발자 이름  : 홍길동

개발자 경력  : 3

직무파트     :  WEB


3. Enum 메소드


대표적으로 values(), ordinal(), valueOf() 3가지를 예제를 들어 알아보겠습니다. 


Static

Methods

valueOf(String arg)

 String 값을 enum에서 가져옴. 값이 없으면 예외 발생 

valueOf(Class<T> class, String arg) 

 넘겨받은 class에서 String찾아, enum에 가져옴. 

 valueOf(String arg)는 내부적으로 자기자신 Class를 가져옴.

 values()

 eum의 요소들을 순서대로 enum타입의 배열로 리턴. 

 (ENUM$VALUES)의 카피임으로 자주 호출하지 않길 

Static이 아닌 

Methods 

name() 

 호출된 값의 이름을 String으로 리턴. 

ordinal() 

 해당 값이 enum에 정의된 순서를 리턴. 

compareTo(E o) 

 enum과 지정된 객체의 순서를 비교. 지정된 객체보다 작은 경우 

 음의 정수, 동일하면 0, 크면 양의 정수 리

equals(Object other) 

 지정된 객체가 enum 정수와 같은경우, true를 리턴. 



1) values() : 열거된 모든 원소를 배열에 담아 순서대로 리턴


package EnumExample; public class Developer { public static void main(String[] args){ for(DevType type : DevType.values()){ System.out.println(type); } } } enum DevType { MOBILE, WEB, SERVER }

*결과

MOBLE

WEB

SERVER



2) ordinal() : 원소에 열거된 순서를 정수 값으로 리턴



package EnumExample; public class Developer { public String name; public int career; public DevType type; public static void main(String[] args){ Developer developer = new Developer(); developer.name = "홍길동"; developer.career = 3; developer.type = DevType.MOBILE; System.out.println(developer.type.ordinal()); DevType tp = developer.type.SERVER; System.out.println(tp.ordinal()); } } enum DevType { MOBILE, WEB, SERVER }


*결과

0

2


3) valueOf() : 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 리턴

(일치하지 않는 경우 예외(IllegalArgumentException) 발생)


package EnumExample; public class Developer { public String name; public int career; public DevType type; public static void main(String[] args){ DevType tp1 = DevType.MOBILE; DevType tp2 = DevType.valueOf("WEB"); System.out.println(tp1); System.out.println(tp2); } } enum DevType { MOBILE, WEB, SERVER }

*결과 

MOBILE

WEB


원하는 EnumType가져오는 방법

*enum형 객체를 만들어서 가져오기. -> DevType tp1 = DevType.MOBILE;

*valueOf() 메소드를 이용해서 가져오기. -> DevType tp2 = DevType.valueOf("WEB");



4. 열거형 상수를 다른 값과 연결하기


열거형 상수와 관련된 값을 생성자를 통해 연결시킬 경우 세미콜론(;)을 붙여야 함

package EnumExample; public class Developer { public String name; public int career; public DevType type; public static void main(String[] args){ for(DevType type : DevType.values()){ System.out.println(type.getName()); } } } enum DevType { //상수("연관시킬 문자") <- 이땐 줄 끝에 세미콜론 (;) 붙이기. MOBILE("안드로이드"), WEB("스프링"), SERVER("리눅스"); final private String name; public String getName() { return name; } private DevType(String name){ this.name = name; } }


*결과

안드로이드

스프링

리눅스



자. 지금까지 enum의 사용법에 대해서 한번 알아보았습니다. 

enum class가 기본적으로 제공해주는 메서드들을 이용해서 enum을 다양한 형태로 가져와서 처리할 수 있었습니다. 

enum class 내부적으로 상수를 정의하는 것 이외에도 생성자를 만들고 그 인자로하여금 상수와 연관된 값을 연결시켜줌으로써 상수를 확장시킬 수 있었습니다.

또 지난번에 잠깐 언급했지만, 생성자를 private로 꼭 막아줘야 다른곳에서 newInstance를 통해 동적으로 변화시킬 수 없게끔 원천봉쇄시킬 수 있는 겁니다.



다음시간엔 enum을 가미한 디자인패턴에 대해서 공부해보겠습니다.

 





신고
0 Comments
댓글쓰기 폼