Java - 제네릭(Generic)

컴퓨터/Java

728x90
반응형

제네릭이란 무엇인가?

Java언어에서 컬렉션 프레임 워크 또는 직접 자료구조를 만들어서 사용하다 보면 거의 필수적으로 이 제네릭이라는 기법을 사용합니다. 그렇기 때문에 제네릭에 대하여 알아보도록 하겠습니다.

 

만약 어떤 프로그래머가 배열 형태의 자료구조를 만든다고 가정해봅시다. int, float 각각을 넣을 수 있는 배열 형태의 자료구조를 구현하려면 2개의 클래스가 만들어져야 할 것입니다. 

  • int형태를 넣을 수 있는 자료구조 구현 클래스
  • float형태를 넣을 수 있는 자료구조 구현 클래스

이것은 만드는 사람이나, 사용자나 상당히 불편한 일입니다.

이런 불편한 일들을 제네릭(일반화)하여 컴파일 시에 지정한 타입으로 대체되어 하나의 클래스로 구현할 수 있게 만들어 주는 것이 바로 제네릭입니다.

 

제네릭의 표현과 선언/사용

제네릭의 타입을 정위 하기 위한 영역은 < >로 사용하며 이후 { } 안에서 사용할 수 있습니다. 

//  제네릭 인자 T는 <>로 MyArray클래스에 일반화 되며
// T를 내부에서 사용할 수 있다.
class MyArray<T> {
	T myData;
}

 

제네릭을 이용한 클래스 선언 예제

조금 더 알기 쉽게 예를 들자면 다음과 같습니다.

public class MyIntData{
	private int data;
    
    public void setData(int value){
    	data = value;
    }
    public int getData(){
    	return data;
    }
}
public class MyFloatData{
	private float data;
    
    public void setData(float value){
    	data = value;
    }
    public float getData(){
    	return data;
    }
}

이처럼 각각의 int와 float를 담을 클래스를 각각 만들어주어야만 합니다. 

하지만 제네릭의 개념을 사용하면 아래와 같이 정의할 수 있습니다.

class MyData<T>{
	private T data;
    
    public void setData(T value){
    	data = value;
    }
    public T getData(){
    	return data;
    }    
}

 

제네릭을 이용한 사용 예제

그렇다면 실제로 사용해 보면 차이점을 확연하게 느낄 수 있습니다.

public class Test {

	public static void main(String[] args) {
		
		MyData<Integer> myIntData = new MyData<Integer>();
		MyData<Double> myFloatData = new MyData<Double>();
		
		myIntData.setData(10);
		System.out.println(myIntData.getData());
		
		myFloatData.setData(3.14);
		System.out.println(myFloatData.getData());
	}

}

* Integer와 Double는 정수와 소수를 담을 수 있는 클래스입니다.

 

제네릭을 사용 시 주의사항 (사용 이유)

제네릭으로 정의된 클래스를 인스턴스화시 제네릭을 명시하지 않아도 오류는 없습니다. 

		MyData myData = new MyData();
		myData.setData(10);
		System.out.println(myData.getData());

다만, 아래와 같이 데이터 타입에 대한 상황이 모호한 경우 에러가 발생할 수 있으니 제네릭으로 선언된 것은 제네릭 표현으로 명시를 해주거나 아래 사항에 대하여 주의가 필요합니다.

int value = myData.getData(); // error
int value = (int)myData.getData(); // 정상 작동
myData.setData("hi"); // 정상 작동
int value = myData.getData(); //error
int value = (int)myData.getData(); //error

 

제네릭을 이해해야 되는 이유

사실 여러분들이 모든 것을 만들어서 쓴다면 제네릭을 몰라도 될 수도 있습니다. 하지만 자바 컬렉션 프레임 워크를 사용하려면 누군가 만들어 놓은 클래스를 사용하게 될 것입니다. 자바 컬렉션 프레임 워크는 제네릭을 통해 정의되어 있습니다. 따라서 우리가 의도에 따라 정확하고 안전하게 사용하기 위해서는 제네릭에 대한 기본적인 이해는 필수입니다.

728x90
반응형

'컴퓨터 > Java' 카테고리의 다른 글

Java - ArrayList  (0) 2021.10.12
Java - import  (0) 2021.10.08
Java - 컬렉션프레임워크(CKP)  (0) 2021.10.05
Java - for each문  (0) 2021.09.09
Java - 클래스 형변환과 장점  (0) 2021.09.03

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :