Til


title: 2026-02-01 author: 강병호 (이름) date: 2026-02-01 (날짜) category: TIL/강병호/2026/02 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —

자바에서 제네릭(Generic) 은 기본적으로 무공변(Invariant) 입니다. 무공변이란 타입 S, T가 있을 때 서로 관계가 없다는 것을 의미합니다. S와 T가 서로 상속 관계이면 공변성이 있지만 제네릭은 상속 관계가 호환되지 않습니다. 따라서 타입이 정확히 일치하지 않으면 컴파일 에러가 발생합니다.

public class Animal {
}

public class Cat extends Animal {
}

List<Animal> animals = new ArrayList<Cat>(); // 컴파일 에러
List<Cat> cats = new ArrayList<Animal>(); // 컴파일 에러

무공변은 타입 안정성을 보장하지만 타입의 유연성이 부족하다는 단점이 있어, 자바에서는 와일드카드(?)와 extends, super 키워드로 공변과 반공변을 지원합니다.

공변(Covariant) 은 S가 T의 하위 타입일 때 S는 T가 될 수 있다는 것을 의미합니다. 제네릭에서는 <? extends T>를 사용하여 하위 타입을 허용하고 읽기 전용으로 사용할 수 있습니다. 쓰기는 null만 가능합니다.

반공변(Contravariant) 은 S가 T의 하위 타입일 때 T는 S가 될 수 있다는 것을 의미합니다. 제네릭에서는 <? super S>를 사용하여 상위 타입을 허용하고 쓰기 전용으로 사용할 수 있습니다. 읽기는 Object 타입으로만 가능합니다.

results matching ""

    No results matching ""