Burninghering's Blog
Published 2022. 2. 21. 16:57
5-7.제네릭(Generic) 프로그래밍 JAVA

무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍

제네릭 자료형 정의

변수를 사용할 때 먼저 자료형을 선언해야 한다.

여러 자료형이 쓰일 수 있는 변수라면?

다양한 자료형의 클래스를 만들면 너무 오버헤드다!

 

클래스에서 사용하는 변수의 자료형이 여러개 일수 있으며,

그 안의 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고

추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언

특징

  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
  • 컬렉션 프레임워크에서 많이 사용되고 있음
  • 제네릭 타입을 사용하지 않는 경우의 예
  • 자료형을 지정하지 않으면, Object 타입으로 인식한다.
더보기

Powder

package ch06;

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

Plastic

package ch06;

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

ThreeDPrinter1

package ch06;

public class ThreeDPrinter1 {
	private Powder material;

	public Powder getMaterial() {
		return material;
	}

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

ThreeDPrinter2

package ch06;

public class ThreeDPrinter2 {
	private Plastic material;

	public Plastic getMaterial() {
		return material;
	}

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

ThreeDPrinter3

package ch06;

public class ThreeDPrinter3 { //예전에는 기능은 다 똑같은데 자료형만 다를 경우 
	private Object material; //Object(최상위 클래스)로 선언헤서 모든 자료형을 Object로 변환했다.

	public Object getMaterial() { //이 프린터는 재료가 무엇이던지 가능!
		return material;
	}

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

ThreeDPrinterTest

package ch06;

public class ThreeDPrinterTest {

	public static void main(String[] args) {
		
		Powder powder = new Powder();
		ThreeDPrinter3 printer = new ThreeDPrinter3();
		 
		printer.setMaterial(powder); //Object로 타입을 정해줬을 때 이 때는 오류가 안나지만,
	
		Powder p = (Powder)printer.getMaterial(); //이때는 형 변환을 해줘야 오류가 안난다.
	}
}

GenericPrinter

package ch06;

public class GenericPrinter<T> { // <> 안에다가, 내가 나중에 이 클래스를 쓸 때 자료형을 아무거나 넣어주면 된다!
	private T material;
	
	public T getMaterial() {
		return material;
	}
	
	public void setMaterial(T material) {
		this.material=material;
	}
	
	public String toString() {
		return material.toString();
	}
}

GenericPrinterTest

package ch06;

public class GenericPrinterTest {

	public static void main(String[] args) {
		
		Powder powder = new Powder();
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // <> -> 다이아몬드 연산자!
		powderPrinter.setMaterial(powder);
		
		Powder p = powderPrinter.getMaterial();
		System.out.println(powderPrinter.toString());
	}
}

 

toString 헷갈려서 찾아봄

 

 

  • 자료형 매개변수 T(type parameter) : 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정, static 변수는 사용할 수 없음
  • GenericPrinter : 제네릭 자료형
  • E : element, K: key, V : value 등 여러 알파벳을 의미에 따라 사용 가능

다이아몬드 연산자 <>

  • ArrayList list = new ArrayList<>(); //다이아몬드 연산자 내부에서 자료형은 생략가능 함
  • 제네릭에서 지역변수 자료형 추론 : 타입을 지정하지 않고 지역변수 사용 가능 (자바 10부터)
  • ArrayList list = new ArrayList() => var list = new ArrayList(); //여기서 var 로 표시한 것이 자료형 추론

 

결론

Powder, Plastic같이 여러 재료 클래스 타입을 만들고 그걸 사용할 여러 프린터 클래스를 만들어야 하니까,

결론적으론 여러 재료를 한꺼번에 사용할 수 있는 하나의 프린터 클래스(제네릭)을 만든 것이다. 

 

'JAVA' 카테고리의 다른 글

5-9.제네릭 메서드  (0) 2022.02.21
5-8.T extends 클래스  (0) 2022.02.21
5-3.연결 리스트 (LinkedList)  (0) 2022.02.16
5-2.배열(Array)  (0) 2022.02.06
5-1.자료구조  (0) 2022.02.04
profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.