안녕하세요. 지난 시간엔 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을 가미한 디자인패턴에 대해서 공부해보겠습니다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] 많이 쓰는 String Methods (0) | 2017.08.15 |
---|---|
[Java] Immutable Class (불변 클래스) (2) | 2017.07.29 |
[Java] java synchronized 동기화 (1) | 2017.07.22 |
[Java] Java설치 및 환경변수 설정 (JDK 설치 방법) (23) | 2017.07.19 |
[Java] 제네릭 메서드(Generic Method) (1) | 2017.07.15 |
댓글