Language/Java

Java - 제네릭

둉이 2021. 7. 7. 19:26

 

제네릭 타입이란?
타입을 파라미터로 가지는 클래스와 인터페이스
상속과 구현에 사용될 수 있음
public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }
// 혹은
public class 클래스명<T, M> { ... }
public interface 인터페이스명<T, M> { ... }

→ 제네릭 타입의 장점

    1. 컴파일 시 강한 타입 체크

       : 타입 에러 방지

    2. 타입 변환 제거

       : 요소를 명시하기 때문

 

- 예시

// Box 클래스 선언
public class Box<T> {
     private T object;
     public T get() { return t; }
     public void set(T t) { this.t = t; }
}

// Box 제네릭 타입 이용
public class BoxExample {
    public static void main(String[] args) {
        Box<String> box1 = new Box<String>();
        box1.set("hello");
        String str = box1.get();

        Box<Integer> box2 = new Box<Integer>();
        box2.set(6);
        int value = box2.get();
    }
}

 

 

제네릭 메소드

: 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드

public <타입 파라미터1, 타입 파라미터2, ...> 리턴타입 메소드명(매개변수1, 매개변수2, ...) { ... }

- 예시

// 제네릭 메소드 선언
public class Util {
	public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
    	boolean keyCompare = p1.getKey().equals(p2.getKey());
        boolean valueCompare = p1.getValue().equals(p2.getValue());
        return keyCompare && valueCompare;
    }
}

// 제네릭 메소드 사용
public static void main(String[] args) {
	Pair<Integer, String> p1 = new Pair<Integer, String>("user1", "홍길동");
	Pair<Integer, String> p2 = new Pair<Integer, String>("user2", "홍길동");
    
    boolean result = Util.<Integer, String>compare(p1, p2);
}

 

 

제한된 타입 파라미터

: 타입을 제한해야 하는 경우, 제한해야 하는 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 됨

public <T extends 상위타입> 리턴타입 메소드(매개변수1, 매개변수2, ...) { ... }

 

- 예시

public static <T extends Number> int compare(T t1, T t2) { ... }

 

 

와일드카드 타입 <?>

: 구체적인 타입을 명시하지 않고 사용 가능

- 제네릭타입<?>

  : 모든 클래스나 인터페이스 타입 가능

- 제네릭타입<? extends 상위타입>

  : 상위 타입을 제한하여 해당 상위타입의 하위타입만 사용 가능

- 제네릭타입<? super 하위타입>

  : 하위 타입을 제한하여 해당 하위타입의 상위타입만 사용 가능

 

 

제네릭 타입의 상속과 구현

// 부모 클래스로 사용 예시
public class ChildProduct<T, M, C> extends Product<T, M> { ... }

 

'Language > Java' 카테고리의 다른 글

Java - 람다식  (0) 2021.07.18
Java - 멀티 스레드 정리  (0) 2021.07.02
Java - 기본 API 클래스 정리  (0) 2021.06.25
Java - 중첩 클래스와 중첩 인터페이스, 예외 처리 복습  (0) 2021.06.25
Java - 인터페이스 복습  (0) 2021.06.24