20220929(목)
- 목차
- 제네릭 타입
- 멀티 타입 파라미터
- 제네릭 메소드
- 제한된 타입 파라미터
- 와일드카드 타입
- 제네릭 타입의 상속과 구현
< 제네릭 타입 > - class<T>, interface<T>
✨ 제네릭 특징
: 타입을 매개변수로 미리 정해 놓으면 ➡ 추후 관련된 메소드의 매개변수 타입이 변경된다.
- 제네릭 타입
- 타입을 파라미터로 가지는 클래스와 인터페이스
- 선언 시 클래스 또는 인터페이스 이름 뒤에 <> 부호(=타입 파라미터) 붙임 - 일반클래스 vs 제네릭클래스
- 일반클래스 : 제네릭 미사용
- 제네릭클래스 : 제네릭 사용(타입만 다르고 클래스의 구조를 그대로 쓰고 싶을 경우 사용)
class ArrayList {
Integer a;
}
class ArrayList {
String a;
}
➡ 다루고 싶은 데이터가 늘어나는 만큼 클래스가 계속 늘어난다. 🤯🤯
----------------------------------------------------------------------------------------------------------------
<자바제공> 🤩
class ArrayList {
T a;
}
✨ 위 코드구조를 재사용해서 타입별로 사용 😍😍
ArrayList<Integer> al = new ArrayList<Integer>();
ArrayList<String> al = new ArrayList<String>();
< 멀티 타입 파라미터 > - class<K, V>, interface<K, V>
- 멀티 타입 파라미터
- 제네릭 타입은 두 개 이상의 타입 파라미터 사용 가능
- 각 타입 파라미터는 콤마로 구분
ex) class<K, V > - 뒷부분 생략 가능
ex) Product<Car, String> product2 = new Product<Car, String>();
➡ Product<Car, String> product2 = new Product<>(); 😊
< 제네릭 메소드 > - <T, R> R method(T t)
- 제네릭 메소드
- 메소드에 타입파라미터 작업을 하는 것. / 다양한 데이타타입들을 사용하고 싶은 경우
- 비교목적 : 하나의 데이타타입에 해당하는 의미만 비교목적으로 사용했었는데,
제너릭인 경우에는 여러 데이타타입들 비교목적으로 사용가능
- 제네릭 메소드 선언 방법
1) 리턴 타입 앞에 “<>” 기호를 추가하고 타입 파라미터 기술
2) 타입 파라미터를 리턴 타입과 매개변수에 사용 - class 클래스 <T> {
public <E> Box <E> boxing(T t) {return 변수;}
// public <타입파라미터> 리턴타입 메소드명(매개변수) {...}
// 얘(제네릭 클래스의 제네릭을 이용하는 메소드)와 구분해야 됨! public T getKind() {return this.kind;}
}
✨ 제네릭 메소드 문법구성
public static <타입파라미터> 리턴타입 메소드명(타입 매개변수) {
return 변수;
}
--------------------------------------------------------------------------------------------------------------------------
✔ 일반메소드 문법구성 😮 똑같은데 <>만 추가!
public static 리턴타입 메소드명 (타입 매개변수) {
return 변수;
}
< 제한된 타입 파라미터 > - <T extends 최상위타입>
- 타입 파라미터 제한
- 상속 및 구현 관계 이용해 타입 제한
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) {...}
- 상위 타입은 클래스 뿐만 아니라 인터페이스도 가능
// Number 추상클래스 : Byte, Short, Integer, Long 클래스의 상위클래스
public class Util {
// T extends Number : Number 클래스 이거나 Number 클래스를 상속, 구현한 클래스만 사용가능.
// T extends 인터페이스 : implements 키워드 사용안함.
public static 리턴타입 메소드명() {</t extends number>}
< 와일드카드 타입 >
제네릭타입<?> | 제네릭타입<? extends 상위타입> | 제네릭타입<? super 하위타입> |
Unbounded Wildcards (제한없음) |
Upper Bounded Wildcards (상위 클래스 제한) |
Lower Bounded Wildcards (하위 클래스 제한) |
타입 파라미터를 대치하는 구체적인 타입으로 ~ | ||
모든 클래스나 인터페이스 타입 |
상위 타입이거나 상속받은 하위 타입 |
하위 타입이나 상위 타입 |
< 제네릭 타입의 상속과 구현 >
- 제네릭 타입을 부모 클래스로 사용할 경우
- 타입 파라미터는 자식 클래스에도 기술 ➡ 만들지 않으면 이클립스에서 에러뜸! 🥵
public class ChildProduct<T, M> extends Product<T, M> {...}
- 추가적인 타입 파라미터 가질 수 있음
public class ChildProduct<T, M, C> extends Product<T, M> {...} - 제네릭 인터페이스를 구현할 경우
- 제네릭 인터페이스를 구현한 클래스도 제네릭 타입
'🏫 Open API_JAVA' 카테고리의 다른 글
[50일차] andThen()과 compose() 디폴트 메소드 / 메소드 참조 / 입력 스트림과 출력 스트림 (0) | 2022.10.05 |
---|---|
[49일차] 람다식 기본 문법 / 타겟 타입과 함수적 인터페이스 / 표준 API의 함수적 인터페이스 (0) | 2022.10.03 |
[47일차] Set 컬렉션(HashSet) / Map 컬렉션(HashMap, Hashtable, Properties) / 검색 기능을 강화시킨 컬렉션 / LIFO와 FIFO 컬렉션 (0) | 2022.09.29 |
[46일차] 스레드 그룹 / 스레드풀 / 컬렉션 프레임워크 / List 컬렉션 (0) | 2022.09.28 |
[45일차] 동기화 메소드와 동기화 블록 / 스레드 상태 / 스레드 상태 제어 / 데몬 스레드 (0) | 2022.09.27 |