JAVA

자바의 신 21장 Generic

yswn1531 2024. 4. 23. 21:51

제네릭

  • 단어의 뜻 : 일반적인
  • 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
  • 클래스와 인터페이스만 적용
  • 클래스에서는 T로 작성해도 되나, 사용시 즉 선언시에는 타입을 명시해줘야 함. 

변성

  • 두 타입이 서로 상속 관계에 있을 때 각 타입을 Type Argument로 받고 있는 Base Type이 어떤 관계에 있는지에 대해 나타내는 것
  • 공변성, 반공변성, 무공변성
    • 공변성: 하위 타입 관계가 보존되는 성질 / 상한 경계
    • 반공변성: 상위 타입 관계가 보존되는 성질 / 하한 경계
    • 무공변성: 타입 일치가 엄격한 성질
    • 존재 목적: 형 시스템을 안전하고 유연하게 설계가능

장점

  • 재사용성 증가
  • 컴파일 시 타입 에러 발견
  • 컴파일러가 타입 변환 수행

주의사항

  • 원시타입(int, long)은 사용할 수 없다.
  • 제네릭 타입을 사용한 객체 생성은 불가하다.
  • static 멤버는 제네릭을 사용할 수 없다.
  • 제네릭 클래스 자체를 배열로 생성은 불가능하다.
  • 타입 형변환이 불가능하다

타입 한정 키워드

  • extends 를 통해 타입을 제한시킴

WirdCard

  • 제네릭 타입을 사용할 때 구체적인 타입 대신 사용할 수 있는 유연한 방법
  • ? 기호로 표현
  • 상한 경계 <? extends T>
    • 상위 클래스를 제한
  • 하한 경계 <? super T>
    • 하위 클래스를 제한

타입 소거

  • 이전 버전과의 호환성을 목적으로 타입을 처리하는 방식
  • 컴파일 시점에 발생한다. 그래서 런타임에서 타입을 알 수 없다.
  • 과정
    • 타입 체크 및 변환: 타입 안정성 만족 체크
    • 타입 매개변수 제거: 제네릭 타입 제거 후, 제한 타입이나 상한 타입 있으면 그것을 사용하고 없으면 Object
    • 브릿지 메소드 삽입: 메소드 시그니처 충돌문제 해결 목적 메소드 삽입

 

 

와일드카드(?)가 확장성이 더 좋으면, 다 와일드카드 쓰면 되는거 아니야? T 쓰지말고?

  • 특정 타입에 대한 작업이 필요한 경우, T가 더 좋음