[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의 사용 방식과 메모리 관리에 대한 이해가 중요함을 깨달았다.

 

'프로젝트 > 트러블슈팅' 카테고리의 다른 글

[Spring]무한 스크롤 + Enum 정렬 트러블슈팅  (2) 2025.04.23
[Spring/Security] 403 Forbidden? 권한 문제가 아니라 CSRF 이 원인이였다  (0) 2025.04.21
[Spring]Filter 예외처리  (0) 2025.04.03
[JAVA]리스트 초기화 오류  (1) 2025.03.05
[JAVA]입력 버퍼비우기 - (Next() , NextLine())  (0) 2025.03.05
'프로젝트/트러블슈팅' 카테고리의 다른 글
  • [Spring/Security] 403 Forbidden? 권한 문제가 아니라 CSRF 이 원인이였다
  • [Spring]Filter 예외처리
  • [JAVA]리스트 초기화 오류
  • [JAVA]입력 버퍼비우기 - (Next() , NextLine())
코딩로봇
코딩로봇
금융 IT 개발자
  • 코딩로봇
    쟈니의 일지
    코딩로봇
  • 전체
    오늘
    어제
    • 분류 전체보기 (143)
      • JavaScript (8)
      • SQL (10)
      • 코딩테스트 (30)
        • Java (15)
        • SQL (13)
      • Java (10)
      • 프로젝트 (25)
        • 트러블슈팅 (9)
        • 프로젝트 회고 (14)
      • git,Github (2)
      • TIL (38)
      • Spring (18)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java #arraylist #list #배열
    스파르타 코딩 #부트캠프 #첫ot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩로봇
[JAVA]Enum 에 선언된 메소드 호출오류
상단으로

티스토리툴바