Set과 Map: 중복 방지와 플레이어별 기록 조회
19강. Set과 Map: 중복 방지와 플레이어별 기록 조회
1. 이번 강의에서 해결할 문제
플레이어별 조회 때마다 전체 기록을 반복 검색하거나 이름 중복을 수동으로 제거하면 코드가 복잡해집니다. 목적에 맞는 컬렉션이 필요합니다.
2. 학습 목표
3. 핵심 개념
Set은 중복 없는 원소 집합이고 Map은 key에서 value로 연결합니다. HashSet과 HashMap의 순회 순서는 보장되지 않으므로 표시 순서가 필요하면 정렬하거나 LinkedHash 계열을 선택합니다. GameRecord 목록은 중복을 허용하되 플레이어 이름 집합은 중복을 제거합니다.
4. 단계별 실습
1. src/PlayerLookup.java 작성
실행 환경: 코드 편집기
실행 위치: C:\dev\game-records
실행 전 확인: 같은 이름의 기존 파일이 있다면 덮어쓰기 전에 Git diff와 이번 강의 변경 범위를 확인합니다.
대상 파일: src/PlayerLookup.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
record GameRecord(String playerName, int score) {}
public class PlayerLookup {
public static void main(String[] args) {
List<GameRecord> records = List.of(
new GameRecord("Alice", 1300), new GameRecord("Bob", 900), new GameRecord("Alice", 1450));
Set<String> players = new HashSet<>();
Map<String, List<GameRecord>> byPlayer = new HashMap<>();
for (GameRecord record : records) {
players.add(record.playerName());
byPlayer.computeIfAbsent(record.playerName(), key -> new ArrayList<>()).add(record);
}
System.out.println("고유 플레이어 수: " + players.size());
System.out.println("Alice 기록: " + byPlayer.getOrDefault("Alice", List.of()));
}
}
2. PowerShell에서 컴파일·실행
실행 환경: Windows PowerShell
실행 위치: C:\dev\game-records
실행 전 확인: java -version과 javac -version이 선택한 LTS JDK를 가리키고, 소스 파일명이 public 클래스명과 일치하는지 확인합니다.
대상: 이 강의의 .java 파일, out의 class 파일과 명시된 출력 파일
Set-Location C:\dev\game-records
javac -d out .\src\PlayerLookup.java
java -cp out PlayerLookup
예상 결과: 고유 플레이어 수 2와 Alice의 두 기록이 출력됩니다.
5. 코드가 동작하는 이유
Set.add는 같은 문자열을 다시 넣어도 집합 크기를 늘리지 않습니다. computeIfAbsent는 key가 처음 등장할 때만 새 목록을 만들고 이후 같은 목록에 기록을 추가합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Set과 Map: 중복 방지와 플레이어별 기록 조회 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.