제주 탈출 일지

패스트캠퍼스 챌린지 25일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 25일차

귀건 2021. 9. 30. 23:09
728x90
반응형

252525225 레스고

 

08. < T extends 클래스 > 사용하기

상위 클래스의 필요성

T 자료형의 범위를 제한 할 수 있음

아무 클래스나 쓰면 안될 때...

 

<T extends 클래스>에서 클래스 부분은 일반적으로 직접 사용하지는 않기 때문에 abstract 클래스로 생성한다. 이 클래스를 상속받지 않은 클래스들은 T 자료형 범위 바깥에 있으므로 해당 제네릭 클래스를 사용할 수 없다,. 사용하고 싶으면 상위 클래스를 상속 받아야 한다.

 

GenericPrinter 클래스

package ch08;

public class GenericPrinter<T extends Material> {
	
	private T material ;

	public T getMaterial() {
		return material;
	}

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

}

T 는 Material 클래스를 상속한다. Material 클래스를 상속받지 않으면 제네릭 타입에 들어갈 수 없다.

 

Material 클래스

package ch08;

public abstract class Material {

	public abstract void doPrinting();
	
}

doPrinting 추상 메소드만을 포함한 추상 클래스. 

 

Plastic 클래스

package ch08;

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

	@Override
	public void doPrinting() {
		// TODO Auto-generated method stub
		
	}
}

doPrinting이 구현됨.. Powder도 동일하다.

 

Powder 클래스

package ch08;

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

	@Override
	public void doPrinting() {
		// TODO Auto-generated method stub
		
	}

}

 

GenericPrinterTest 클래스

public class GenericPrinterTest {

	public static void main(String[] args) {

		GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
		powderPrinter.setMaterial(new Powder());
		Powder powder = powderPrinter.getMaterial(); // 형변환 하지 않음
		System.out.println(powderPrinter);
		
		GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
		plasticPrinter.setMaterial(new Plastic());
		Plastic plastic = plasticPrinter.getMaterial(); // 형변환 하지 않음
		System.out.println(plasticPrinter);
		
	/*	GenericPrinter powderPrinter2 = new GenericPrinter();
		powderPrinter2.setMaterial(new Powder());
		Powder powder = (Powder)powderPrinter.getMaterial();
		System.out.println(powderPrinter);
		*/
		//GenericPrinter<Water> printer = new GenericPrinter<Water>();	
	}
}

제네릭 타입에 포함된 Powder와 Plastic은 GenericPrinter를 사용할 수 있지만 water와 같은 다른 클래스들은 제네릭프린터를 사용할 수 없다.(상속받지 않았기 때문)

 

<T extends 클래스> 를 쓰면서 써야하는 자료형에 대한 한정을 지어주고, 공통으로 써야하는 여러 메소드를 상위클래스에서 지정할 수도 있다.

 

09. 제네릭 메서드 활용하기

자료형 매개변수를 메서드의 매개변수나 반환 값으로 가지는 메서드

자료형 매개 변수가 하나 이상인 경우도 있음.

제네릭 클래스가 아니어도 내부에 제네릭 메서드는 구현하여 사용 할 수 있음.

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

 

Point 클래스

package ch09;

public class Point <T,V> {
	
	T x;
	V y;
	
	Point(T x, V y) {
		this.x = x;
		this.y = y;
	}
	
	public T getX() {
		return x;

	}
	
	public V getY() {
		return y;
	}

}

GenericMethod 클래스

package ch09;

public class GenericMethod {
	
	public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {
		double left = ((Number)p1.getX()).doubleValue();
		double right = ((Number)p2.getX()).doubleValue();
		double top = ((Number)p1.getY()).doubleValue();
		double bottom = ((Number)p2.getY()).doubleValue();
		
		double width = right - left;
		double height = bottom - top;
		
		return width * height;
	}
	
	public static void main(String[] args) {
		
		Point<Integer, Double> p1 = new Point<Integer, Double> (0, 0.0);
		Point<Integer, Double> p2 = new Point<> (10, 10.0);
		
		double rect = GenericMethod.<Integer, Double> makeRectangle(p1, p2);
		System.out.println("두 점으로 만들어진 사각형의 넓이는 " + rect + "입니다.");
		
		
	}
	
	

}

GenricMethod 클래스는 제네릭 타입이 아니지만, 제네릭 메소드를 사용할 수 있따. GenericMethod.makeRectangle<T, V>는 Point<T, V> 인 제네릭 클래스를 받기 위해서 <T,V> 를 받는 제네릭 메소드로 만들어져 있다.

 

+ Number 클래스를 처음 본 것 같은데, java.lang.Number 

Number is an abstract superclass for numeric scalar types. Integer, Long, Float and Double are subclasses of Number that bind to a particular representation.

라고 한다. 숫자로 된 모든 서브 클래스들을 대표하는 추상 클래스라는 설명이다.

 

제네릭 클래스 자체가 쉽진 않다.. 

오늘은 여기까지만....

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90
반응형
Comments