스택큐힙리스트

자바 스프링 개발 시작하기 - 3일차 컬렉션과 제네릭으로 학생 명단 관리 본문

개발

자바 스프링 개발 시작하기 - 3일차 컬렉션과 제네릭으로 학생 명단 관리

스택큐힙리스트 2025. 7. 9. 08:23
반응형

1. 오늘의 목표

  • List·Map·Set·제네릭 핵심 문법 이해
  • 학생 명단 관리 미니 프로그램 작성
  • for-each / Iterator / Stream 순회 방식 장단점 체험

2. 컬렉션 & 제네릭 한눈에 잡기

자바 컬렉션 프레임워크(List, Map, Set)는 데이터를 담고 다루는 기본 도구입니다.
제네릭을 함께 쓰면 타입 안정성을 유지하면서도 형변환 코드를 없앨 수 있어 코드 가독성이 크게 높아집니다.


3. 미니 프로그램 설계

  1. 도메인 클래스
    public record Student(String id, String name, int grade) {}
  2. 저장 구조
    • List<Student> : 등록 순서 보존, 전체 명단 출력
    • Map<String, Student> : 학번(id) ↔ 학생 검색·수정
    • Set<Student> : 중복 방지(예: 전학 온 학생 필터링)
  3. 핵심 로직 예시
class StudentService {
    private final List<Student> roster = new ArrayList<>();
    private final Map<String, Student> rosterById = new HashMap<>();
    private final Set<Student> uniqueCheck = new HashSet<>();

    public void add(Student s) {
        if (uniqueCheck.add(s)) {      // Set으로 중복 검사
            roster.add(s);
            rosterById.put(s.id(), s);
        }
    }

    public Student find(String id) {   // Map으로 O(1) 조회
        return rosterById.get(id);
    }
}

4. 순회 방식 3종 비교

방식코드 예시특징
for-each for (Student s : roster) { ... } 가장 간단, 내부적으로 Iterator 사용
Iterator Iterator<Student> it = roster.iterator(); while(it.hasNext()){...} 요소 제거 시 안전, 레거시 컬렉션에도 적용
Stream roster.stream().filter(s -> s.grade()>=90).forEach(System.out::println); 선언적·병렬처리 용이, 람다식으로 가독성 ↑

 

성능은 요소 수·연산 내용에 따라 달라지지만, 가독성필요 기능(병렬/필터링 등) 을 기준으로 선택하는 것이 실무 팁입니다.


5. 프로그램 완성 예시 (메인)

public class RosterApp {
    public static void main(String[] args) {
        StudentService service = new StudentService();
        service.add(new Student("S001", "김하늘", 95));
        service.add(new Student("S002", "이바다", 88));

        // 1) for-each
        for (Student s : service.getAll()) {
            System.out.println(s);
        }

        // 2) Iterator
        Iterator<Student> it = service.getAll().iterator();
        while (it.hasNext()) {
            Student s = it.next();
            if (s.grade() < 90) it.remove();
        }

        // 3) Stream
        service.getAll().stream()
                .sorted(Comparator.comparingInt(Student::grade).reversed())
                .forEach(System.out::println);
    }
}

6. 정리 & 실전 팁

  • List → Map → Set 순으로 기능을 분리하면 관리·검색·중복처리를 깔끔하게 해결.
  • 개발 초기엔 for-each로 빠르게 시작하고, 성능·가독성을 위해 Stream으로 단계적 리팩터링.
  • 실무에선 불변 컬렉션(Java 9 List.of(), Map.of() 등)과 병렬 Stream도 적극 활용해보세요.
반응형
Comments