본문 바로가기
수업시간 JAVA/이론

제네릭

by SEOKIHOUSE 2023. 4. 18.

※다양한 종류의 데이터를 처리할 수 있는 클래스와 메소드를 작성하는 기법

※어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것 

//T : Type Parameter(타입 파라미터 = 자료형 매개변수)

public class GenericPrinter<T> { //T : Type Parameter(타입 파라미터 = 자료형 매개변수)
	
}

 

제네릭을 쓰면 형변환을 안해줘도 된다!!  더 깔끔하다 + 실수안할 가능성 높아진다


※예시를 만들어보자

빨간볼, 노랑볼, 블루볼을 T에 넣을때 각자 나오도록

package practice0418;

class RedBall {
	private String color = "빨강";

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class YellowBall {
	private String color = "노랑";

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class BlueBall {
	private String color = "파랑ㄴ";

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class BallBox<T> {
	private T color;

	public T getColor() {
		return color;
	}

	public void setColor(T colorsss) {
		this.color = colorsss;
	}

}

public class BallShoot {

	public static void main(String[] args) {
		BallBox<RedBall> ball = new BallBox<>();
		ball.setColor(new RedBall());
		RedBall b = ball.getColor();
		System.out.println(b);

		BallBox<BlueBall> ball1 = new BallBox<>();
		ball1.setColor(new BlueBall());
		BlueBall b1 = ball1.getColor();
		System.out.println(b1);

		BallBox<YellowBall> ball2 = new BallBox<>();
		ball2.setColor(new YellowBall());
		YellowBall b2 = ball2.getColor();
		System.out.println(b2);

	}

}


※응용을 해보자   extends를 쓴다면 그 클래스 or 그 자식만 올수있도록 제한가능하다

 

package practice0418;

class YellowBall {
	private String color = "노랑";

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class BlueBall {
	private String color = "파랑ㄴ";

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class Ball {
	String color;

	public Ball(String color) {
		this.color = color;
	}
}

class RedBall extends Ball {
	// private String color = "빨강";
	public RedBall() {
		super("빨강");
	}

	public String toString() {
		return "공색깔은 " + color + "입니다";
	}
}

class BallBox<T extends Ball> {
	private T color;

	public T getColor() {
		return color;
	}

	public void setColor(T colorsss) {
		this.color = colorsss;
	}

}

public class BallShoot {

	public static void main(String[] args) {
		BallBox<RedBall> ball = new BallBox<>();
		ball.setColor(new RedBall());
		RedBall b = ball.getColor();
		System.out.println(b);
		
		//오류이유? -> extends로 ball클래스나 그 자식만 올수있다고 제한
		BallBox<BlueBall> ball1 = new BallBox<>(); 
		ball1.setColor(new BlueBall());
		BlueBall b1 = ball1.getColor();
		System.out.println(b1);
		//오류이유? -> extends로 ball클래스나 그 자식만 올수있다고 제한
		BallBox<YellowBall> ball2 = new BallBox<>();
		ball2.setColor(new YellowBall());
		YellowBall b2 = ball2.getColor();
		System.out.println(b2);

	}

}