본문 바로가기

DEVELOPER/Java

제네릭(Generic) 프로그래밍 <T>

반응형

제네릭 자료형 정의


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

 

Generic 자료형을 사용하지 않을 때

  • 여러 자료형 타입을 수용하기 위해 Object로 만들 수 있음
  • 단, 인스턴스를 생성 후 클래스 데이터 타입을 이용하기 위해선 강제 형 변화를 줘야 할 때가 있음

 

 


코드 예제


여러 재료를 가지는 3D 프린터를 예제로 만들었을 때

 

1. Plasitc 재료

public class Plastic {

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

 

2. Powder 재료

public class Powder {

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

 

3. Powder를 재료로 사용하는 3D Printer

public class ThreeDPrinter1 {

	private Powder material;

	
	public Powder getMaterial() {
		return material;
	}


	public void setMaterial(Powder material) {
		this.material = material;
	}


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

 

4. Plastic을 재료로 사용하는 3D Printer

public class ThreeDPrinter2 {

	private Plastic material;
	
	
	public Plastic getMaterial() {
		return material;
	}


	public void setMaterial(Plastic material) {
		this.material = material;
	}


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

 

5. 다양한 데이터 타입을 수용할 Object 타입

public class ThreeDPrinter3 {

	private Object material;

	public Object getMaterial() {
		return material;
	}

	public void setMaterial(Object material) {
		this.material = material;
	}
	
}

 

6.  Test 생성

public class ThreeDPrinterTest {

	public static void main(String[] args) {
		
		Powder powder = new Powder();
		ThreeDPrinter3 printer = new ThreeDPrinter3();
		
		printer.setMaterial(powder);
		
		Powder p = (Powder)printer.getMaterial();
		}
}
  • printer 변수는 Object형으로 생성될 수 있다.
  • Object 메서드 setMaterial은 Object형을 매개 변수로 받는다. 그리고 Powder 타입으로 생성된 powder는 Object로 자동 형 변환이 되기 때문에 매개 변수로 들어갈 수 있다.
  • 그러나 이것을 powder로 반환하기 위해서는 object형으로 반환하는 printer를 Powder로 강제 형 변환을 해줘야 한다.  → 이런 이유로 Generic 클래스를 사용하게 된다.

 

 


 

! GenericPrinter 클래스 생성

public class GenericPrinter<T> {

	private T material; // T 자료형으로 선언하는 변수
    
    public void setMaterial(T material) {
    	this.material = material;
    }
    
    public T getMaterial() { // 자료형을 반환하는 제네릭 메서드
    	return material;
    }
    
    public String toString() {
    	
        //해당 material 클래스의 참조 클래스를 가짐
        return material.toString();
    }
}

 

자료형 매개변수 T (type parameter) : 이 클래스를 사용하는 시점에서 실제 사용할 자료형을 지정.

static 변수는 사용할 수 없음

E : element, K : key, V : value 등 여러 알파벳을 의미에 따라 사용 가능

! GenericPrinterTest

public class GeneriPrinterTest {

	public static void main(String[] args) {
    
    	GenericPrinter<powder> powderPrinter = new GenericPrinter<>();
        
        Powder powder = new Powder();
        powderPrinter.setMaterial(powder);
        
        Powder p = powderPrinter.getMaterial();
        System.out.println(p.toString());
        
    }
}

위 Test 결과

  • Generic 자료형<T> 형태로 인스턴스 생성
  • T 자리는 우리가 받을 데이터 타입을 지정
  • Object와 같이 번거롭게 강제 형 변환을 할 필요가 없다.

 

다이아몬드 연산자 <>


위 예제에서 GenericPrinter<powder> powderPrinter = new GenericPrinter<>(); 

<> 를 다이아몬드 연산자라고 함

다이아몬드 연산자 내부에서 자료형은 생략 가능

자바 10부터 
제네릭에서 자료형 추록 var 사용 가능

ArrayList list = new ArrayList()  → var list = new ArrayList();

반응형