CH13

yeon·2022년 12월 11일
0

이것이자바다

목록 보기
10/15

1. 제네릭 사용 이유

제네릭

타입을 파라미터화해서 컴파일 시에 구체적 타입 결정되도록 하는 것으로 컬렉션, 람다식, 스트림, NIO 에서 사용됨

사용 이점

컴파일 시 강한 타입 체크 가능하고, 타입 변환을 제거할 수 있음

List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0);


List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0);

2. 제네릭 타입

타입을 파라미터로 가지는 클레스와 인터페이스
public class CLASSNAME <T> {...}
public interface INTERFACENAME <T> {...}

사용 예시

public class Box<T> {
	private T t;
    public T get() {return t;}
    public void set(T t) {this.t = t;}
}

Box<String> box = new Box<String>();
box.set("hello");
String str = box.get();

Box<Integer> box = new Box<Integer>();
box.set(5);
int value = box.get();

3. 멀티 타입 파라미터

두 개 이상의 타입 파라미터 사용 가능
class<K, V, ...> {...}
interface<K, V, ...> {...}

4. 제네릭 메소드

매개변수 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
public <T, ...> RETURNTYPE METHODNAME(parameter,...){...}

5. 제한된 타입 파라미터

타입 파라미터에 지정되는 구체적인 타입을 제한

제한 방법

  • 상속 및 구현 관계 이용
    public <T extends Parent> returnType method(parameter,...) {...}
    상위 타입으로 클래스 뿐만 아니라 인터페이스도 지정 가능
  • 타입 파라미터 대체할 구체적 타입 명시

주의할 점

  • 메소드의 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)로 제한하여 하위 타입에만 있는 필드와 메소드는 사용 불가능

6. 와일드카드 타입

제네릭 타입을 매개변수나 리턴 타입으로 사용할 때 파라미터 제한할 목적으로 사용됨
public static void registerCourse(Course<?> course)
public static void registerCourse(Course<? extends Student> course)
public static void registerCourse<Course<? super Worker> course)

형태

  • 제한 없는 경우 <?>
    타입 파라미터 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입 올 수 있음
  • 상위 클래스 제한 <? extends 상위타입>
    타입 파라미터 대치하는 구체적인 타입으로 상위/하위 타입만 올 수 있음
  • 하위 클래스 제한 <? super 하위타입>
    타입 파라미터 대치하는 구체적인 타입으로 하위타입이나 상위 타입만 올 수 있음

(상위)A-B-C-D-E(하위) 인 경우
<? extends C> : C, D, E 만 위치 가능
<? super C> : A, B, C 만 위치 가능

7. 제네릭 타입의 상속과 구현

부모 클래스의 제네릭 타입

타입 파라미터는 자식 클래스에도 기술해야하며 추가적인 타입 파라미터 가질 수 있음

public class ChildProduct<T,M,C> extends Product<T, M> {...}

제네릭 인터페이스

타입 파라미터는 구현 클래스에도 기술해야함

public class StorageImpl<T> implements Storage<T> {...}
profile
🐥

0개의 댓글

관련 채용 정보