TIL/JAVA

[TIL] ENUM에 대해 알아보자

Dream COM Ddulut 2025. 1. 3. 11:30

 

과제를 수행하던 중 문득 궁금해졌다.

.name()은 ENUM에 기본적으로 포함되어있는 메서드인가?

 

클릭해보니 .name()은 ENUM에 포함된 메서드라는 것을 확인할 수 있었다.

 

찾아보니 .name()외에도 생각보다 다양한 메서드가 있어서 이번 기회에 쭉 정리해보았다.


ENUM의 기본제공 메서드

 

values( )

▪️enum에 정의된 모든 상수를 배열로 반환한다.

▪️예시⬇️

public enum UserRole {
    ADMIN, USER
}

public static void main(String[] args) {
    for (UserRole role : UserRole.values()) {
        System.out.println(role);
    }
}

 

 

valueOf(String str)

▪️문자열로 전달받은 값과 정확히 일치하는 enum 상수를 반환한다.
▪️대소문자를 구분

▪️일치하는 값이 존재하지 않을 경우: IllegalArgumentException 발생

▪️예시⬇️

UserRole role = UserRole.valueOf("ADMIN");
System.out.println(role); // 결과: ADMIN

 

 

name( )

▪️enum 상수를 문자열로 반환한다.

▪️예시⬇️

UserRole role = UserRole.ADMIN;
System.out.println(role.name()); // 결과: ADMIN

 

 

toString( )

▪️enum 상수를 문자열로 반환한다.
▪️name()과 달리, 오버라이드하여 사용자의 필요에 따른 커스터마이징 가능

▪️ 예시⬇️

UserRole role = UserRole.ADMIN;
System.out.println(role.toString()); // 결과: ADMIN

 

▪️오버라이드 예시⬇️

public enum UserRole {
    ADMIN,
    USER;

    @Override
    public String toString() {
        if (this == ADMIN) {
            return "관리자";
        } else {
            return "일반 회원";
        }
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(UserRole.ADMIN); 
        System.out.println(UserRole.USER);  
    }
}

 

출력 결과⬇️

관리자
일반 회원

 

 

ordinal( )

▪️enum 선언 순서를 반환한다. (0부터 시작)
▪️ordinal( )은 가급적으면 사용하지 말자!

public enum UserRole {
    ADMIN, USER
}

위와 같이 enum을 만들었다.

 

그리고 DB에서 관리자와 회원을 구분하기 위해 ordinal( )로 값을 불러와서 사용했다고하자.

ADMIN의 ordinal( ) 값인 0을 DB에 저장해서 사용했는데, 갑자기 누군가 USER와 ADMIN의 순서를 바꾼다면?

DB에 저장된 숫자 값은 그대로 유지되지만, 애플리케이션 상에서 USER는 0이되고, ADMIN은 1이 되어버린다.

즉, 순식간에 관리자와 회원이 뒤바뀌는 오류가 일어난다!

 

▪️ 예시⬇️

public enum UserRole {
    ADMIN, USER
}

public static void main(String[] args) {
    UserRole role = UserRole.USER;
    System.out.println(role.ordinal()); // 결과: 1
}

 

 

compareTo(Enum other)

▪️같은 enum 타입 내에서 두 상수를 비교한다.
▪️정의된 순서를 기준으로 비교, 음수, 0, 양수 반환

▪️ 예시⬇️

UserRole role1 = UserRole.ADMIN;
UserRole role2 = UserRole.USER;
System.out.println(role1.compareTo(role2)); // 결과: -1 (ADMIN이 USER보다 앞에 있음)

 

 

equals(Object obj)

▪️ 두 enum 값이 동일한지 확인하고 boolean 값을 반환한다.

▪️ 예시⬇️

UserRole role1 = UserRole.ADMIN;
UserRole role2 = UserRole.ADMIN;
System.out.println(role1.equals(role2)); // 결과: true

 

 

hashCode( )

▪️ enum 상수의 고유한 해시코드를 반환한다.

▪️ 예시⬇️

UserRole role = UserRole.ADMIN;
System.out.println(role.hashCode()); // 해시코드 출력

 


정리

 

Method 설명 대소문자 구분
values( ) 모든 enum 값을 배열로 반환  -
valuesOf(String) 문자열 이름과 정확히 일치하는 상수 반환 O
name( ) enum 상수 문자열로 반환 -
toString( ) enum 상수 문자열로 변환, 커스터마이징 가능 -
ordinal( ) 정의된 순서 반환 (0부터 시작) -
compareTo( ) 두 상수를 순서 기준으로 비교 -
equals( ) 두 값이 동일한지 비교 -
hashCode( ) 상수의 고유한 해시코드 반환 -