공변, 불공 변
공변 : A 가 B의 하위 타입인 경우 'T <A>'가 'T <B>'의 하위 타입이면 T는 공변
- 대표 : 배열
불공 변 : A 가 B의 하위 타입인 경우 'T <A>가 'T' <B>'의 하위 타입이 아니면 T는 불공 변
- 대표 : 제네릭
제네릭 프로그래밍
작성한 코드를 다양한 타입의 객체에 대해 재사용하는 객체 지향 기법입니다.
복잡한 애플리케이션을 개발할 때 발생하는 여러 가지 버그들이 많이 줄일 수 있습니다.
간단하게 클래스를 정의하는 경우 클래스 안에 사용되는 자료형을 구체적으로 명시하지 않고 T와 같은
기호로 적어 놓는 것입니다.
제네릭
클래스를 정의하는 경우 구체적인 타입을 적지 않고 변수 형태로 적어 놓는 것입니다.
클래스를 선언하여 객체를 생성하는 경우 구체적인 타입을 기재합니다
타입을 어떤 클래스 종류의 매개변수로 보는 것입니다.
장점
1. 컴파일 시 강한 타입 체크를 할 수 있습니다.
- 실행 시 타입 에러가 발생보다 컴파일 시 미리 타입을 강하게 체크하여 에러를 사전에 방지 가능
2. 타입 변환을 제거합니다.
- 비제네릭 코드는 불필요한 타입 변환을 하여 프로그램 성능에 악영향이 됩니다.
제네릭 메서드
일반 클래스의 메서드에서도 타입 매개 변수를 사용하여 제네릭 메서드를 정의할 수 있습니다.
메서드의 선언 부에 적은 제네릭으로 리턴 타입, 파라미터의 타입이 정해지는 메서드입니다.
제네릭 메서드 사용 이유
매개변수가 많아지는 경우 가독성이 좋지 않아 리턴 타입 옆 별도로 뺐습니다.
비교를 해야 하는 메서드 인경우 Comparable 인터페이스를 반드시 구현한 클래스여야 합니다.
타입 캐스팅 에러의 경우를 제외 가능하여 안전하게 사용이 가능합니다.
제네릭 메서드를 사용하는 경우 클래스의 T와 메서드의 T는 같은 문자를 사용해도 다른 문자로 기억합니다.
제네릭 클래스와의 독립성 확보
제네릭 클래스와 동일하지만 클래스의 <T>와 제네릭 메서드의 <T>는 다릅니다.
제네릭 메서드는 그 메서드를 포함하는 클래스가 제네릭 유무는 상관없습니다.
한정된 타입 매개 변수
특정한 종류의 객체들만 받게 하고 싶은 경우 사용할 수 있는 것이 한정된 타입 매개 변수입니다.
해당 기능을 사용하기 위해 extends 키워드를 사용해야 합니다.
제네릭 과 상속
제네릭 타입도 다른 타입과 동일하게 부모 클래스가 될 수 있습니다.
자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있습니다.
와일드카드
제네릭을 사용하는 코드에서 물음표를 와이드 카드라 불립니다.
어떤 타입이든지 나타낼 수 있고 다양하게 사용 가능하고 매개변수, 필드, 지역 변수의 타입을 나타내는 데 사용됩니다.
정해지지 않는 unknown type 이 프로 Collection <?>으로 선언함으로 써 모든 타입에 대해 호출이 가능합니다.
그러므로 제네릭의 활용성을 높일 수 있고 와일드카드가 arry type이 아닌 unknown type라는 점입니다.
상한이 있는 와일드카드
A 클래스의 자손 클래스들을 와일드카드로 표시하는 경우 <? extends A >와 같이 표시됩니다.
이 표시를 상한이 있는 와일드카드라 합니다.
제한이 없는 와일드카드
단순?으로만 이루어집니다. 즉 List <?>와 같고 이 와일드카드'?' 는 모든 타입에 매치됩니다.
하한이 있는 와일드카드
A 클래스의 조상 클래스 들을 와일드카드로 나타내려는 경우 <? super A>와 같은 문법을 사용합니다.
'백수 > java' 카테고리의 다른 글
java13 기초 (네트워크 프로그랭 기본 개념) (0) | 2022.10.25 |
---|---|
java기초12(리스트,스택,큐,집합,해시 테이블) (0) | 2022.10.24 |
java기초 10 (0) | 2022.10.18 |
java기초 9 (0) | 2022.10.17 |
java기초 8 (0) | 2022.10.13 |