코드스테이츠_국비교육/[Section1]

16.05_열거형_22.09.13

생각없이 해도 생각보다 좋다. 2022. 9. 14. 22:36

학습 키워드

  • 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 값 리턴)
    }
}

 

참고 링크: https://mine-it-record.tistory.com/204