
⚠️ 문제
프로그래머스
import java.util.LinkedHashMap;
import java.util.Map;
class Solution {
public int solution(int cacheSize, String[] cities) {
if (cacheSize == 0) return cities.length * 5; // 캐시 없으먄 모두 miss
int time = 0;
// accessOrder = true
// 이렇게 하면 최근에 접근한 순서대로 자동 정렬
LinkedHashMap<String, String> cache = new LinkedHashMap<>(cacheSize, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
return size() > cacheSize; // 캐시 크기 초과하면 자동으로 가장 오래된 것 삭제
}
};
for (String city : cities) {
city = city.toLowerCase();
if (cache.containsKey(city)) {
time += 1; // hit
} else {
time += 5; // miss
}
cache.put(city, city); // 접근시 자동으로 최근 순서 갱신
}
return time;
}
}
문제를 이클립스에서 풀다가 아래와 같은 경고 발생(두번째 경고)

🧐 원인
해석하면 Serializable 클래스를 만들었는데, serialVersionUID라는 고유 ID를 선언하지 않았다는 뜻이다.
직렬화만 사용하지 않으면 무시해도 되는 경고이다.
private static final long serialVersionUID = 1L; // 여기에 ID 추가
여기서 Serialization(직렬화)는 바이트 스트림 형태로 변환해서 파일이나 네트워크로 저장/전송할 수 있게 하는 기능이다.
- serialVersionUID는 클래스 버전 관리 번호
- 직렬화된 데이터를 다시 읽을 때 같은 클래스 버전인지 확인하는 용도이다.
- 클래스 구조가 바뀌었는데 UID가 다르면 오류가 발생한다. → InvalidClassException
- seaialVersionUID를 선언하지 않아도 원래는 컴파일러가 자동으로 만들어 주지만 클래스 구조가 바뀌면 명시적으로 선언해주어야 한다.
아래 코드가 경고가 발생하는 부분인데
LinkedHashMap이 Serializable을 구현하고 있다.
LinkedHashMap<String, String> cache = new LinkedHashMap<>(cacheSize, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
return size() > cacheSize;
}
};
- 여기서 { ... } 안에 removeEldestEntry 오버라이딩 → 익명클래스
- 클래스 이름 없음 → 컴파일러가 Main$1 이런 식으로 자동 생성
- 즉 익명 클래스 내부에는 serialVersionUID 라는 정적(static) 필드를 넣을 수 없다.
⚡ 해결법
- 무시 (경고를 무시하고 직렬화 안 쓰면 됨)
- Named 클래스로 바꾸고 serialVersionUID 선언
class LRUCache extends LinkedHashMap<String, String> {
private static final long serialVersionUID = 1L; // 직접 선언 가능
private final int cacheSize;
public LRUCache(int cacheSize) {
super(cacheSize, 0.75f, true);
this.cacheSize = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
return size() > cacheSize;
}
}
LRUCache라는 이름 있는 클래스를 만들어서 LinkedHashMAp을 상속받으면 된다.
또는 익명 클래스 그대로 두고 경고만 없애는 법
- @SuppressWarnings("serial") 쓰기
@SuppressWarnings("serial")
LinkedHashMap<String, String> cache = new LinkedHashMap<>(cacheSize, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
return size() > cacheSize;
}
};'Java' 카테고리의 다른 글
| [Java] 자바의 package.info 란? (1) | 2025.09.06 |
|---|---|
| [Java] Main.java unchecked or unsafe operations 에러 해결법 (2) | 2025.09.04 |
| [Java] local variables referenced from a lambda expression must be final or effectively final 에러 해결법 (6) | 2025.08.18 |
| [Java] (상속) 참조타입과 실제타입 중 무엇을 따라가는가? (5) | 2025.06.24 |
| [Java] (상속)변수는 메서드처럼 오버라이딩 되지 않는다. (3) | 2025.06.24 |