프로젝트/트러블슈팅

[JAVA]Enum 에 선언된 메소드 호출오류

코딩로봇 2025. 3. 13. 20:07

intro

  • 프로젝트를 진행하며 발생한 문제 상황과 해결 과정들을 상세히 기록하고 추후에 같은 문제가 발생 했을때 빠르게 문제 해결하기 위해 트러블 슈팅을 정리할려고 한다.
  • 기록하는 습관을 기르기 위해 프로젝트 기간동안 꾸준히 작성할 것 이다.

Kiosk 프로젝트에서 사용자별 할인률을 관리하는 User Enum 에서 예외가 발생하여 콘솔 실행이 안되는 문제가 발생했다.

 

⚠️ 1.문제 상황 발생

주문을 선택하면 Enum에 있는 user.value() 들을 가져오지 못하고 NullPointerException 이 발생했다.

 

 

🔎 2.원인 추론

우선 viewUser() 메소드를 살펴보았다.

public enum User {
    국가유공자(20),
    군인(10),
    학생(5),
    일반(0);

    private int sale;

    User(int sale){
        this.sale = sale;
    }

    public int getSale(){
        return sale;
    }

    public void viewUser(){
        for(User user:User.values()){
            System.out.println(user);
        }
    }
}

 

NullPointerException 이 발생한 원인을 추론해보면 Enum 에서 선언된 메소드로 Enum 의 values 들을 불러오지 못해서 그런거 같다. Enum 은 static 즉, 상수로 선언되어 있는 객체이기 때문에 new 를 사용 못하듯이 이것도 그러한 이유 같았다.

 

📝  3.해결방안

Enum 클래스는 new 를 통한 생성이 불가능한 것을 알았다. 즉 Static의 영역에 올라가는 것이다.

 

정적 멤버 변수란?

  • Static 변수  +  Static 메서드가 합쳐진 것 
  • 클래스에 고정된 멤버이다.(객체 소속 x)

 

Heap 영역

new 로 생성된 객체와 배열은 Heap 영역에 저장된다.

인스턴스의 실제 데이터는 Heap 영역에 올라가고 지정된 메모리 위치가 다르기 때문에 Static 메서드 에서 외부 인스턴스 멤버에 접근할 수 없다.

 

즉, new 객체로 생성 이전에는 접근을 할 수 없다.

 

 

 

이러한 특성들과 Enum 클래스의 객체에는 new 사용할 수 없는 특성을 고려하여 해당 클래스의 메서드를 외부에서 활용할려면 해당 메서드를 Static 영역에 미리 등록해놔야 한다.

그래서 Enum 메소드를 사용하기 위해선 Static 을 반드시 붙여야만 사용 가능하다.

public static void viewUser(){
         for(int i=0;i<users.length;i++)
         {
             System.out.println((i+1)+". "+users[i]+": "+users[i].getSale()+"%");
         }
    }

 

 

📌4.결과 확인

 

정상적으로 작동하였다!

 

 

✒️회고

- 이번 트러블 슈팅을 통해 Enum의 특성과 static 메소드의 필요성을 이해할 수 있었다.

- Enum의 사용 방식과 메모리 관리에 대한 이해가 중요함을 깨달았다.