컴퓨터/Java
Java언어에서 컬렉션 프레임 워크 또는 직접 자료구조를 만들어서 사용하다 보면 거의 필수적으로 이 제네릭이라는 기법을 사용합니다. 그렇기 때문에 제네릭에 대하여 알아보도록 하겠습니다.
만약 어떤 프로그래머가 배열 형태의 자료구조를 만든다고 가정해봅시다. int, float 각각을 넣을 수 있는 배열 형태의 자료구조를 구현하려면 2개의 클래스가 만들어져야 할 것입니다.
이것은 만드는 사람이나, 사용자나 상당히 불편한 일입니다.
이런 불편한 일들을 제네릭(일반화)하여 컴파일 시에 지정한 타입으로 대체되어 하나의 클래스로 구현할 수 있게 만들어 주는 것이 바로 제네릭입니다.
제네릭의 타입을 정위 하기 위한 영역은 < >로 사용하며 이후 { } 안에서 사용할 수 있습니다.
// 제네릭 인자 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
사실 여러분들이 모든 것을 만들어서 쓴다면 제네릭을 몰라도 될 수도 있습니다. 하지만 자바 컬렉션 프레임 워크를 사용하려면 누군가 만들어 놓은 클래스를 사용하게 될 것입니다. 자바 컬렉션 프레임 워크는 제네릭을 통해 정의되어 있습니다. 따라서 우리가 의도에 따라 정확하고 안전하게 사용하기 위해서는 제네릭에 대한 기본적인 이해는 필수입니다.
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 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet