[Java] 제네릭스 & 컬렉션

배창민·2025년 9월 16일
post-thumbnail

Java 제네릭스 & 컬렉션


1) 제네릭스(Generics)

개념

  • “타입을 일반화”하여 하나의 클래스/메소드로 다양한 타입을 안전하게 다룸.
  • 타입 안정성(컴파일 타임 체크) + 중복 코드 제거.
public class GenericTest<T> {
    private T value;
    public T getValue() { return value; }
    public void setValue(T value) { this.value = value; }
}

// 사용
GenericTest<Integer> gt = new GenericTest<>();
gt.setValue(10);

2) 와일드카드(?, extends, super)

문법/의미

  • <?> : 모든 타입 허용
  • <? extends T> : T 또는 하위 타입
  • <? super T> : T 또는 상위 타입
public void anyType(RabbitFarm<?> farm) { farm.getAnimal().cry(); }
public void extendsType(RabbitFarm<? extends Bunny> farm) { farm.getAnimal().cry(); }
public void superType(RabbitFarm<? super Bunny> farm) { farm.getAnimal().cry(); }

기억법: PECS — Producer-Extends, Consumer-Super
읽기(생산자)는 extends, 쓰기(소비자)는 super가 안전.


3) 컬렉션 프레임워크 개요

큰 그림

  • Collection 하위: List, Set, Queue
  • Map은 별도 계층(키-값)
인터페이스특징대표 구현체
List\순서 O, 중복 OArrayList, LinkedList, Vector, Stack
Set\순서 X, 중복 XHashSet, LinkedHashSet, TreeSet
Map\<K,V>키-값, 키 중복 XHashMap, LinkedHashMap, TreeMap

4) List & ArrayList

특징

  • 저장 순서 유지, 중복 허용, 인덱스 접근 빠름
  • 동기화 X(멀티스레드 시 외부 동기화 필요)

기본 사용

List<Object> alist = new ArrayList<>();
alist.add("apple"); alist.add(123); alist.add(45.67);
System.out.println(alist);           // toString 오버라이드됨
System.out.println(alist.size());    // 요소 개수
System.out.println(alist.get(0));    // 인덱스 접근
alist.add(1, "banana");              // 중간 삽입(뒤로 밀림)
alist.set(1, true);                  // 수정
alist.remove(2);                     // 삭제

제네릭 & 정렬

List<String> list = new ArrayList<>();
list.add("banana"); list.add("orange"); list.add("apple");

Collections.sort(list);              // 오름차순
// 내림차순(람다)
list.sort((a,b) -> b.compareTo(a));

사용자 정의 객체 정렬(Comparator)

class BookDTO {
  int number, price; String title, author;
  // 생성자/getter/toString 생략
}

// 가격 오름차순
list.sort(Comparator.comparingInt(BookDTO::getPrice));

// 가격 내림차순
list.sort(Comparator.comparingInt(BookDTO::getPrice).reversed());

// 제목 오름차순
list.sort(Comparator.comparing(BookDTO::getTitle));

5) LinkedList

특징

  • 연결 리스트 기반(단일/이중)
  • 삽입/삭제 빈번할 때 유리, 스택/큐 구현 용이

기본 사용

List<String> linked = new LinkedList<>();
linked.add("apple"); linked.add("banana");
linked.remove(0);           // 링크만 수정 → 삭제 비용 낮음
linked.set(0, "fineapple");
System.out.println(linked.isEmpty());
linked.clear();

6) Stack (LIFO)

특징/메소드

  • 마지막에 넣은 것 먼저 나옴
  • push, peek(조회), pop(꺼내며 삭제), search
Stack<Integer> st = new Stack<>();
st.push(1); st.push(2); st.push(3);
System.out.println(st.peek());   // 3
System.out.println(st.pop());    // 3 → 제거
System.out.println(st);          // [1, 2]

빈 스택에서 pop/peekEmptyStackException


7) Queue (FIFO)

특징/메소드

  • 먼저 넣은 것 먼저 나옴
  • offer(삽입), peek(조회), poll(꺼내며 삭제)
  • 구현은 보통 LinkedList 사용
Queue<String> q = new LinkedList<>();
q.offer("first"); q.offer("second");
System.out.println(q.peek()); // first
System.out.println(q.poll()); // first → 제거
System.out.println(q);        // [second]

8) Set & HashSet / LinkedHashSet

Set 공통

  • 중복 X, null1개

HashSet

  • 해시 테이블 기반, 순서 없음, 중복 방지
Set<String> set = new HashSet<>();
set.add("java"); set.add("oracle"); set.add("java"); // 중복 무시
System.out.println(set.contains("oracle"));
for (String s : set) System.out.println(s);
set.clear();

LinkedHashSet

  • HashSet + 삽입 순서 유지
Set<String> lhs = new LinkedHashSet<>(List.of("java","oracle","jdbc"));
System.out.println(lhs); // [java, oracle, jdbc]

정렬 필요 시 → new TreeSet<>(lhs)로 변환


9) TreeSet (정렬 Set)

특징

  • 자동 오름차순 정렬, 이진 검색 트리
  • 중복 X, 순서 X(정렬 기준만 유지)
TreeSet<String> tset = new TreeSet<>();
tset.add("java"); tset.add("oracle"); tset.add("css");
System.out.println(tset); // [css, java, oracle]

// 로또(중복 제거 + 정렬)
Set<Integer> lotto = new TreeSet<>();
while (lotto.size() < 6) lotto.add((int)(Math.random()*45)+1);
System.out.println(lotto); // 예: [6, 8, 13, 22, 28, 36]

10) 핵심 정리

  • List: 순서·중복 필요 → ArrayList(조회↑), LinkedList(삽입/삭제↑)
  • Set: 중복 제거 → HashSet(빠름), LinkedHashSet(삽입순서 유지), TreeSet(정렬)
  • Stack/Queue: LIFO/FIFO는 Stack/Queue(LinkedList)
  • 정렬: Collections.sort or List.sort(Comparator)
    사용자 타입 → Comparator로 기준 정의
  • 제네릭: 컴파일 안전성(캐스팅 제거), 와일드카드로 수용 범위 제어(PECS)
profile
개발자 희망자

0개의 댓글