getOrDefault() vs computeIfAbsent() – 차이점과 성능 이슈

린린린·2025년 8월 7일

💡getOrDefault()의 기본 동작                                                   

  • getOrDefault(key, defaultValue)무조건 defaultValue평가(즉, 계산/실행)
  • 그 키가 실제로 Map에 존재해도 평가
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");

String result = map.getOrDefault("key1", someExpensiveMethod());

위 코드에서 "key1"은 실제로 map에 존재 →someExpensiveMethod()의 리턴값은 사용되지 않음
But, 여전히 이 메서드는 실행된다
즉, getOrDefault()는 "기본값을 사용할 일이 없더라도 미리 계산해두는 것"

❓문제는 언제 발생할까?                                                   

map.getOrDefault("missingKey", loadDataFromDatabase()); // ❌
  • loadDataFromDatabase()DB 조회처럼 무거운 작업일 경우
  • 실제로 "missingKey"가 Map에 존재하면 안 써도 될 값인데도 호출됨

👉 비용 낭비!

✏️해결책 → computeIfAbsent()                                                   

  • computeIfAbsent()는 키가 없을 때만 계산을 게으르게(lazy) 수행
String value = map.computeIfAbsent("missingKey", key -> loadDataFromDatabase());
  • 이 코드는 "missingKey"가 없을 때만 loadDataFromDatabase() 실행
  • 있다면 그냥 기존 값 반환 → 계산 안 함
  • 그리고 계산된 값은 Map에 자동으로 저장

✅언제 어떤 걸 써야 할까?                                                   

  • 기본값이 단순하거나 값이 항상 필요함? 👉 getOrDefault() why? 코드 간결
  • 기본값 계산 비용이 큼 (ex. DB, 파일 I/O, API 등)? 👉 computeIfAbsent() why? 성능 절약
  • 키가 없을 때 Map에 값도 저장하고 싶음? 👉 computeIfAbsent() why? 자동 저장

📌 요약                                                   

  • getOrDefault()는 기본값을 항상 계산함 (있는 키에도 계산!)
  • computeIfAbsent()는 키가 없을 때만 계산 (그리고 저장까지 함)
  • 무거운 로직이라면 꼭 computeIfAbsent() 고려하기!!!!

이 글에서는 백준 문제 풀이 과정에서 사용한 주요 기술과 알고리즘을 설명합니다.

  • 특정 요소 찾기

실제 문제 풀이 코드는 아래 깃허브 저장소에서 확인하실 수 있습니다.
👉 깃허브 - 백준 문제 풀이 저장소


이 글과 코드를 보시고 개선할 부분이나 궁금한 점이 있으면 편하게 댓글이나 메시지로 알려주세요.💪
여러분의 피드백 덕분에 더 나은 콘텐츠를 만들 수 있습니다.
함께 성장해 나가요!

profile
개발은모르겠고일단기록

0개의 댓글