Java (Collections Framework)

최병현·2026년 1월 13일

java

목록 보기
17/38

이 내용은 Backend / OOP logic in Java 영역에서 “여러 객체를 구조적으로 관리하는 방법”을 다루는 핵심 개념이다. 배열(Array)이 고정 크기·단순 구조라면, 컬렉션(Collections)은 가변 크기, 정렬, 중복 처리, 키-값 구조 등을 지원하는 자료구조 프레임워크다.

또한 Java의 List는 Python의 List와 유사해 보이지만, 구현 방식·성능 특성·타입 시스템(Generic) 측면에서 차이가 크다.


1. Collections Framework 개요

컬렉션 프레임워크는 “객체(Object)들을 모아서 관리하는 자료구조들의 집합”이다.

  • List : 순서 O, 중복 O
  • Set : 순서 X, 중복 X
  • Map : Key-Value 쌍 구조

배열과의 핵심 차이:

  • 크기가 자동으로 늘어남
  • 삭제 시 빈 공간이 남지 않음
  • 정렬, 검색, 중복 제거 등의 기능이 내장

2. List 계열

List는 “순서가 있고 중복을 허용하는” 자료구조다.

  • ArrayList : 배열 기반, 조회(get) 속도가 빠름
  • LinkedList : 연결 리스트, 삽입/삭제가 빠름
List<String> strList = new ArrayList<>();
strList.add("Java");
strList.add("python");
strList.add("Java");   // 중복 허용
System.out.println(strList); // [Java, python, Java]

3. Array vs List 차이

// 배열
String[] strArray = new String[5];
strArray[0] = "김영";
strArray[4] = "김사";

// List
List<String> strList = new ArrayList<>();
strList.add("Java");
strList.add("python");
strList.add("C++");

차이점:

  • 배열: 크기 고정, index 기반 접근
  • List: 크기 가변, add/remove로 자동 관리
  • 배열 삭제: null 대입 → 공간 유지
  • List 삭제: 실제 element 제거 → 크기 감소
// 배열 삭제
strArray[0] = null;

// List 삭제
strList.remove("python");
System.out.println(strList);

4. 정렬과 검색 (Collections)

Collections.sort(strList); // 오름차순
Collections.sort(strList, Comparator.reverseOrder()); // 내림차순

boolean contains = strList.contains("Java");
System.out.println("Java 포함 여부: " + contains);

.contains()는 “부분 문자열”이 아니라 “요소 전체 일치”만 검사한다.


5. Set 계열

Set은 “중복을 허용하지 않고, 순서를 보장하지 않는” 집합 구조다.

  • HashSet : 순서 X, 빠른 검색
  • TreeSet : 자동 정렬 유지
Set<String> strSet = new HashSet<>();
strSet.add("java");
strSet.add("java");
strSet.add("python");
System.out.println(strSet); // [java, python]

실무 패턴:

  • List → Set : 중복 제거
  • Set → List : 정렬, 인덱스 접근
List<String> list = new ArrayList<>();
list.add("SpringBoot");
list.add("java");
list.add("java");
list.add("python");

// 중복 제거
Set<String> set = new HashSet<>();
set.addAll(list);

// 다시 List로
List<String> result = new ArrayList<>();
result.addAll(set);
Collections.sort(result);
System.out.println(result);

6. Map 계열

Map은 “Key-Value 쌍(entry)” 구조다.

  • HashMap : 순서 X, 빠름
  • TreeMap : Key 정렬 유지

JavaScript의 객체(object), Python의 dict와 개념적으로 유사하다.

Map<String, String> strMap = new HashMap<>();
strMap.put("kor2026001", "김일");
strMap.put("kor2026002", "김이");
System.out.println(strMap);

같은 Key에 put하면 value는 덮어쓰기 된다.

strMap.put("kor2026001", "KimOne");

7. Map 값 수정과 검색

// put : 존재하면 수정, 없으면 새로 생성
// put : 존재하면 수정, 없으면 새로 생성
koreanScores.put("김오", 4.5);

// replace : 존재할 때만 수정
koreanScores.replace("김육", 789.2);

// Key / Value 존재 여부
strMap.containsKey("kor2026001");
strMap.containsValue("김삼");

8. Map → Set → List 구조

Map의 모든 entry를 Set으로 변환할 수 있다.

Set<Map.Entry<String, String>> entrySet = strMap.entrySet();

Key는 중복 불가 → Set으로 변환 가능 Value는 중복 가능 → Set으로 바로 변환 불가 (Collection으로 반환)

Set<String> keySet = strMap.keySet();
Collection<String> values = strMap.values();

9. 실습 예제: 수학여행 후보 정리

List로 입력 → Set으로 중복 제거 → 다시 List로 변환 후 정렬

List<String> fieldTrips = new ArrayList<>();

for (int i = 0; i < 5; i++) {
    String str = scanner.next();
    fieldTrips.add(str);
}

Set<String> fieldTripSet = new HashSet<>();
fieldTripSet.addAll(fieldTrips);

List<String> finalFieldTrips = new ArrayList<>();
finalFieldTrips.addAll(fieldTripSet);

Collections.sort(finalFieldTrips, Collections.reverseOrder());

for (String field : finalFieldTrips) {
    System.out.println(field);
}

10. 실무 예제: 도서 재고 관리 (Map)

Map<String, Integer> bookStocks = new HashMap<>();

bookStocks.put("자바의 정석", 10);
bookStocks.put("스프링 인 액션", 5);

// 재고 수정
bookStocks.replace("자바의 정석", 15);

// 출력
for (Map.Entry<String, Integer> entry : bookStocks.entrySet()) {
    System.out.println("도서명: " + entry.getKey()
        + ", 재고: " + entry.getValue());
}

11. 동작 원리 정리

1) List : 입력 순서 유지, 중복 허용 → 사용자 입력, 로그, 히스토리

2) Set : 중복 제거, 순서 없음 → 후보군, 참석자 명단, 태그 목록

3) Map : Key-Value 구조 → 계정 관리, 재고, 설정 값, DTO 매핑


12. 주의점

  • List에서 중복 제거는 불가 → 반드시 Set 활용
  • Set은 순서가 없으므로 index 접근 불가
  • Map에서 put은 “수정 + 신규 생성” 둘 다 가능, replace는 “수정 전용”

13. 정리

Collections는 단순 자료구조가 아니라,

  • 데이터 구조 설계
  • 중복 처리 전략
  • 조회/정렬 성능

까지 함께 고려하는 백엔드 핵심 기초다.

이 구조는 이후 Spring Boot에서

  • List<DTO> : 다건 조회 결과
  • Set<String> : 태그/중복 제거
  • Map<String, Object> : 동적 응답, 통계 데이터

형태로 그대로 이어진다. 즉, 컬렉션은 “문법”이 아니라 “데이터 구조 사고 방식”이다.

profile
Develop

0개의 댓글