Generic 클래스

Agnes Park·2022년 3월 12일
0

JAVA

목록 보기
28/34

1. Generic 클래스

Generic 클래스

  • 클래스의 멤버변수나 혹은 메소드의 리턴'타입', 매개변수 등의 '타입'을 지정하지 않고 generic(일반적으로)하게 정의하는 클래스
  • '동작' 은 같으나, '데이터 타입' 만 다른 경우 Generic 으로 설계함으로 코드 생산성 향상
package com.lec.java.generic01;

public class Generic01Main {

	public static void main(String[] args) {
		System.out.println("Generics(제네릭스)");
		
		System.out.println();
		System.out.println("[1] generic 클래스 사용 전");		

		Orange orange1 = new Orange(10);
		OrangeBox orangeBox1 = new OrangeBox(orange1);
		orangeBox1.pullOut().displaySugar();
		
		Apple a1 = new Apple(100);
		AppleBox appleBox1 = new AppleBox(a1);
		appleBox1.pullOut().displayWeight();
		
		Banana b1 = new Banana(15);
		BananaBox bananaBox1 = new BananaBox(b1);
		bananaBox1.pullOut().displayNum();
		
		// 동작은 pullOut() 으로 같음에도 불구하고,
		// 다루는 데이터가 다르다는 이유로 클래스를 매 데이터마다 정의하는 것은 매우 비효율
		// 그래서 자바에서는 generic 클래스를 제공

		System.out.println();
		System.out.println("[2] generic 클래스 사용");
		
		FruitBox<Orange> orangeBox2 = new FruitBox<Orange>(orange1);	// <> 안의 내용 생략가능
		orangeBox2.pullOut().displaySugar();
		
		FruitBox<Banana> bananaBox2 = new FruitBox<>(b1);
		bananaBox2.pullOut().displayNum();
		
		FruitBox<Apple> appleBox2 = new FruitBox<>(a1);
		appleBox2.pullOut().displayWeight();
		
		
		System.out.println("\n프로그램 종료");
	} // end main()
} // end class

//---------------------------------------------
// '과일' 클래스들 정의
class Banana{
	int num;
	
	public Banana() {}
	public Banana(int num) {this.num = num;}
	
	public void displayNum() {
		System.out.println("바나나 송이개수: " + num);
	}
} // end class Banana

class Orange{
	int sugar;
	
	public Orange() {}
	public Orange(int sugar) {this.sugar = sugar;}
	
	public void displaySugar() {
		System.out.println("오렌지 당도: " + sugar);
	}
} // end class Orange

class Apple{
	int weight;
	
	public Apple() {}
	public Apple(int weight) {this.weight = weight;}
	
	public void displayWeight() {
		System.out.println("사과 무게: " + weight);
	}
} // end class Apple


//------------------------------------------
// 위 과일 들을 담을 box 클래스들 정의

class BananaBox {
	Banana banana;;
	
	public BananaBox() {}
	public BananaBox(Banana banana) {this.banana = banana;}
	
	public Banana pullOut() {return banana;}
	
}

class OrangeBox {
	Orange orange;
	
	public OrangeBox() {}
	public OrangeBox(Orange orange) {this.orange = orange;}
	
	public Orange pullOut() { return orange; }
}

class AppleBox {
	Apple apple;
	
	public AppleBox() {}
	public AppleBox(Apple apple) {this.apple = apple;}
	public Apple pullOut() { return apple; }
}

//Generic 클래스: 
//클래스의 멤버변수나 혹은 메소드의 리턴'타입', 매개변수 등의 '타입'을 
//지정하지 않고 generic(일반적으로)하게 정의하는 클래스
//< > 안에 타입매개변수 (type parameter) 지정
class FruitBox<T>{
	T fruit;	// T타입 필드
	
	public FruitBox() {}
	public FruitBox(T fruit) {this.fruit = fruit;}	// T타입 매개변수
	
	public T pullOut() {return fruit;}	// T타입 리턴
}

2. Generic 클래스 타입

제네릭 클래스의 타입

  • 제네릭 클래스에서 사용되는 타입은 기본 자료형(primitive type)은 사용될 수 없고, Object 타입의 자료형들만 올 수 있음.
    (예) int는 사용할 수 없고, Integer를 사용해야 함
    (예) double은 사용할 수 없고, Double을 사용해야 함
package com.lec.java.generic02;

public class Generic02Main {

	public static void main(String[] args) {
		System.out.println("Generic 클래스 2");

		Test<Integer, String> t1 =
			new Test<>(123, "Hello Java!");
			
		t1.display();
		
		System.out.println();
		
		Test<Integer, Double> t2 =
				new Test<>(111, 3.14);
		t2.display();
		
		System.out.println("\n프로그램 종료");
	} // end main

} // end class Collection02Main

class Test<T, U> {
	T item1;
	U item2;
	
	public Test(T item1, U item2) {
		this.item1 = item1;
		this.item2 = item2;
	}
	
	public void display() {
		System.out.println("item1: " + item1);
		System.out.println("item2: " + item2);
	}

} // end class Test

0개의 댓글