학습키워드
- 제네릭
- 제네릭 클래스
- 제네릭 메서드
- Wrapper 클래스
제네릭 메서드
>의미
: 제네릭으로 선언한 메서드
: 클래스 전체가 아닌 특정 메서드만 제네릭 선언을 할 수 있다.
>제네릭 메서드 정의
: 제네릭 메서드의 타입 매개변수는 반환타입 앞에 선언한다.
class Main {
...
public <T> void sleep(T element){
...
}
}
>제네릭 메서드의 특징 및 장점
: static 메서드에서도 선언 가능하다.
: 제네릭 메서드의 타입은 메서드를 호출할 때 지정된다.
: 타입 지정을 생략할 수 있다. (컴파일러가 자동으로 인자의 자료형으로 타입을 지정함)
: 제네릭 메서드의 내용에는 Object 클래스의 메서드만 사용할 수 있다.
//어떤 타입이 지정될 지 모르기 때문이다. 하지만 Object 클래스는 모든 클래스의 상위 클래스이기 때문에 상관없다!
>제네릭 메서드와 제네릭 클래스 타입 매개변수 차이
: 제네릭 클래스와 제네릭 클래스가 한 클래스에 동시에 선언되어 있다면, 제네릭 클래스의 타입 매개변수와 제네릭 메서드의 타입 매개변수는 서로 다른 매개변수이다.
: 매개변수의 특성(지역 변수)을 생각하면 이해하기 쉽다. 클래스 내의 변수명과 같은 이름의 매개변수를 메서드에 적용해도 문제없는 것과 같다.
: 제네릭 클래스의 타입은 클래스의 인스턴스가 생성될 때 지정된다.
: 제네릭 메서드의 타입은 해당 메서드가 호출될 때 지정된다. (타입 인자는 생략이 가능하다)
class Cake<T> {
...
public <T> void whipping(T element) {
...
}
}
Cake<String> cake = new Cake<>();
//제네릭 클래스의 타입은 인스턴스 생성 시 지정됨.
cake.<Integer>whipping(100);
//제네릭 매서드의 타입은 해당 메서드 호출 시 지정됨.
cake.wipping(100); // 타입 생략도 가능
//제네릭 메서드의 타입 인자 생략 시, 컴파일러가 자동으로 주어진 인자를 기준으로 지정함.
//??매개변수가 여러 개여도 컴파일러가 메서드 내에서 골라서 쏙쏙 해줄까? =>골라서 다 처리해준다.
//예시.
class Cake<T> {
public <T, A> void whipping(T element, A atom) {
System.out.println(element + "번 " + atom);
}
}
Cake<String> cake = new Cake<>();
cake.whipping(100, "저어라");
//출력: 100번 저어라
//T element = Integer 100
//A atom = String "저어라"
>제네릭 메서드 주의 사항
: 제네릭 메서드의 타입은 메서드가 호출될 때 정해지므로, 타입이 정의되지 않은 시점. 즉, 메서드 선언 시에 특정 타입이 사용할 수 있는 메서드(해당 타입의 메서드)는 사용 불가능하다.
//예시 1.
//T와 A가 '+'연산자를 사용할 수 있는 타입인지 모름.
public <T, A> void whipping(T element, A atom) {
System.out.println(element + atom);//에러
}
//예시 2.
//T가 String이라는 보장이 없음.
public <T> void whipping(T elementm) {
System.out.println(element.length());//에러
}
>제네릭 메소드의 제한된 타입 매개변수 선언
: 제네릭 클래스의 제한된 타입 매개변수 선언과 똑같은 구조와 기능을 갖는다.
와일드카드
>의미 및 특징
: 메서드의 타입을 어떤 타입으로도 대체할 수 있게 하는 파라미터
: 기호 ? 로 표현함.
: 기능적으론 제네릭 메서드와 다를게 없지만, 제네릭이 아님!
: 특히 제네릭 클래스를 매개 변수로 할 때, 주로 사용.
: 제네릭 메서드보다 와일드카드를 많이 쓸 예정. 물론 같이 쓰는 것도 가능!
: 상한 제한(extends), 하한 제한(super)을 두어 <?>에 넣을 수 있는 타입에 제한을 둠.
>제한 없음, <?>
: 어떤 타입의 타입 파라미터도 받을 수 있음.
>상한 제한, <? extends T>
: T와 T를 상속받는 하위 클래스 타입만 타입 파라터로 받을 수 있음.
>하한 제한, <? super T>
: T와 T가 상속한 상위 클래스 타입만 타입 파라미터로 받을 수 있음.
// 읽을 순 있겠는데, 예제를 만들기가 진짜 어렵네... 시간될 때 만들어보자
'코드스테이츠_국비교육 > [Section1]' 카테고리의 다른 글
16.06_예외 처리_22.09.13 (0) | 2022.09.15 |
---|---|
16.05_열거형_22.09.13 (0) | 2022.09.14 |
16.02_제네릭 클래스_22.09.13 (1) | 2022.09.13 |
16.01_Wrapper 클래스_22.09.13 (0) | 2022.09.13 |
15_추석 전 날_22.09.08 (0) | 2022.09.09 |