제네릭(Generic) 2편 마무리

2022. 10. 12. 21:29Java 프로그램

728x90

제네릭 2편 이어서 시작 하겠습니다!

1. 멀티 타입 파라미터

- 각 타입 파라미터는 ' , ' 로 구분합니다.

ex) class<K,V,...>{...}      interface<K,V,...>{...}

한번 코드를 작성 해볼까요?

public class Test<P,M> {
	private P product;
	private M modelNumber;
    
	public P getProduct() {
		return product;
	}
	public void setProduct(P product) {
		this.product = product;
	}
	public M getModelNumber() {
		return modelNumber;
	}
	public void setModelNumber(M modelNumber) {
		this.modelNumber = modelNumber;
	}

}

Test 클래스에 멀티 파라미터 <P,M> 을 사용했습니다.

main 메소드에서 어떻게 사용하는지 확인 해야 마음이 편안합니다.. 그러니 한번 해보도록 하겠습니다!

public class Practice {

	public static void main(String[] args) {
		Test<String,Integer> test = new Test<>();
		test.setProduct("Air Conditional");
		test.setModelNumber(1121121);
		String product = test.getProduct();
		int mnumber = test.getModelNumber();
		
		System.out.println(product);
		System.out.println(mnumber);
		
	}

}

역시 연습 클래스인 practice의 main 메소드에서 멀티 파라미터가 어떻게 활용되는지 확인하기 위한 코드를 작성했습니다.

product 변수와 mnumber 변수는 각각 String, int 형 변수이고, 같은 클래스 객체 내에서 강제 형 변환 없이 자연스럽게 사용이 가능함을 볼 수 있습니다.

 

2. 제네릭 메소드

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

1) 제네릭 메소드 선언 방법

=> 리턴 타입 앞에 "<>" 기호를 추가,  타입 파라미터를 작성

ex)

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

=> public<T> Test<T> dotest(T t) {...}

2) 제네릭 메소드 호출하는 두 가지 방법

2-1) 리턴타입 변수 = <구체적인 타입> 메소드명(매개값);

ex) Test<Integer> test = <Integer> dotest(100);

 

2-2) 리턴타입 변수 = 메소드명(매개값);

ex) Test<String> test = dotest("hello")

 

 

 

 

3. 제한된 타입 파라미터

- 타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 있습니다.

1) 상속 및 수현 관계에 이용해 타입 제한

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

2) 타입 파라미터를 대체할 구체적인 타입

- 상위 타입이거나 하위 또는 구현 클래스만 지정 가능합니다.

 

 

 

4. 와일드 카드 타입

- 와일드 카드 타입은 세 가지의 형태가 존재합니다.

1) 제네릭타입<?> : 제한 없음

- 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있습니다.

2) 제네릭 타입<? extends 상위 타입> : 상위 클래스 제한

- 타입 파라미터를 대치하는 구체적인 타입으로 상위 타입이나 하위 타입만 올 수 있습니다.

3) 제네릭 타입<? super 하위 타입> : 하위 클래스 제한

- 타입 파라미터를 대치하는 구체적인 타입으로 하위 타입이나 상위 타입이 올 수 있습니다.

 

 

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

- 제네릭 타입을 부모 클래스로 사용할 경우는 타입 파라미터는 자식클래스도 기술 해줘야 합니다-!

ex) public class ChildProduct <T , M> extends Product<T,M> {...}그리고 자식은 추가적인 타입을 가질 수 있습니다.

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

 

이로써 제네릭에 대해서 공부해 봤습니다.

역시 부족한 저의 글이지만 최선을 다해 설명을 해봤습니다 ㅎㅎㅎㅎ 감사합니다!

반응형