Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
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
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241207 Enum은 왜 쓰는걸까? 본문

개발Article

[TIL]20241207 Enum은 왜 쓰는걸까?

최밤빵 2024. 12. 7. 04:07

프로젝트를 할 때 마다 enum을 사용하고 있지만, 왜 사용하는지 명확히 이해하지 못한 채 일단 편리하다? 상수를 나열한다?는 이유로 쓰고 있는 것 같다. 이번 개발일지에서는 enum의 개념과 그 필요성, 어떻게 활용할 수 있는지에 대해 구체적으로 정리하고싶었다.

 

enum

enum은 열거형이라는 의미로, 상수들의 집합을 정의할 수 있는 특수한 데이터 타입이다. Java에서 enum은 클래스처럼 보이지만, 특정 값들을 제한하여 사용할 수 있도록 하는 기능을 제공한다. 요일, 달, 상태(state)와 같이 제한된 값들만 허용해야 할 경우에 사용하면 유용하다.

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

→ 요일을 나타내는 enum으로, 여기서 Day 타입은 총 7개의 상수 값만 가질 수 있도록 제한되어 있어서 잘못된 값을 허용하지 않고, 코드의 안정성과 가독성을 높인다.


왜 enum을 사용할까?

코드의 가독성과 안정성 향상

enum을 사용하면 코드의 의미가 명확해지고, 특정 값들만 사용해야 하는 상황에서 잘못된 값을 입력하는 실수를 방지할 수 있다. 요일을 문자열로 표현하는 경우 오타가 발생할 수 있지만, enum을 사용하면 컴파일 타임에 잘못된 값을 바로 잡을 수 있다.

public class Schedule {
    private Day day;

    public Schedule(Day day) {
        this.day = day;
    }

    public void printDay() {
        System.out.println("Scheduled day: " + day);
    }
}

public class Main {
    public static void main(String[] args) {
        Schedule schedule = new Schedule(Day.MONDAY);
        schedule.printDay();
    }
}

DayMONDAY, TUESDAY 등의 제한된 값만 사용할 수 있기 때문에 잘못된 요일을 할당하는 오류를 방지할 수 있다. enum을 사용하면 코드의 의도를 명확하게 표현할 수 있어 가독성이 높아진다.


타입 안전성 보장

enum을 사용하면 컴파일 타임에 타입이 안전하게 보장된다. 예를 들어, 문자열을 사용하여 상태를 나타낸다면, 오타로 인해 런타임 오류가 발생할 수 있지만, enum을 사용하면 잘못된 값을 사용할 가능성이 사라진다.

public enum Status {
    ACTIVE, INACTIVE, PENDING
}

public void updateStatus(Status status) {
    if (status == Status.ACTIVE) {
        System.out.println("User is active.");
    }
}

Status enum을 사용하면 ACTIVE, INACTIVE, PENDING 외의 상태값을 사용할 수 없기 때문에 코드의 타입 안정성이 보장된다.


상수 그룹화와 유지보수 용이성

enum을 사용하면 관련된 상수들을 하나의 그룹으로 관리할 수 있다. 코드의 유지보수가 용이해지고, 새로운 상수 값을 추가하거나 기존의 값을 수정할 때도 enum 타입 내에서 일괄적으로 관리할 수 있다. 만약 상태 값을 문자열로 관리하면 각기 다른 곳에서 일관성을 유지해야 하기 때문에 유지보수가 어려워진다.


행위 추가 가능

enum은 단순히 상수들의 집합일 뿐만 아니라, 메서드를 추가하여 관련된 행위를 정의할 수 있기 때문에, 더 풍부한 기능을 제공할 수 있다.

public enum Operation {
    ADD {
        @Override
        public int apply(int a, int b) {
            return a + b;
        }
    },
    SUBTRACT {
        @Override
        public int apply(int a, int b) {
            return a - b;
        }
    };

    public abstract int apply(int a, int b);
}

public class Calculator {
    public static void main(String[] args) {
        int result = Operation.ADD.apply(5, 3);
        System.out.println("Result: " + result); // Result: 8
    }
}

Operation enum은 ADDSUBTRACT 상수에 각각의 연산을 정의하고 있다. enum이 단순히 상수 값을 나열하는 것이 아니라, 각 상수에 행위를 부여하여 더 유용한 기능을 제공할 수 있음을 알 수 있다.


enum의 단점과 사용 시 고려사항

enum에는 여러 장점이 있지만, 몇 가지 단점도 존재한다.

유연성의 부족

enum은 상수 값들이 고정되어 있기 때문에, 런타임에 값을 추가하거나 변경할 수 없다. 동적으로 값이 변할 가능성이 있는 경우에는 enum을 사용하는 것이 적절하지 않을 수 있다. 데이터베이스에서 동적으로 관리되는 코드 값들은 enum으로 정의하기 어렵다.

메모리 사용량

enum은 상수들이 모두 메모리에 로드되고, 각 상수는 인스턴스로 유지된다. 따라서 많은 수의 상수를 가진 enum을 사용할 경우 메모리 사용량이 증가할 수 있다. 작은 규모의 프로젝트에서는 문제가 되지 않을 수 있지만, 수천 개의 상수를 정의해야 하는 경우에는 주의가 필요하다.

확장 어려움

enum은 클래스 상속이 불가능하다. enum 타입을 확장할 수 없기 때문에, 확장성을 고려해야 하는 상황에서는 제약이 있을 수 있다.


언제 enum을 사용하는 것이 적절할까?

값이 제한적이고 변하지 않는 경우

요일, 계절, 방향, 상태와 같이 값의 개수가 제한적이고 변경되지 않는 경우 enum을 사용하는 것이 적합하다. enum은 코드의 안정성과 가독성을 높여주고, 잘못된 값이 사용되는 것을 방지할 수 있다.

 

타입 안정성이 중요한 경우

특정 값들만 허용해야 하고, 컴파일 타임에 오류를 방지하고 싶은 경우 enum을 사용하면 좋다. 코드의 안전성을 높일 수 있다.

관련된 상수들 간의 행위 정의가 필요한 경우

상수에 행위를 부여하여 코드를 깔끔하게 유지하고 싶을 때 enum을 사용할 수 있다. 상태에 따라 다른 처리를 해야 할 때 각 상태에 메서드를 정의하여 사용하면 코드의 복잡성을 줄일 수 있다.


enum을 사용하지 않았을 때의 문제점

만약 enum을 사용하지 않고 상수 값을 문자열이나 정수로 정의하여 사용한다면, 여러 문제점이 발생할 수 있다. 예를 들어, 상태를 나타내는 문자열을 사용한다고 가정하면, 오타로 인해 잘못된 값을 할당할 수 있고, 컴파일 타임에 잡아내기 어렵다. 코드의 가독성도 떨어지고, 유지보수 시 새로운 상태를 추가하는 과정에서 실수가 발생할 가능성이 높아진다.

public class User {
    private String status;

    public User(String status) {
        this.status = status;
    }

    public void printStatus() {
        if ("ACTIVE".equals(status)) {
            System.out.println("User is active.");
        }
    }

    public static void main(String[] args) {
        User user = new User("ACTIVE");
        user.printStatus();
    }
}

→ status 값을 문자열로 관리하고 있다. 만약 "ACTIVE" 대신 "ACIVE"와 같은 오타가 발생한다면, 컴파일러는 알 수 없으며, 런타임에서만 문제가 발생하게 되고, 유지보수와 디버깅을 어렵게 만든다.


enum은 특정 값들의 집합을 정의하고 이를 안전하게 사용할 수 있도록 하는 유용한 도구이다. 코드의 가독성과 안정성을 높이고, 유지보수성을 향상시키기 위해 enum을 사용하는 것은 필수적이라고 할 수 있다. 하지만 동적으로 값이 변해야 하거나 확장이 필요한 상황에서는 enum이 적합하지 않을 수 있다는 점도 고려해야 한다.