static final과 enum의 차이를 알아보자

Dev_Gony·2023년 11월 8일
0

Java

목록 보기
3/3

자바에는 상수의 집합인 enum 이라는 자료형을 제공한다.
상수를 static final로 관리하는 것과 enum으로 관리하는 것의 차이는 뭘까?

이를 파악하기 위해 enum의 특징에 대해 알아보자

//static final 상수 선언
class Days {
	static final int MONDAY = 1;
    static final int TUESDAY = 2;
...
}

//enum 사용
enum Days {
	MONDAY(1),
    TUESDAY(2),
    ...
    
    private final int index;
    ...
}

사실 static final이 상수를 관리하는 건 처음 알았음 크흠...
enum은 파이썬에서 봤던 기억이 있는데, 순서를 지정해주는 걸로 봤는데
상수의 집합이라 흠..

좀 찾아보겠음

enum이란?
비단 자바에만 있는 개념은 아니고 다른 언어에서도 볼 수 있는 형식이다. 열거형이라 불리며 요소, 멤버라 명명된 값의 집합을 이루는 자료형으로 열거자 이름들은 해당언어의 상수 역할을 하는 식별자이다.
(출처 : 위키백과)

.
.
.

음 일단 파이썬에서도 봤었는데, 기능적으로는 큰 차이는 없는거 같음!


그럼 static final 과 enum의 차이점은 뭐임 흠..? 나와라 지피티!

먼저, static final 변수와 enum 모두 상수를 표현하는 방법이지만, 그들 사이에는 중요한 차이점들이 존재합니다.

  1. 타입 안전(Type Safety): enum은 type-safe입니다. 즉, 컴파일 타임에 오류를 잡아낼 수 있습니다. 반면, static final 상수는 이런 보장을 할 수 없습니다. 예를 들어, 요일을 표현하는 데 1~7 이외의 숫자를 사용하면, static final 상수를 사용할 때는 컴파일러가 이를 잡아내지 못합니다. 하지만 enum을 사용하면 컴파일 타임에 이런 오류를 잡아낼 수 있습니다.

  2. 메서드와 필드: enum은 메서드와 필드를 가질 수 있습니다. 이는 enum이 클래스와 같은 방식으로 동작하기 때문입니다. 반면, static final 상수는 이런 기능을 제공하지 않습니다.

  3. enum 상수는 싱글턴입니다. 이는 각 enum 상수가 해당 enum 타입의 정확히 하나의 인스턴스임을 의미합니다. 이것은 enum 상수가 전역적으로 접근 가능한 상태를 안전하게 공유할 수 있음을 의미합니다.

  4. switch 문에서: enum은 switch 문에서 사용할 수 있습니다. 이는 각각의 enum 상수가 유일하게 구분되기 때문입니다. 하지만 static final 상수는 여러 변수가 같은 값을 가질 수 있어서 이런 보장을 할 수 없습니다.

  5. 자체적인 네임스페이스: enum은 자체적인 네임스페이스를 가집니다. 즉, 같은 이름의 상수를 갖는 서로 다른 두 enum이 있어도, 그들은 서로 다른 타입으로 취급됩니다. 이는 상수 간의 이름 충돌을 방지합니다.

따라서, static final 상수와 enum 사이에서 선택할 때는, 이러한 차이점들을 고려해야 합니다. 어떤 경우에는 static final 상수가 적합할 수 있지만, 보다 풍부한 기능성과 타입 안전성 등을 원한다면 enum을 사용하는 것이 좋습니다. 이러한 선택은 항상 문제의 맥락과 요구 사항에 따라 달라집니다.


음... 설명만 봐서는 그냥 enum이 짱인거 같음
글로만 봐서는 이해하기 어려워서 간단한 예시를 가지고 왔음
요일에 대해서 볼건데

// static final 사용
public class Week {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    // ...
}

이 경우, 우리는 요일을 숫자로 표현 함. 그런데 문제는, 이렇게 하면 우리가 실수로 요일에 8이라는 값을 넣는다던가, 또는 0이라는 값을 넣는다던가 하는 실수를 해도, 컴퓨터는 이를 막을 방법이 없음

하지만!! enum을 사용하면 이런 문제를 해결할 수 있음!

// enum 사용
public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

이렇게 enum을 사용하면, "요일"이라는 것을 숫자가 아니라 '월요일', '화요일', '수요일' 등으로 표현할 수 있음. 그리고 이렇게 해놓으면, 우리가 실수로 '팔요일'이라는 것을 넣으려고 하면, 컴퓨터가 이를 막아줌.
왜 why?, 컴퓨터는 '월요일'부터 '일요일'까지밖에 모르기 때문

또한, enum에는 메서드를 추가할 수 있음.
폴 이그잼폴, 각 요일이 주말인지 아닌지를 확인하는 메서드를 추가가능

public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    public boolean isWeekend() {
        return (this == SATURDAY || this == SUNDAY);
    }
}

이렇게 하면, 우리는 '오늘은 주말인가요?'라는 질문에 대답할 수 있음

요약!!
enum을 사용하면

  • 우리는 코드를 더 안전하게 만들 수 있고
  • 더욱 명확하게 표현할 수 있으며
  • 메서드를 추가함으로써 더 많은 기능을 제공할 수 있음.

이러한 이유로, enum은 static final 상수보다 훨씬 강력하고 유연한 도구다!


그래도 혹시나 해서 static final 을 사용하는 경우는 뭐냐 확인해봤음 지피티 대답

enum 대신 static final 변수를 사용하는 경우, 몇 가지 장점이 있을 수 있습니다:

  1. 단순성: static final 변수는 간단하고 기본적인 자료형을 사용하므로, 코드를 단순하게 유지하는 데 도움이 될 수 있습니다. 이는 특히 복잡한 로직이나 추가적인 메서드 없이 단순한 상수 값을 사용해야 하는 경우에 유용합니다.

  2. 메모리 사용량: enum은 내부적으로 클래스로 처리되므로, static final 변수에 비해 더 많은 메모리를 사용할 수 있습니다. 따라서, 메모리 사용량이 중요한 경우에는 static final 변수를 사용하는 것이 더 효율적일 수 있습니다. 하지만, 이는 대부분의 경우에서는 큰 차이를 만들지 않습니다.

  3. 호환성: static final 변수는 모든 Java 버전에서 사용할 수 있습니다. 반면, enum은 Java 5 이상에서만 사용할 수 있습니다. 따라서, 레거시 시스템과의 호환성이 중요한 경우에는 static final 변수를 사용하는 것이 더 적합할 수 있습니다.

하지만 이러한 장점들은 대부분의 경우에서는 enum의 장점에 비해 상대적으로 작습니다. 따라서, 가능한 경우에는 enum을 사용하는 것이 더 좋습니다. 그러나 이러한 장점들을 고려하여 개발 상황에 따라 적절한 선택을 하는 것이 중요합니다.


오늘의 결론

static final 보단 enum을 쓰도록 하자 땅땅땅!

profile
잔디심는 코린이

0개의 댓글

관련 채용 정보