KDT/Java

240327 Java - 제네릭 2

001cloudid 2024. 3. 27. 17:50
728x90

제네릭 타입

  • 자료형을 매개변수로 가지는 클래스와 인터페이스
  • class 및 interface 뒤에 < > 를 적어주고 타입 매개변수를 지정

기본 자료형으로 지정할 수 없음.

  • Integer, Double과 같은 Wrapper 클래스로 객체 타입으로 변환하여 데이터 값으로 사용해야함

 

사용할 자료형을 제한하는 <T extends 클래스>

  • 제네릭 클래스에서 T 자료형에 사용할 자료형에 제한을 둘 수 있음
  • 제네릭 클래스의 T에 대입된 자료형을 사용할 클래스를 추상 클래스로 상속 받는다.

 

package test20;

//추상 클래스
abstract class Material{
	public abstract void doPrinting();
}

//일반 클래스
class Powder extends Material{

	@Override
	public void doPrinting() {
		System.out.println("Powder 재료로 출력");
	}

	@Override
	public String toString() {
		return "재료는 Powder";
	}
	
}

//일반 클래스
class Plastic extends Material{

	@Override
	public void doPrinting() {
		System.out.println("Plastic 재료로 출력");
	}

	@Override
	public String toString() {
		return "재료는 Plastic";
	}

}

//제네릭 클래스 : Material 클래스를 상속받은 클래스(자료형)들만 사용할 수 있게 제한
//<T extends Material> 제네릭 클래스에서 사용할 수 있는 클래스(자료형)에 제한을 둠
class GenericPrinter<T extends Material>{
	private T material;

	public T getMaterial() {
		return material;
	}

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

	@Override
	public String toString() {
		return material.toString();
	}
	
	public void printing() {
		material.doPrinting();
	}
	
}


public class GenericPrinterTest {

	public static void main(String[] args) {
		GenericPrinter<Powder> powder = new GenericPrinter();
		powder.setMaterial(new Powder());
		powder.printing();
		
		System.out.println();
		
		GenericPrinter<Plastic> plastic = new GenericPrinter();
		plastic.setMaterial(new Plastic());
		plastic.printing();
		
		System.out.println();
		
		GenericPrinter printer = new GenericPrinter<>();
		printer.setMaterial(new Powder());
		printer.printing();
		printer.setMaterial(new Plastic());//2번째 객체가 저장됨
		printer.printing();
		
		System.out.println();
		
		
	}

}

 

타입 매개 변수 <T>이용(extends (상위타입)) : <T extends 상위타입>

 

와일드 카드 <?> 이용(extends(상위타입), super(하위타입))

<? extends 상위타입 or 하위타입>

특정 메소드에 접근할 때 타입의 상위타입과 하위타입으로 제한

 

※도큐먼트를 보다보면 ? 가 있다

->와일드 카드 <?>

 

타입 매개변수 제한하기

  • <?> 전체 타입 가능
  • <? extends A> : A 자신 클래스와 하위 클래스까지만 가능
  • <? super B> : B 상위 클래스만 가능

 

<?> Object부터 하위 모든 클래스까지 모든 타입의 Course 가능

  • public static void printCourse(Coures<?> course){ }

<? extends Student> : Student 포함 하위 타입을 가진 Course만 가능

<? super Woker> : Worker 포함 상위 타입을 가진 Course만 가능

 

제네릭 메소드 활용

public <자료형 매개변수> 반환형 메소드 이름(자료형 매개변수,...){

}

 

package test20;

class Point<T,V>{
	private T x;
	private V y;
	
	//일반 생성자
	public Point(T x, V y){
		this.x = x;
		this.y = y;
	}

	public T getX() {
		return x;
	}

	public void setX(T x) {
		this.x = x;
	}

	public V getY() {
		return y;
	}

	public void setY(V y) {
		this.y = y;
	}
	
}

public class GenericMethod {
	
	public static void main(String[] args) {
		
		//사각형의 넓이
		Point<Integer, Integer> p1 = new Point(7, 23);
		int rec1 = p1.getX()*p1.getY();
		System.out.println(rec1);
		
		System.out.println();
		
		Point<Integer, Double> p2 = new Point(7, 23.2);
		double rec2 = p2.getX() * p2.getY(); //더 큰 쪽으로 타입이 따라가야함
		System.out.println(rec2);
		
		System.out.println();
		
		Point<Double, Double> p3 = new Point(7.7, 23.2);
		double rec3 = p3.getX() * p3.getY(); //더 큰 쪽으로 타입이 따라가야함
		System.out.println(rec3);
		
	}
	
}

 

package test20;

class Point<T,V>{
	private T x;
	private V y;
	
	//일반 생성자
	public Point(T x, V y){
		this.x = x;
		this.y = y;
	}

	public T getX() {
		return x;
	}

	public void setX(T x) {
		this.x = x;
	}

	public V getY() {
		return y;
	}

	public void setY(V y) {
		this.y = y;
	}
	
}

public class GenericMethod {
	
	//1. 제네릭 메소드 활용(타입 매개변수를 메소드 선언부에 지정)
	//제네릭 메소드 : 제네릭 클래스 일반화 해서 사용하는 형태가 아닌 메소드에 독립적으로 제네릭 유형을 선언하고
	//			 독립적으로 운용 가능한 방법
	//			 타입 매개변수는 매소드 내에서만 유효하게 사용할 수 있음
	//형식)
	//			  <타입 매개변수>			<타입매개변수 형태의 자료형>
	public static <T, V> double makeRectangle(Point<T,V> a) {
		
		double width = ((Number)a.getX()).doubleValue();
		double height =	((Number)a.getY()).doubleValue();
		
		return width * height;
	}
	
	
	public static void main(String[] args) {
		
		//사각형의 넓이
		Point<Integer, Integer> p1 = new Point(7, 23);
		int rec1 = p1.getX()*p1.getY();
		System.out.println(rec1);
		
		System.out.println();
		
		Point<Integer, Double> p2 = new Point(7, 23.2);
		double rec2 = p2.getX() * p2.getY(); //더 큰 쪽으로 타입이 따라가야함
		System.out.println(rec2);
		
		System.out.println();
		
		Point<Double, Double> p3 = new Point(7.7, 23.2);
		double rec3 = p3.getX() * p3.getY(); //더 큰 쪽으로 타입이 따라가야함
		System.out.println(rec3);
		
		System.out.println();
		
		Point<Double, Double> p4 = new Point(7.7, 7.7);
		double rec4 = GenericMethod.makeRectangle(p4);
		System.out.println(rec4);
		
		System.out.println();
		
		Point<Double, Integer>p5 = new Point(23.4,71);
		double rec5 = GenericMethod.makeRectangle(p5);
		System.out.println(rec5);
		
		System.out.println();
		
		Point<Double, Integer>p6 = new Point(10.1,23);
		double rec6 = makeRectangle(p6);
		System.out.println(rec6);
	}
	
}

 


컬렉션 프레임워크

  • 컬렉션은 데이터의 저장, 그와 관련 있는 알고리즘을 구조화 해 놓은 프레임워크
  • 자료 구조와 알고리즘을 클래스로 구현해 놓은 것
  • 컬렉션 클래스들을 가리키며 '컨테이너 클래스'라고 함
  • 컬렉션 프레임워크를 구성하는 클래스들은 많은 양의 인스턴스를 다양한 형태로 저장하는 기능을 제공
  • 컬렉션 프레임워크를 활용하면 다양하고 효율적인 인스턴스의 저장이 가능

자료 구조

  • 스택 : 후입선출 가장 나중에 들어온 자료가 가장 먼저 나가는 구조
  • 큐 : 가장 처음 들어온 자료가 가장 먼저 나가는 구조
  • 리스트 :넣은 순서대로 번호를 붙여서 저장하는 형태
  • 집합 : 리스트에서 중복 허용 X
  • 맵 : 키와 값으로 구성된 객체를 저장하는 구조. 쌍으로 움직이기 때문에 데이터나 객체를 담아두기 편함.
    값은 중복이 가능하지만 키는 중복 불가능. 기존 저장된 키와 동일한 키로 값을 저장하면 기존값은 없어지고 새로운 값이 저장
728x90

'KDT > Java' 카테고리의 다른 글

240401 Java - 컬렉션 프레임워크 2  (0) 2024.04.01
240328 Java - 컬렉션 프레임워크 1  (0) 2024.03.28
240325 Java - 제네릭 1  (0) 2024.03.25
240321 Java - 스레드 3  (0) 2024.03.21
240320 Java - 스레드 2  (0) 2024.03.20