티스토리 뷰

728x90
반응형

Generic이란, 메소드에서 사용할 데이터 타입을 나중에 확정하는 기법이다. 

메소드나 클래스를 선언할 때가 아니라, 인스턴스를 생성하거나 메소드를 호출할 떄, 즉 "사용할 때" 정한다는 의미이다.

Generic을 사용하면 type을 지정하기 때문에, casting 등을 통한 타입 변환이 필요 없어 프로그램 성능이 향상되는 효과를 얻을 수 있다.

 

예제를 통해 쉽게 알아보자.


Apple.java

package test.mypac;

public class Apple {

}

 

Orange.java

package test.mypac;

public class Orange {

}

 

Banana.java

package test.mypac;

public class Banana {

}

 


사과를 담을 FruitBox 클래스를 만들어보자.

FruitBox.java 

package test.mypac;

public class FruitBox {
	//필드
	private Apple item;
	
	//과일을 담는 메소드
	public void push(Apple item) {
		this.item = item;
	}
	
	//과일을 빼내는 메소드
	public Apple pull() {
		return item;
	}
}

 

바나나와 오렌지를 담고 싶다면 다음 두가지 방법을 생각해 볼 수 있다.

1. 바나나를 담을 박스와 오렌지를 담을 박스, 총 두개의 클래스를 더 만들기

2. FruitBox에서 전달받는 매개변수 타입을 Object 타입으로 변경하기

 

1번의 경우, 과일의 갯수가 많으면 매우 번거로울 것이고, 2번의 경우 역시, Object 타입을 전달받는 다면 모든 타입이 들어갈 수 있겠지만 후에 casting을 해야하는 등의 불편함이 있을 것이다.

 


2번의 경우를 코드로 살펴보자.

 

FruitBox2.java

package test.mypac;

public class FruitBox2 {
	private Object item;
	
	//과일을 담는 메소드
	public void push(Object item) {
		this.item = item;
	}
	
	//과일을 빼내는 메소드
	public Object pull() {
		return item;
	}

}

 

main() 

FruitBox2 box = new FruitBox2();
box.push(new Apple());
Apple item = (Apple)box.pull();

push에는 Object 타입으로 되어 있어 모든 타입, 즉 Apple타입이 들어가는 모습을 확인할 수 있지만, pull() 메소드가 리턴한 값을 Apple에 넣고 싶다면 위와 같이 casting 해야 하는 모습을 확인할 수 있다. 

 


하지만, Generic을 사용하면, 객체를 생성하고 지역변수에 담을 때, 지역변수의 < > 안에 type을 지정함으로써 원하는 타입의 객체를 받을 수 있고, casting이 불필요하다. 

 

사과를 담을 박스를 만들고 싶다면 다음과 같이 코드를 작성할 수 있다.

FruitBox<Apple> box1 = new FruitBox<Apple>();
box1.push(new Apple());
Apple item1 = box1.pull();

 

 

마찬가지로 오렌지, 혹은 바나나를 담고 싶다면 아래와 같이 작성할 수 있다. 


전체 코드

MainClass01.java

package test.main;

import test.mypac.Apple;
import test.mypac.FruitBox;
import test.mypac.FruitBox2;
import test.mypac.Orange;

public class MainClass01 {
	public static void main(String[] args) {
		
		FruitBox2 box = new FruitBox2();
		box.push(new Apple());
		Apple item = (Apple)box.pull();
		
		FruitBox<Apple> box1 = new FruitBox<Apple>();
		box1.push(new Apple());
		
		//Orange 객체를 담을 FruitBox 객체를 생성해서 참조값을 box2라는 지역변수에 담아보세요.
		FruitBox<Orange> box2 = new FruitBox<Orange>();
		
		//box2에 Orange객체를 담아보세요.
		box2.push(new Orange());
		
		//Generic 클래스로 지정한 type 객체가 리턴된다.
		Apple item1 = box1.pull();
		Orange itme2 = box2.pull();
	}

}

"객체 생성 시에는 Generic 클래스를 생략할 수 있다."

MainClass02.java

package test.main;

import java.util.List;

import test.mypac.Apple;
import test.mypac.Banana;
import test.mypac.FruitBox;
import test.mypac.Orange;

//ctrl + shift + o => 일괄 import 단축키


public class MainClass02 {
	public static void main(String[] args) {
		//객체를 생성할 때 Generic 클래스는 생략이 가능하다. (new 뒤에 <>)
		FruitBox<Apple> box1 = new FruitBox<>();
		FruitBox<Orange> box2 = new FruitBox<>();
		FruitBox<Banana> box3 = new FruitBox<>();
		
		List<Apple> list = null;
		
	}
}

객체를 생성할 때는 Generic 클래스를 생략할 수 있는 모습을 확인할 수 있다.


★추가

Ctrl + Shilt + o는 일괄 import 단축키이다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함