[Java] Enum 비교를 equals() 로 하지않고 == 로 해야 하는 이유

2024. 10. 8. 22:47·Language/Java
반응형

Java에서 Enum(열거형)은 관련된 상수들의 집합을 정의하는 특별한 데이터 타입이다. 타입 안전성을 보장하며, 코드의 가독성을 높여주는 장점이 있다.

void foo1(String direction) {
    // direction에는 무슨 값이 들어갈지 모른다.
    if (direction == "????") {
        // ...
    }
}

// 열거형을 정의하면,
enum Direction {
    NORTH, SOUTH, EAST, WEST
}

void foo1(Direction direction) {
    // 어떤 값이 올지 예측할 수 있다.
}

위의 예시처럼 Enum을 사용할 때 가장 기본적인 연산 중 하나는 두 Enum간 비교하는 것이다. 자바에서는 비교를 위한 equals() 메서드와 == 연산자를 제공하는데 Enum 비교는 어떤 방법을 사용해야할까?

먼저 JVM에서 Enum 인스턴스가 어떻게 관리되는지 알아야한다. 자바는 Enum 타입의 인스턴스를 JVM 내에서 단 하나만 생성하고 관리한다. 따라서 같은 Enum 상수는 항상 동일한 메모리 주소를 참조하게 된다. 이는 Enum 상수의 인스턴스가 JVM 내에서 유일하게 존재함을 보장한다.

public enum Direction {
    NORTH, SOUTH, EAST, WEST
}

@Test
void 같은_인스턴스인지_확인() {
    Direction d1 = Direction.NORTH;
    Direction d2 = Direction.NORTH;

    // d1과 d2는 정확히 같은 인스턴스를 참조
    assertThat(d1 == d2).isTrue();
    assertThat(d1.equals(d2)).isTrue();
}

== 연산자와 equals() 메서드의 차이점은 다음과 같다.

  • == : 객체의 참조값(메모리 주소)을 직접 비교
  • equals() : 객체의 내용을 비교하며, 추가적인 연산이 필요하다.

equals() 메서드는 말 그대로 메서드이기 때문에 호출 시 스택 프레임 생성, 파라미터 전달, 반환값 처리 등 오버헤드가 발생한다. 하지만 == 연산자는 단순 메모리 비교만 수행하기 때문에 더 빠르다. 같은 값을 가지는 Enum은 항상 같은 인스턴스를 참조하기 때문에 Enum 비교에는 ==를 쓰는 것이 좋다.
추가적으로 equals()는 객체의 메서드를 호출하는 것이기 때문에 null일 경우 NPE가 발생할 수 있다. == 연산자로 비교하는 객체가 null이더라도 정상적으로 동작하기 때문에 안전하다.

Enum 비교 시 == 연산자를 사용하면,

  • 불필요한 오버헤드가 발생하지 않고(equals()에 비해)
  • NPE를 방지할 수 있다.
반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/Java' 카테고리의 다른 글
  • [Java] 표준 예외를 사용하자
  • [Java] 동등성, 동일성
  • [Java] Exception
  • [Java] call by value, call by reference
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (123)
      • Spring Framework (10)
        • Spring (5)
        • JPA (3)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (3)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CPP
    Unreal
    JavaScript
    자바
    클래스
    redis
    PS
    map
    mscoco
    게임 개발
    FPS
    select
    파이썬
    블루프린트
    Python
    알고리즘
    C
    웹
    pytorch
    프로그래머스
    php
    JS
    언리얼엔진4
    딥러닝
    memcached
    MySQL
    Unreal Engine
    게임
    NUXT
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[Java] Enum 비교를 equals() 로 하지않고 == 로 해야 하는 이유
상단으로

티스토리툴바