학습 키워드
- Enum의 기본적인 개념
- Enum이 등장하게 된 배경, 장점
- Enum의 문법 요소
Enum; enumerated type
>의미
: 여러 상수(final)들을 편리하게 선언하기 위한 자바의 문법요소
>Enum의 탄생 배경
- 1. 상수명의 중복을 방지하기 위한 노력
: 많은 상수를 정의하다 보면 이름이 중복되는 경우가 발생할 수 있음.
: 중복 문제를 해결하기 위해 Enum(열거형)이 탄생함.
: 이런 경우 중복되는 상수들을 다른 인터페이스에 넣음으로써 극복할 수 있음.
//타입 안정성 문제 해결 불가
//중복 에러 예시.
//상수에 할당된 정수는 상수를 구분하여 쓰기 위함.
public static final int A = 1;
public static final int B = 2;
public static final int C = 3;
public static final int D = 4;
public static final int C = 1; //ERROR, 알파벳 C와 중복
public static final int JAVA = 2;
public static final int JAVASCRIPT = 3;
public static final int PYTHON = 4;
//인터페이스 해결 예시.
//각각의 인터페이스로 묶음으로서 중복 문제 해결
interface Alphabet{
int A = 1, B = 2, C = 3, D = 4;
}
interface Language{
int C = 1, JAVA = 2, JAVASCRIPT = 3, PYTHON = 4;
}
//상수 구분 가능
Alphabet.C
Language.C
- 2. 타입 안정성 문제를 극복하기 위한 노력
: 상수는 상수명 자체에 의미를 부여하고, 상수에 할당된 값으로 상수를 구분하는 식으로 사용을 하기도 한다.
: 하지만 상수에 할당된 값으로 상수끼리 비교하는 코드를 작성할 수 있다. 상수에 할당된 값은 그저 열거를 위한 값이라
는 의미말곤 아무것도 없음에도!
: 이런 경우 각각 다른 클래스로 상수들을 구분하고, 상수에 할당되는 값을 해당 클래스의 객체를 생성하는 값(new)를 줌으
로써 극복할 수 있다.
//인터페이스로 해결했을 경우 발생 문제
interface Alphabet{
int A = 1, B = 2, C = 3, D = 4;
}
interface Language{
int C = 1, JAVA = 2, JAVASCRIPT = 3, PYTHON = 4;
}
if(Alphabet.C == Language.C){...}
//상수는 할당된 값이 아닌 상수 자체에 의미를 둔다.
//하지만 위처럼 할당된 값으로 서로 다른 상수를 비교할 수 있게 된다.
//클래스 문제 해결 예시.
//각각의 클래스로 묶고, 각 상수에 다른 객체들을 할당한다.
class Alphabet{
public static final Alphabet A = new Alphabet();
public static final Alphabet B = new Alphabet();
public static final Alphabet C = new Alphabet();
public static final Alphabet D = new Alphabet();
}
class Language{
public static final Language C = new Language();
public static final Language JAVA = new Language();
public static final Language JAVASCRIPT = new Language();
public static final Language PYTHON = new Language();
}
//각각의 클래스로 묶음: 중복 해결
//서로 다른 객체 할당: 타입 안정성 해결
- 3. 상수명 중복, 타입 안정성 문제를 모두 해결하기 위한 노력
: 같은 묶음 내에서 상수를 구분하기 위해 값을 할당했으나, 객체가 할당되면서 switch문 같은 문법을 이용할 수 없게됨.
: switch문은 기본형과 enum형만 받을 수 있다,
: 또한, 코드가 너무 길어져서 가독성이 떨어진다.
: Enum의 등장!
: 인터페이스처럼 깔끔한 코드로 상수들을 열거할 수 있고 상수명의 중복을 방지할 수 있으며, 클래스로 구분한 것 처럼 타
입의 안정성을 극복할 수 있음. 또한, switch문에도 사용이 가능하다!
//클래스 문제 발생 예시.
//같은 묶음 내에서 상수를 구분하기 위해 값을 할당했으나, 객체가 할당되면서 switch문 같은 문법을 이용할 수 없게됨.
class Language{
public static final Language C = new Language();
public static final Language JAVA = new Language();
public static final Language JAVASCRIPT = new Language();
public static final Language PYTHON = new Language();
}
public class Main {
public static void main(String[] args) {
Language language = Language.C;
switch (language) {
case Language.C:
System.out.println("C 언어");
break;
case Language.JAVA:
System.out.println("JAVA 언어");
break;
case Language.JAVASCRIPT:
System.out.println("JAVASCRIPT 언어");
break;
case Language.PYTHON:
System.out.println("PYTHON 언어");
break;
}
}
}
//Enum 문제 해결
enum Language{ C, JAVA, JAVASCRIPT, PYTHON }
public class Main {
public static void main(String[] args) {
Language language = Language.C;
switch (language) {
case C:
System.out.println("C 언어");
break;
case JAVA:
System.out.println("JAVA 언어");
break;
case JAVASCRIPT:
System.out.println("JAVASCRIPT 언어");
break;
case PYTHON:
System.out.println("PYTHON 언어");
break;
}
}
}
>열거형(enum)의 구조
enum 열거형이름 { 상수명, 상수명, 상수명, ... }
: 클래스, 혹은 인터페이스임을 알리는 것처럼 가장 먼저 enum 키워드가 위치함.
: enum 키워드 다음에 열거형이름을 작성
: 중괄호로 바디를 만들고, 바디의 내용은 상수명으로 채운다. 각각의 상수명은 쉼표로 구분함.
: 해당 상수명은 순서대로 자동적으로 정수값이 할당된다. 0부터 할당.
>열거형(enum)의 특징
: . 을 통해 직접 접근 가능(열거형명.상수명)
: static 멤버와 같은 접근법
>참조형으로 사용 가능
: 변수 앞 자료형 위치에 열거형명을 작성하여 참조형으로 사용할 수 있다.
//참조형으로 사용되는 것으로 보아하니, 열거형 내 각 상수는 주소를 할당받는 것 같다. (정수를 저장하는 주소)
>Enum 메서드
enum Language{ C, JAVA, JAVASCRIPT, PYTHON }
public class Main {
public static void main(String[] args) {
Language language = Language.JAVA;
System.out.println(language.valueOf("JAVA"));
//인자(String)을 enum에서 가져온다. 값이 없으면 Exception 발생
Language[] languageArr = language.values();
//enum의 요소들을 순서대로 enum 타입의 배열로 리턴한다.
System.out.println(language.ordinal()); //JAVA index: 1
//해당 값이 enum에 정의된 순서를 리턴한다. (index 값 리턴)
}
}
'코드스테이츠_국비교육 > [Section1]' 카테고리의 다른 글
16.07_컬렉션 프레임워크[개요]_22.09.13 (0) | 2022.09.15 |
---|---|
16.06_예외 처리_22.09.13 (0) | 2022.09.15 |
16.03_제네릭 메서드_22.09.13 (0) | 2022.09.14 |
16.02_제네릭 클래스_22.09.13 (1) | 2022.09.13 |
16.01_Wrapper 클래스_22.09.13 (0) | 2022.09.13 |