Development

[JAVA] 클래스의 모든 것 #6 - 제네릭(Generics) 클래스 본문

Languages/JAVA

[JAVA] 클래스의 모든 것 #6 - 제네릭(Generics) 클래스

yo~og 2021. 11. 5. 20:10
반응형

Class를 알아봅시다! #6 😉


오늘은 클래스에서 제네릭(Generics) 클래스 사용법을 알아봅시다!

 

[ 자바 클래스 링크 ]

1. [JAVA] 클래스의 모든 것 #1 - 클래스의 개념과 용도
2. [JAVA] 클래스의 모든 것 #2 - 클래스의 static
3. [JAVA] 클래스의 모든 것 #3 - 클래스의 this

4.[JAVA] 클래스의 모든 것 #4 - 생성자 (Constructor)


Generic이란?

Generic을 직역하면 '일반적인' 이라는 뜻입니다.

그럼 GenericClass는 일반적인 클래스라고 볼 수 있겠죠?

즉, 데이터의 형식에 의존하지 않고 여러 데이터 타입들을 가질 수 있도록 만든 클래스입니다.


예제를 보면서 살펴봅시다. 사과, 바나나, 오렌지클래스를 과일박스 클래스에 넣고싶은데 어떻게 해야할지 알아보면서 제너릭 클래스를 이해해봅시다.

public class Apple {

}
public class Banana {

}
public class Orange {

}

사과, 바나나, 오렌지 클래스를 만들어줍니다.


사과, 바나나, 오렌지를 담거나 뺄 수 있는 FruitBox 클래스를 만들려고합니다.

먼저 사과를 담거나 뺄 수 있는 클래스를 만들어봅시다.

public class FruitBox {

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

사과를 push하고 pull 할 수 있는 메소드입니다. 필드에 사과를 만들어주었습니다.


FruitBox box = new FruitBox();
box.push(new Apple());

main에서 이렇게 과일상자를 제어 할 수 있습니다.


그런데 바나나와 오렌지를 담을려면 어떻게 해야할까요?

클래스안에서 Apple 대신에 바나나와 오렌지를 필드로 만들어서 클래스를 3개를 만들 수 있지만 그렇게 구현하면 비효율적이게 됩니다.

 

그래서 제너릭클래스를 사용합니다. 이제 제너릭클래스 형태로 바꿔봅시다!

package test.mypac;

public class FruitBox<T> {

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

이렇게 FruitBox에 <T>를 만들어주고 T에 따라 여러가지의 과일들을 제어할 수 있게 만들어줍니다.

<>안에 자신이 원하는 과일, 즉 타입이 들어가면서 그 타입을 제어하도록 구현되있습니다.


main클래스를 구현해봅시다.

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 item2 = box2.pull();

 

클래스 타입이 FruitBox<T> 이므로 T에 원하는 과일을 넣어 원하는 클래스 타입을 만들어줍니다.

예제는 FruitBox에  Apple, Orange 을 담았습니다.

사과를 넘겨준 box1을 보면 pull과 push에 사과를 인자로 주고 받는 모습을 볼 수 있습니다.

이렇게 제너릭 타입을 무엇으로 지정했냐에 따라 보내는 타입과 받는 타입이 바뀝니다.


 

제너릭 클래스 객체를 생성할 때는 <> 안의 타입은 생략이 가능합니다. 변수로 선언할때만 type을 적어주시면됩니다.

 


이렇게 제너릭 클래스를 사용하면 비슷한 기능을 지원하는 경우에는 코드의 재사용성을 높혀 효율적이게 코딩할 수 있습니다.

반응형
Comments