본문 바로가기
Java

[JAVA] 자바 - 무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍

by Seong-Jun 2022. 1. 5.
728x90
반응형
SMALL

제네릭 자료형 정의

  • 클래스에서 사용하는 변수의 자료형이 여러 개일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언합니다.
  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식입니다.
  • 컬렉션 프레임워크에서 많이 사용되고 있습니다.
  • 제네릭 타입을 사용하지 않는 경우의 예

재료가 Powder인 경우

public class ThreeDPrinter1 {
	private Powder material;
	
	public void setMeterial(Powder material) {
		this.material = material;
	}
	
	public Powder getMaterial() {
		return material;
	}
}

재료가 Plastic인 경우

public class ThreeDPrinter2 { // 클래스에 1, 2같은 숫자 사용하는거 별로 좋은거 아니지만 이것은 예제여서 상관 x
	private Plastic material;
	
	public void setMeterial(Plastic material) {
		this.material = material;
	}
	
	public Plastic getMaterial() {
		return material;
	}
}

여러타입을 대체하기 위해 Object를 사용할 수 있습니다.

public class ThreeDPrinter3 { // 클래스에 1, 2같은 숫자 사용하는거 별로 좋은거 아니지만 이것은 예제여서 상관 x
	// 이 printer는 재료가 뭐든지 다 적용
	
	private Object material;
	
	public void setMeterial(Object material) {
		this.material = material;
	}
	
	public Object getMaterial() {
		return material;
	}
}

Object를 사용하는 경우 형 변환을 해줘야 합니다.

Powder powder = new Powder();
		ThreeDPrinter3 printer = new ThreeDPrinter3();
		
		printer.setMeterial(powder);
		
		Powder p = (Powder)printer.getMaterial(); // 이때 반환되는 값이 Object이기 때문에 앞에 (Powder)를 써줘서 형변환을 해야한다.

GenericPrinter.java

public class GenericPrinter<T> { // T자리에 실제적으로 사용할 자료형을 쓴다. 나중에 쓸 때
	private T material;
	
	public void setMeterial(T material) {
		this.material = material;
	}
	
	public T getMaterial() {
		return material;
	}
	
	public String toString() {
		return material.toString();
	}
}
  • 자료형 매개변수 T(Type Parameter): 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정, static 변수는 사용할 수 없습니다.
  • GenericPrinter: 제네릭 자료형
  • E: element, K: key, V: value 등 여러 알파벳을 의미에 따라 사용 가능합니다.

제네릭 클래스 사용하기

Powder.java

public class Powder {
	public String toString() {
		return "재료는 Powder 입니다.";
	}
}

Plastic.java

public class Plastic {
	public String toString() {
		return "재료는 Plastic 입니다.";
	}
}

GenericPrinter.java

public class GenericPrinter<T> {  // T자리에 실제적으로 사용할 자료형을 쓴다. 나중에 쓸 때
	private T material;
	
	public void setMeterial(T material) {
		this.material = material;
	}
	
	public T getMaterial() {
		return material;
	}
	
	public String toString() {
		return material.toString();
	}
}

GenericPrinterTest.java

public class GenericPrinterTest {

	public static void main(String[] args) {
		Powder powder = new Powder();
		
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // <> : 다이아몬드 연산자
		powderPrinter.setMeterial(powder);
		
		Powder p = powderPrinter.getMaterial(); // 형변환을 하지 않는다.
		// 형변환을 하지 않는 이유 : GenericPrinter<Powder>이렇게 작성하면 컴파일될 때 GenericPrinter 클래스에 있는 모든 T가 Powder로 바뀜.
		
		System.out.println(powderPrinter.toString());
		
	}

}

출력 결과

재료는 Powder 입니다.
728x90
반응형
LIST

댓글