ultra_dev
이것이 자바다 CH13 제네릭 본문
📌 제네릭
:결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적 타입으로 대체 시키는 기능
public class Box <T> {
public T content;
}
<T>는 T가 타입 파라미터임을 뜻하는 기호, A부터 Z까지 어떤 알파벳을 사용해도 괜찮음. 단지 이름일 뿐
Box<String> box = new Box<String>();
box.content = "안녕하세요.";
String content = box.content; //강제타입변환 필요 없이 안녕하세요 얻기 가능
Box<Integer> box = new Box<Integer>();
box.content = 100;
int content = box.content; // 강제타입변환 필요 없이 100 얻기 가능
☑️ 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스
-> 기본타입은 타입 파라미터의 대체타입 될 수 없음 따라서 Box<int>는 안되는 것
Box<Integer> box = new Box<Integer>();
==
Box<Integer> box = new Box<>();
: 변수 선언할 때와 동일한 타입으로 호출 원하면, 생성자에는 타입 명시 안하고 <>만 해도 됨
📌 제네릭 타입
:결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스
-> 선언부에 <>부호가 붙고 그 사이에 타입 파라미터들이 위치
->만약 지정하지 않으면 object 타입이 암묵적으로 사용
public class Product<K, M> {...} // 타입 파라미터로 K,M 정의
☑️타입 파라미터는 기본적으로 Object타입으로 간주되므로 Object가 가지고 있는 메소드 호출 가능
public class Box<T>{
public T content;
}
---------------------------
public class GenericExample{
//이 경우는 위에서 타입 명시 안했으니 암묵적으로 Object클래스로 됐을 것이고
//int는 기본타입이니 Integer로 오토박싱 후 들어갔을 것
Box Box1 = new Box();
box.content = 100;
📌 제네릭 메소드
:타입 파라미터를 가지고 있는 메소드
-> 타입 파라미터가 메소드 선언부에서 정의된다는 점에서 제네릭 타입과 차이가 있다.
->리턴 타입 앞에 <>로 타입 파라미터 정의한 뒤, 리턴 타입과 매개변수 타입에서 사용
public <A,B,...> 리턴타입 메소드명(매개변수,...){...}
public <T> Box<T> boxing(T t) {...}
타입 파라미터 T는 <>가 없어도 매개값이 어떤 타입이냐에 따라 컴파일 과정에서 구체적인 타입으로 대체된다.
Box<Integer> box1 = boxing(100);
Box<String> box2 = boxing("안녕하세요");
-> 100의 클래스타입이 Integer이므로 타입 파라미터 T는 Integer로 대체되어 Box<Integer>가 리턴
-> "안녕하세요"의 클래스 타입이 String이므로 타입 파라미터 T는 String으로 대체되어 Box<String>이 리턴
📌제한된 타입 파라미터
:타입 파라미터를 대체하는 구체적인 타입을 제한
모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현관계에 있는 타입만 대체 가능한 타입 파라미터
ex)숫자를 연산하는 제네릭 메소드는 대체 타입으로
Number 또는 Number의 자식 클래스로 제한할 필요가 있다.
public<T extends 상위타입> 리턴타입 메소드(매개변수,...) {...}
public<T extends Number> boolean compare(T t1, T t2){
double v1 = t1.doubleValue(); //Number의 doubleValue()메소드 사용 가능해짐
double v2 = t2.doubleValue();
return (v1 == v2);
}
📌 와일드카드 타입 파라미터
: 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때, 타입 파라미터로 ?(와일드카드) 사용 가능
public class Applicant<T>{
public T kind;
}
리턴타입 메소드명(제네릭타입<? extends Student> 변수) {...}
-> Student와 자식 클래스만 가능
public static void register1(Applicant<? extends Student> applicant){...}
리턴타입 메소드명(제네릭타입<? super Worker> 변수) {...}
-> Worker와 부모 클래스만 가능
public static void register2(Applicant<? super Worker> applicant){...}
리턴타입 메소드명(제네릭타입<?> 변수) {...}
-> 어떤 타입이든 가능
public static void register3(Applicant<?> applicant){...}
'이것이 자바다' 카테고리의 다른 글
이것이 자바다 CH12.모듈 (0) | 2023.01.27 |
---|---|
이것이 자바다 CH 11(예외처리) (0) | 2023.01.13 |
이것이 자바다 CH 9(중첩 선언과 익명 객체) (0) | 2023.01.13 |
이것이 자바다 CH 8(인터페이스) (0) | 2023.01.13 |
이것이 자바다 CH 7-2(상속) (0) | 2023.01.13 |