Groo

열거형 Enum 클래스 본문

프로그래밍 언어/Java

열거형 Enum 클래스

김주엽 2020. 9. 26. 19:52

안녕하세요, 오늘은 며칠 전부터 관심을 가지고 공부하게 된 Enum 클래스에 대해 알아보려 합니다.
Enum 클래스는 많은 언어들에서 존재하지만 오늘은 Java 언어를 바탕으로 Enum 클래스를 설명하겠습니다.

🧐 Enum 클래스란?

먼저 오늘의 주제인 Enum 클래스가 무엇인가에 대해 근본적으로 알아보도록 하겠습니다. Enum이라는 것은 Enumeration의 앞글자로 열거형이라는 뜻을 가지고 있으며 서로 연관되거나 또는 관련이 있는 상수들의 집합을 의미합니다. 이 클래스는 JDK 1.5 버전부터 사용할 수 있도록 오픈되었으며 그 전까지만 하더라도 많은 사람들이 final static과 같은 방식으로 상수를 정의하였습니다.

 

저 또한 이번에 Enum 클래스에 대해서 알기 전까지는 아래와 같은 방식으로 클래스 내부에 상수를 정의해왔습니다. 그러나 이와 같은 방식으로 상수를 계속 정의한다면 추후 상수의 개수가 많아지면서 네임 충돌이 발생할 수 있고 가독성이 낮아지게 되었습니다.

public class Test {
    final static String NAME = "김주엽";
    final static Integer AGE = 18;
}

🛎 Enum 클래스를 사용해야 하는 이유!

바로 위에서 기존의 방식으로 저희가 상수를 작성할 때 발생하는 단점들에 대해서 이야기했습니다. 그럼 지금부터는 반대로 앞으로 왜 저희가 Enum 클래스를 적극적으로 사용해야 하는지에 대한 Enum 클래스의 장점들에 대해서 하나씩 알려드리도록 하겠습니다.

 

1. 코드가 간략해지며 가독성이 높아진다.

기존의 final static 방식과 다르게 열거형 Enum 클래스를 사용한다면 코드의 질이 훨씬 높아집니다.
2. 인스턴스 생성과 함께 상속을 방지하여 타입 안전성이 보장된다.

Enum 클래스의 각 상수들은 고정된 타입으로서 다른 패키지 또는 클래스에서 변경하지 못합니다.
이를 위해 생성자의 접근 제어자를 Private로 설정해야 하며 타입은 final과 같은 성격을 띱니다.
실질적으로 클라이언트에서 Enum 클래스의 인스턴스 생성이 불가하며 상속도 받을 수 없게 됩니다.
3. 키워드 Enum을 사용하기에 구현 의도가 명확해진다.

Enum이라는 키워드를 통해 구현의 의도가 열거임을 명확하게 나타낼 수 있게 됩니다.

🎲 Enum 클래스 사용하기 (기본 편)

이번에는 위에서 설명한 Enum 클래스의 개념을 바탕으로 간단한 예제를 구현해보겠습니다. 가장 먼저 Grade라는 Enum 클래스를 생성하고 아래와 같이 FIRST_GRADE, SECOND_GRADE, THIRD_GRADE라는 3개의 상수를 각각 추가해주시기 바랍니다.

 

[ Grade 클래스 ]

public enum Grade {
    FIRST_GRADE,
    SECOND_GRADE,
    THIRD_GRADE
}

그 후 Grade 클래스를 직접 활용할 Student 클래스를 생성하도록 하겠습니다. Student 클래스에서는 학생들의 이름과 학년을 저장하는 name, grade라는 멤버 변수가 존재합니다. name 변수에는 직접적으로 값을 입력하여 초기화하는 반면에 grade 변수는 앞에서 만든 Enum 클래스인 Grade 클래스의 특정 상수를 호출해 값을 대입하고 있으며 각 상수에 따른 다른 결과를 보여줍니다.

 

[ Student 클래스 ]

public class Student {
    String name;
    int grade;

    public static void main(String[] args) {
        Student student = new Student();
        student.name = "김주엽";

        Grade grade = Grade.SECOND_GRADE;
        switch (grade) {
            case FIRST_GRADE: student.grade = 1; break;
            case SECOND_GRADE: student.grade = 2; break;
            case THIRD_GRADE: student.grade = 3; break;
        }

        System.out.println(student.name + " 학생은 " + student.grade + "학년입니다.");
    }
}

🎹 Enum 클래스 사용하기 (심화 편)

더 나아가 Enum 클래스를 조금 더 심화적으로 사용한 예제를 구현해보겠습니다. 이번에도 똑같이 Enum 클래스인 Grade 클래스를 만들 것이지만 이전과는 다르게 아래와 같이 추가적인 코드를 작성해줄 것입니다. 아까는 없었던 grade, entranceYear라는 멤버 변수를 추가시켰으며 이를 초기화해주는 생성자와 함께 각 변수들의 Getter, Setter 메소드들이 추가된 것을 볼 수 있습니다.

 

또한 FIRST_GRADE, SECOND_GRADE, THIRD_GRADE 상수에서는 Grade 클래스의 매개변수 생성자에 해당하는 인자 값을 전달하고 있으며 이를 grade, entranceYear 멤버 변수에 대입하고 있습니다. 이 과정 속에서 Grade 클래스의 매개변수 생성자는 외부에서는 접근하지 못하며 Grade 클래스 안에 위치한 각 상수들만이 이를 접근할 수 있습니다. 즉 Private 접근 제어자입니다.

 

[ Grade 클래스 ]

public enum Grade {
    FIRST_GRADE(1, 2020),
    SECOND_GRADE(2, 2019),
    THIRD_GRADE(3, 2018);

    private int grade;
    private int entranceYear;

    Grade(int grade, int entranceYear) {
        this.grade = grade;
        this.entranceYear = entranceYear;
    }

    public int getGrade() {
        return grade;
    }
    public int getEntranceYear() {
        return entranceYear;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
    public void setEntranceYear(int entranceYear) {
        this.entranceYear = entranceYear;
    }
}

또한 Student 클래스 역시 약간의 변경이 이루어졌는데요, 새롭게 entranceYear라는 멤버 변수가 생성됬었으며 이는 추후 학생의 입학한 연도를 저장하는 역할을 합니다. 이제 main 메소드를 본다면 name 변수의 값을 이전과 같이 직접적으로 입력하고 있습니다.

 

그러나 grade와 entranceYear 변수의 값은 앞에서 구현한 Grade 클래스의 특정 상수를 호출하여 그 상수에 해당하는 멤버 변수의 Getter 메소드를 호출하여 데이터를 불러오고 있습니다. 그 이유는 외부에서 Enum 클래스를 인스턴스화 할 수 없기 때문입니다.

 

[ Student 클래스 ]

public class Student {
    String name;
    int grade;
    int entranceYear;

    public static void main(String[] args) {
        Student student = new Student();
        student.name = "김주엽";

        Grade grade = Grade.SECOND_GRADE;
        student.grade = grade.getGrade();
        student.entranceYear = grade.getEntranceYear();

        System.out.println(student.entranceYear + "년에 입학한 " +  
        				   student.name + " 학생은 현재 " + 
        				   student.grade + "학년입니다.");
    }
}

👍 글을 마치며

이렇게 Enum 클래스에 대한 내용들을 간략히 알아보았습니다. 이번에 제가 Enum 클래스에 대해서 공부하고 싶다는 마음이 생기게 된 계기는 다른 플랫폼을 개발하는 친구들이 평소에 Enum 클래스를 적극적으로 활용하고 있다는 소식을 들었습니다. 그러나 저는 평소에 Enum에 대해서 알지도 못했고 사용해본 경험도 없어 궁금해지기 시작해 이렇게 공부하고 글을 작성하였습니다. 확실히 Enum 클래스를 사용하면 훨씬 코드의 질과 가독성이 높아지는 것을 채감하게 되었으며 이를 조금 더 변형하여 확장한다면 정말 유용하게 사용할 의향이 있을 것 같습니다. 또한 오늘 제가 작성한 글은 Enum 클래스에 대한 정말 간략한 내용이므로 참고 바랍니다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

Observable 클래스의 팩토리 함수 (1)  (0) 2020.12.06
Observable 클래스의 기본  (0) 2020.10.24
RXJava 소개  (0) 2020.08.25
문자열 형 변환의 종류 및 차이점  (2) 2020.06.18
Comments