Today
-
Yesterday
-
Total
-
  • enum 클래스
    Language/Java 2023. 11. 30. 00:01

    열거형 클래스 enum

    enum 키워드를 사용하는 열거형 클래스에는, 상수값을 나열하여 사용하는 방법 외에도 다양한 사용 방법이 있다.

    일반적인 클래스와 마찬가지로, 생성자, 필드, 메서드를 가질 수 있다.

    이 주제를 정리하게 된 이유는 강의 실습 중에 아래와 같은 사용을 경험했고 전혀 이해하지 못했기 때문이다.

    🔻 실습 중 사용된 코드들

    // 1. Enum 클래스 정의
    
    @Getter
    @AllArgsConstructor
    public enum ErrorCode {
        USER_NOT_FOUND("사용자가 없습니다.");
    
        private final String description;
    }
    // 2. 1에서 정의한 Enum 클래스를 사용하기 위한 AccountException 클래스 작성
    
    @Getter @Setter @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class AccountException extends RuntimeException {
        private ErrorCode errorCode;
        private String errorMessage;
    
        public AccountException(ErrorCode errorCode) {
            this.errorCode = errorCode;
            this.errorMessage = errorCode.getDescription();
        }
    }
    // 3. 1과 2에서 정의한 객체 사용 
    
    new AccountException(ErrorCode.USER_NOT_FOUND));

    이런 식으로 Enum 클래스를 처음 사용해봐서 코드 이해가 너무 어려웠다.

    검색한 내용의 이해를 바탕으로 정리 ✏️

    enum 클래스는 아래와 같이 정의해볼 수 있을것 같다.

    public enum Anytings {
        MONKEY("원숭이🙈"),
        DOG("강아지"),
        CAT("고양이"),
        BEAR("곰"),
        SOJU("🥃"),
        BEER("🍺");
        
        private final String description;
        
        // 생성자 
        Anythings(String str) {
            this.description = str;
        }
        
        // Getter 메서드 생성
        public String getDescription() {
            return description;
        }
    }

    내가 너무 어렵게 생각하나..

    보통 클래스로 바꿔 생각해보면

    public class Main {
        private final String desc;
        
        Main(String desc) {
            this.desc = desc;
        }
        
        public String getDesc() {
            return desc;
        }
    }

    이 구조에서 클래스 블록 안의 첫 번째 줄에 상수를 선언하면서 동시에 생성자에 값을 넘겨주는 형태가 되는거다.

    으음..;

    확실히 독특하네 🤔

    enum 클래스 블록의 첫줄에 연이어 작성한

    public enum Anytings {
        MONKEY("원숭이🙈"),
        DOG("강아지"),
        CAT("고양이"),
        BEAR("곰"),
        SOJU("🥃"),
        BEER("🍺");
    }

    이 부분이 머리에 잘 안들어온다. 일단은 그냥 외워야지 뭐..🙈;;

    이렇게 선언해두고 MONKEY를 사용하면

    System.out.println(Anythings.MONKEY.getDescription());

    이렇게 사용했을 때 출력값으로 원숭이🙈 가 나온다.

    enum 클래스에서 위의 상수 선언과 ("텍스트")를 붙여서 입력하는 것은 곧

    public static final Anythings 상수 = new Anythings("텍스트");

    와 같은 것으로 우선 이해했다.

    그러니까

    public enum Anytings {
        MONKEY("원숭이🙈"),
        DOG("강아지"),
        CAT("고양이");
        
        private final String description;
        
        // 생성자 
        Anythings(String str) {
            this.description = str;
        }
        
        // Getter 메서드 생성
        public String getDescription() {
            return description;
        }
    }

    이런 형태의 enum 클래스를 생성했다면

    이 파일이

    public enum Anytings {
        public static final Anytings MONKEY = new Anytings("원숭이🙈");
        public static final Anytings DOG = new Anytings("강아지");
        public static final Anytings CAT = new Anytings("고양이");
        
        private final String description;
        
        // 생성자 
        Anythings(String str) {
            this.description = str;
        }
        
        // Getter 메서드 생성
        public String getDescription() {
            return description;
        }
    }

    이런식으로 해석되는건가 🤔

    자바로 구현해봄!

    일단 구현은 비슷하게 된것같다.

    그런데 enum 클래스를 찾아보면

    이렇게 변수와 상수를 매칭해서 사용하는 방법 외에도

    enum 클래스에서 기본적으로 지원하는 메서드가있다.

    클래스 블록의 첫째줄에 나열하는 상수들에 대한 인덱스 번호? ordinal() 메서드로 알아낼 수 있는 상수 나열 번호를 비롯하여 다양한 기능을 하는 메서드가 있었다.

    그런걸 보면 내가 생각한것처럼 단순하게 상수로 한줄씩 선언되지는 않는것 같다.

    비슷하게 구현해보는것도 재밌을것 같은데

    공부할게 너무 많이 밀려있어서 ㅠㅠ enum은 여기까지만 학습해볼려고 한다.

    enum에서 기본으로 제공하는 메서드에 대한 간략한 소개는 아래에 있다!

    그리고 추가적으로 enum에 사용자 정의 메서드도 작성할 수 있다고 하니, 나중에 실습하다가 사용하게되거나, 관련해서 추가 학습이 필요해지면 그때 더 학습 해보기로 !

    enum 클래스의 기본 구현 메서드

    이 부분은 각각 어떤 기능을 하는지만 글로 간략히 나타냄!

    1. ordinal()

    이건 배열의 index를 반환 받는 것과 같다.

    enum 상수의 선언 순서를 반환

    2. values()

    이건 Map 의 keySet()과 같다.

    enum의 모든 상수를 담은 배열을 반환 대신 반환 자료형은 enum 클래스.

    3. valueOf(String name)

    주어진 문자열과 일치하는 이름을 가진 enum 상수를 반환 일치하는 상수가 없다면 IllegalArgumentException을 던짐

    ✏️🤓 IllegalArgumentException

    매개변수의 값이 
    메서드나 생성자에서 요구하는 범위, 형식, 조건 등을 충족하지 못했을 때 발생
     
    RuntimeException의 하위 클래스로,
    컴파일 타임에는 감지되지 않고 런타임에 발생!

    4. name()

    상수명을 String 자료형으로 반환 받는다.

    enum 상수의 이름을 문자열로 반환

    5. toString() , equals() , compareTo()

    보통의 class 객체와 같이 toString() , equals() , compareTo() 메서드를 사용할 수 있다.

    'Language > Java' 카테고리의 다른 글

    Stream  (0) 2023.12.01
    함수형 인터페이스  (0) 2023.12.01
    Optional  (0) 2023.11.30
    자바 메모리 모델 Java Memory Model  (0) 2023.11.30
    싱글톤 패턴  (0) 2023.11.30

Designed by Tistory / Custom by 얼거스