시작하며
여러분 안녕하세요!
DreamHanks의 254cm입니다.
이번 시간에는 enum에 대해서 설명해 보도록 하겠습니다.
Java의 전체 기사는 여기를 클릭해 주세요.
이전 기사는 【Java 개발】제24회 Collection Framework에 대해서 배워 봤습니다.
enum이란?
enum은 Java 5부터 추가된 것이며 정수 집합을 의미합니다.
final static 키워드를 이용해도 정수를 정의할 수 있는데,
enum은 작성 방법이 매우 간단해서 가독성이 높습니다.
그리고 enum도 클래스의 하나이기 때문에 정수 데이터형을 정의할 수 있습니다.
즉, 의도한 정수값만 대입할 수 있는 변수를 생성할 수 있습니다.
enum 쓰는 법
〇enum 클래스 정의
1 2 3 |
접근제어자 enum 클래스 이름 { 정수명, 정수명, 정수명 } |
위와 같이 enum클래스에서 정의되는 정수는 접근제어자도 데이터형도 필요하지 않습니다.
다만, 정수 이름만 정의하면 됩니다.
위와 같이 정의된 정수는 이름과 같은 문자열과 같이 사용할 수 있습니다.
샘플
1 2 3 4 |
public enum EnumSample1 { english, 한국어 } |
위와 같이 별도의 .java 파일로 enum을 정의할 수 있습니다.
정수명은 unicode 문자를 사용할 수 있지만 명명규약에 따라 영문 대문자로 작성할 것을 권장합니다.
샘플 2
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ExampleCalss { public static void main(String[] args) { Fruits fruits = Fruits.포도; System.out.println(fruits); } } enum Fruits { apple, BANANA, 포도 } |
위와 같이 다른 클래스와 같은 파일로 작성할 수도 있습니다.
정수 사용은 위와 같이 enum클래스의 객체를 생성하여 사용합니다.
출력 결과
1 |
포도 |
샘플 3
1 2 3 4 5 6 7 8 9 10 11 |
public class ExampleCalss { public enum Samples { SAMPLE1,SAMPLE2,SAMPLE3 } public static void main(String[] args) { System.out.println(Samples.SAMPLE1); System.out.println(Samples.SAMPLE2); System.out.println(Samples.SAMPLE3); } } |
위와 같이 클래스의 필드로 작성 할 수도 있습니다.
〇enum 정수에 값을 부여
1 2 3 4 5 6 |
public enum Sample { 정수명 (값), 정수명 (값), 정수명 (값); } |
enum 상수 값을 정의하기 위해 괄호를 추가하고 그 안에 값을 만들면 좋습니다.
그러나 정수에 값을 저장할 필드와 컨스트럭터 및 해당 필드 변수의 get 메서드를 작성해야 합니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class ExampleCalss { public enum Samples { SAMPLE1(1),SAMPLE2(5),SAMPLE3(3); private final int value; private Samples(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { System.out.println(Samples.SAMPLE1); System.out.println(Samples.SAMPLE2); System.out.println(Samples.SAMPLE3); System.out.println(Samples.SAMPLE1.getValue()); System.out.println(Samples.SAMPLE2.getValue()); System.out.println(Samples.SAMPLE3.getValue()); } } |
위와 같이 정수 값을 저장할 필드와 컨스트럭터, get메서드를 생성해야 합니다.
출력 결과
1 2 3 4 5 6 |
SAMPLE1 SAMPLE2 SAMPLE3 1 5 3 |
Enum 클래스의 주요메서드
모든 enum은 “java.lang.Enum”클래스를 상속하고 있습니다.
그래서, enum은 Enum 클래스의 메소드를 사용할 수 있습니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class ExcuteClass { public enum EnumSample { ENUM1(10), ENUM2(15), ENUM3(20), ENUM4(25); private int value; private EnumSample(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { EnumSample[] enums = EnumSample.values(); for(EnumSample sam : enums) { System.out.println(sam + " " +sam.getValue()); } EnumSample enumItem = EnumSample.valueOf("ENUM3"); String enumName = enumItem.name(); int enumValue = enumItem.getValue(); int enumIndex = enumItem.ordinal(); System.out.println(enumName + " is " + enumValue); System.out.println("index of "+ enumName + " is "+ enumIndex); } } |
출력 결과
1 2 3 4 5 6 |
ENUM1 10 ENUM2 15 ENUM3 20 ENUM4 25 ENUM3 is 20 index of ENUM3 is 2 |
enum의 장점
enum은 가독성이 높다는 점 외에도 여러 가지 장점이 있습니다.
final static에서 선언한 정수를 사용하는 것보다 좋은 곳을 샘플을 보면서 설명하겠습니다.
샘플 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
public class ExampleCalss { final static int ITEM1 = 1; final static int ITEM2 = 1; public enum Samples { SAMPLE1(1),SAMPLE2(1); private final int value; private Samples(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { Samples sample1 = Samples.SAMPLE1; Samples sample2 = Samples.SAMPLE2; if(sample1 == sample2) { System.out.println("sample1 == sample2"); } else { System.out.println("sample1 != sample2"); } if(sample1.equals(sample2)) { System.out.println("sample1 equals sample2"); } else { System.out.println("sample1 not equals sample2"); } if(sample1.getValue() == sample2.getValue()) { System.out.println("sample1.getValue() == sample2.getValue()"); } else { System.out.println("sample1.getValue() != sample2.getValue()"); } if(ITEM1 == ITEM2) { System.out.println("ITEM1 == ITEM2"); } else { System.out.println("ITEM1 != ITEM2"); } } } |
위의 샘플과 같이 정수형 정수의 경우 두 가지 정보에 대한 정수를 선언하였는데,
값이 같을 경우 데이터의 의미는 다르지만 소스코드 상에서는 같은 정보로 인식됩니다.
그러나 enum의 정수는 같은 값을 두 정수를 다른 정수로 인식됩니다.
출력 결과
1 2 3 4 |
sample1 != sample2 sample1 not equals sample2 sample1.getValue() == sample2.getValue() ITEM1 == ITEM2 |
샘플 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class ExampleCalss { final static String ITEM1 = "red"; final static String ITEM2 = "blue"; public enum Samples { SAMPLE1("red"),SAMPLE2("blue"); private final String value; private Samples(String value) { this.value = value; } public String getValue() { return value; } } public static void main(String[] args) { String item = ITEM1; item = ITEM2; item = "green"; Samples enumItem = Samples.SAMPLE1; enumItem = Samples.SAMPLE2; enumItem = "green"; } } |
상기의 샘플과 같이 final static에서 정의한 정수를 다른 변수의 값으로 대입하는 경우,
대입되는 변수는 정수가 아니며 의도되지 않은 값도 대입할 수 있습니다.
하지만 enum클래스 객체의 경우 의도되지 않은 값을 대입할 수 없습니다.
끝으로
이번 기사는 이상입니다.
다음 시간에는 Object 클래스를 배워보겠습니다.
방문해 주셔서 감사합니다.
コメント