Week3 Generic & Collection

나현·2026년 9월 21일

java2

목록 보기
2/7

Generic

1) Generic programming

  • 일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법
  • 타입을 파라미터로 가지는 클래스와 인터페이스를 정의
    -> Type(T) 안에는 무엇이든 다 담아도 됨

2) Generic을 사용하는 이유

  • 컴파일 시 강한 타입 체크 가능
  • 타입명시 / 타입변환 제거 가능

제네릭을 사용하지 않았을 때

List list = new ArrayList();
list.add("hello");
String str = (String)list.get(0); 
//타입변환(String)을 해야하는 불편함이 발생함!
Box box = new Box();
box.set("hello"); //String -> Object 자동 타입 변환 
String str = (String) box.get(); //Object -> String 강제 타입 변환
//object면 다 들어갈 수 있지만 타입변환 발생!(n)

제네릭 사용했을 때

List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0);
//타입변환 불필요! list에는 String만 저장할 수 있도록 타입을 명시했으므로.

3) Generic 만들기

  • 클래스 선언 시에는 타입 파라미터 T 사용
  • 컴파일 시(생성 시) 타입 파라미터가 구체적인 타입 (String, Integer..)로 변경
  • 멀티 타입 파라미터도 가능
public class Box<T> {
	private T t;
    public T get() { return t; }
    public void set(T t) { this.t=t; }
Box <String> box = new Box <String>();
box.set("hello");
String str = box.get();

4) Generic 메소드

  • 매개변수 타입과 리턴타입으로 타입 파라미터를 가지는 메소드
  • 타입 매개 변수의 범위는 메소드 내부로 제한됨

    public <A,B,...> 리턴타입 메소드명(매개변수,...) {...}
    // A,B: 타입 파라미터

public <T> Box<T> boxing(T t) {...}
// T를 받아서 Box<T> 리턴
Box<Integer> box1 = boxing(100);

<T> (표지판): "이 메서드 안에서는 임시로 T라는 알 수 없는 타입을 쓸 거야!"라고 컴퓨터에게 미리 알려주는 역할
Box<T> (리턴 타입): "이 메서드 작업이 다 끝나면 T 타입이 담겨있는 Box 객체를 결과로 돌려줄게."
boxing(T t) (매개변수): "입력값으로는 T 타입의 데이터를 하나 받을게."
-> 실제 실행했을 때
"입력값 자리에 100(Integer)이 들어왔네? 그럼 지금부터 이 메서드의 T는 전부 Integer로 바꿔서 처리해야겠다!" 하고 알아서 타입을 유추
-> 메서드가 public Box<Integer> boxing(Integer t)로 완벽하게 변신

5) Generic의 제한된 타입 파라미터

  • 상속(클래스) 및 구현(인터페이스) 관계를 이용해 상위 타입 제한
    -> 상위 타입을 구체적으로!
public <T extends 동물> T getAnimal() { return ...}

6) Generic 와일드카드 타입

  • ?: 제네릭 타입을 매개값이나 리턴타입으로 사용할 때, 범위에 있는 모든 타입으로 대체할 수 있는 ?로 표시 -> 특정 타입 종속x, 재사용성.

    자바 제네릭의 '불공변성'
    타입 파라미터끼리 상속관계가 있더라도 제네릭 타입 간에는 상속 관계가 전혀 성립하지 않는 성질
    -> 사과가 과일의 자식이지만, List<사과>가 List<과일>의 자식은 아님
    => 와일드 카드를 통해 타입의 다형성과 유연성 보장(extends, super의 한정적 와일드카드를 통해 List<과일>로 옮길 수 있음

  • 제네릭타입<?>: Unbounded Wildcards(제한없음)

  • 제네릭타입<? extends 상위타입>: Upper Bounded Wildcards(상위 클래스 제한) -> 꺼내기만 가능

public void printFruits(List<? extends Fruit> basket) {
    for (Fruit f : basket) { 
        System.out.println(f);  //꺼내기
    }
  • 제네릭타입<? super 하위타입>: Lower Bounded Wildcards(하위 클래스 제한) -> 쓰기, 추가만 가능
public void addFruits(List<? super Fruit> basket) {
    basket.add(new Apple()); //상위타입에 추가
    basket.add(new Pear());

Collection

1) collection

  • 자바에서 자료구조 구현 (리스트, 스택, 큐, 집합, 해쉬 테이블 등)
  • 컬렉션 클래스/인터페이스 제공
  • 인터페이스와 구현 분리 ex) List 인터페이스를 ArrayList와 LinkedList 클래스가 구현
  • 컬렉션프레임워크에는 객체만 저장(박싱(Integer, Double..)필요)

2) 컬렉션 인터페이스

  • List: 순서 유지, 중복O
    -> ArrayList, LinkedList, Vector
  • Set: 순서x, 중복x
    -> HashSet, TreeSet
  • Map: 키 중복x
    -> HashMap, TreeMap
    cf. Map은 컬렉션상속x. but KeySet(), values(), entrySet() 메소드 제공

-> 컬렉션 인터페이스에는 모든 컬렉션의 공통 기능만 정의. get(index i)X

3) List 컬랙션과 주요메소드
(1) ArrayList

  • 가변 -> 초기용량 초과하면 자동적으로 늘어남
  • 단방향리스트
List<E> list = new ArrayList<>();

(2) LinkedList

  • 포인터 사용
  • 양방향리스트
  • List, Queue 인터페이스 동시 구현 -> 스택/큐
  • 빈번한 개체 삽입/삭제가 일어나는 곳에서는 ArrayList보다 좋은 성능
List<E> list = new LinkedList<E>();

3) Vector

  • synchronized로 동기화
  • 사용 X (ArrayList를 멀티쓰레드용 동기화처리 후 사용 -> Collections.synchronizedList();)

Set과 Map

1) Set

  • 순서유지x, 중복x
  • get(index)x -> Iterator, forEach

2) Set 인터페이스 구현
(1) HashSet

  • 가장 우수. but 순서 일정x(Set)
  • hashCode로 동등 객체 여부 판단
  • 연산: addAll(합집합), retainAll(교집합), removeAll(차집합), containsAll(부분집합)

(2) LinkedHashSet

  • 순서 유지, 중복x

(3) TreeSet

  • 원소 정렬하여 관리
  • HashSet보다 느림

(4) Enumset

  • 중복x 상수

3) Map
(1) Map 컬렉션

  • Map 인터페이스와 collection 인터페이스의 저장방식 다름 (키, 값)
  • 요소의 저장순서 유지x, 키 중복x, 값 중복o
  • 주요 메소드:
Set<Map.Entry<K,V>> entrySet() //키, 값 쌍의 모든 Map.Entry 객체를 Set에 담아 리턴
Set<K> keySet() // 모든 키를 Set에 담아서 리턴
Collection<V> values() //저장된 모든 값 Collections에 담아서 리턴

(2) HashMap

Map<K,V> map = new HashMap<K,V>();
  • 키 타입으로 String 많이 사용
    <- String은 같을 때 동등 객체가 될 수 있도록 hashCode(), equals() 메소드가 재정의되어있기 때문

4) CollectionPrinter - PrettyPrinter
링크텍스트

0개의 댓글