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 |