프로그래밍/java

[자바JAVA] 제네릭(generic)_와일드카드

pupu91 2022. 9. 3. 17:16
반응형

 


제네릭(generic)

 

데이터의 타입을 일반화한다는 의미

클래스나 메서드에서 사용할 내부 데이터 타입을  컴파일 시에 지정하는 방법

제네릭을 이용하면 instanceof 비료 및 다운 캐스팅을 하지 않아도 됨.


 

1 . 제네릭 설정

- 다이아몬드 연산자 <> 이용

- 관례상 대문자로 작성

- <타입변수라함>

- 타입 변수를 자료형 대신 사용, 가상으로 존재

- 여러 개의 타입 변수를 작성도 가능

- 컴파일 시점에서 타입 결정됨.

public class GenericTest<T> {
	private T value;

getter, setter 작성 시에도 구체적인 타입 대신 T 사용 가능
public void setValue(T value) {
		this.value = value;
	}
	
	public T getValue() {
		return value;
	}

 

 

 

 

2 . 제네릭 사용

(1) <Integer>로 인스턴스 생성 후 출력
GenericTest<Integer> gt1 = new GenericTest<Integer>();
gt1.setValue(10);
System.out.println(gt1.getValue());

(2)<String>으로 인스턴스 생성 후 출력
GenericTest<String> gt2 = new GenericTest<String>();
gt2.setValue("홍길동");
System.out.println(gt2.getValue());

(3) <Double>으로 인스턴스 생성 후 출력
GenericTest<Double> gt3 = new GenericTest<>(); <-생성자 쪽의 타입 생략 가능
gt3.setValue(0.5);
System.out.println(gt3.getValue());

--실행 결과
10
홍길동
0.5

=>반환 값이 명시한 타입과 같다는 걸 확인할 수 있음

 

반응형

 

3 . 상속시 사용 가능

- 제네릭 클래스에 extends 키워드를 사용해 타입 제한 가능

- 인터페이스 상속시 implements가 아닌 extends로 표현해야 함.

 

 

 

 

4 . 와일드 카드

- 제네릭 클래스 타입의 객체를 메소드의 매개변수로 받을 때 그 객체의 타입을 제한 할 수 있음

토끼 농장에 있는 토끼가 어떤 토끼던 상관 없음
public void anyType(RabbitFarm<?> farm) {
		farm.getAnimal().cry();
	}

토끼 농장의 토끼는 Bunny 이거나 
그 후손 타입으로 만들어진 토끼 농장만 매개변수로 사용
public void extendsType(RabbitFarm<? extends Bunny> farm) {
		farm.getAnimal().cry();
	}

토끼 농장의 토끼는 Bunny이거나 
그 부모 타입으로 만들어진 토끼 농장만 매개변수로 사용
public void superType(RabbitFarm<? super Bunny> farm) {
		farm.getAnimal().cry();
	}
반응형