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가 더 좋음