본문 바로가기
Develop/Java

0903

by ys2ys2 2024. 9. 7.

제네릭

제네릭 : 결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능

 

타입 파라미터 선언 어떻게 하지?

public class Box <T> {
	public T content;
}

 

타입 파라미터 선언 <>

일반적으로 대문자 알파벳 한 글자로 표현(ex. T,E,K,V ...)

지정 안하면 Object 타입 암묵적 사용

<T>는 T가 타입 파라미터임을 뜻하는 기호. 타입이 필요한 자리에 T를 사용할 수 있음

Box<String> box = new Box<String>(); → Box<String> box = new Box<>();
Box<Integer> box = new Box<Integer>(); → Box<Integer> box = new Box<>();

 

제네릭 타입

결정되지 않은 타입을 파라미터로 가지는 클래스, 인터페이스

public class 클래스명<A, B, ...> {...}
public interface 인터페이스명<A, B, ...> {...}

 

일반적으로 대문자 알파벳 한 글자로 표현

외부에서 제네릭 타입을 사용하려면? → 타입 파라미터에 구체적 타입 지정. (지정 안하면 Object 타입)

 

제네릭 메소드

타입 파라미터를 가지고 있는 메소드. 타입 파라미터가 메소드 선언부에 정의됨

리턴 타입 앞에 <> 기호 추가하고 타입 파라미터 정의 후 리턴 타입과 매개변수 타입에서 사용

public <A, B, ...> 리턴타입 메소드명(매개변수, ...) { ... }

<A, B, ...>부분이 타입 파라미터 정의 부분

 

타입 파라미터 T는 매개값의 타입에 따라 컴파일 과정에서 구체적인 타입으로 대체

public <T> Box<T> boxing(T t) { ... }

 

제한된 타입 파라미터

모든 타입으로 대체할 수 없음! 특정 타입과 자식 or 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터, extends 사용

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

 

상위 타입은 클래스 뿐만 아니라 인터페이스도 가능

public <T extends Number> boolean compare(T t1, T t2{	
	double v1 = t1.doubleValue();		//Number의 doubleValue() 메소드 사용
    	double v2 = t2.doubleValue();		//Number의 doubleValue() 메소드 사용
    	return (v1 == v2);
}

 

extends Number 했으니 숫자형만 가능. 문자형 오면 error

 

와일드카드 타입 파라미터

제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타입 파라미터.

와일드카드 ? 로 표시

리턴타입 메소드명 (제네릭타입 <? extends Student> 변수 { ... }
리턴타입 메소드명 (제네릭타입 <? super Wroker> 변수 { ... }
리턴타입 메소드명 (제네릭타입 <?> 변수 { ... }

 

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

MVC 이해하기  (2) 2024.10.12
0902  (0) 2024.09.06