제네릭이란 기능은 JDK1.5에서 등장을 하였습니다.

제네릭은 클래스를 정의할 때에 데이터 타입을 확정하지 않고 인스턴스를 생성할 때에 데이터 타입을 지정해주는 기능입니다.


제네릭이 사용되는 이유는?

타입의 안전성을 제공해준다!


타입이 안전하다는 것은, 우리가 의도하지 않은 타입의 객체를 저장하는 것을 방지하고 저장된 객체를 사용 할 때에 본래의 타입과 다른 타입으로 형변환 되어 생기는 오류를 줄여줌을 의미합니다.


예를 들어 우리가 오렌지, 사과, 포도, 바나나가 있는데 각 과일에 맞는 박스에 담고 싶습니다.

그러면 우리는 오렌지박스, 사과박스, 포도박스, 바나나박스를 준비해야겠죠?  그래야 각 과일이 더 안전하게 보관 될겁니다.

만약 그냥 한 박스에 다 넣어버리면 안전하지는 않을겁니다. 막 섞이고 과일이 상할지도 모르겠네요.


다시 이것을 자바를 이용해서 생각해보면 각 과일박스를 클래스로 만들고 그 안에다 해당되는 과일을 넣으면 되겠네요.

그러면 아마 코드가 많이 늘어나겠죠?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class AppleBox{
    Apple item;
    public void store(Apple item){
        this.item = item;
    }
}
class OrangeBox{
    Orange item;
    public void store(Orange item){
        this.item = item;
    }
}
class GrapeBox{
    Grape item;
    public void store(Grape item){
        this.item = item;
    }
}
class BananaBox{
    Banana item;
    public void store(Banana item){
        this.item = item;
    }
}
cs


그런데 이건 너무 코드가 길어요. 보기힘들어요.

이렇게 생각하는 사람들은 모든 클래스들의 공통조상인 Object를 이용해서~

1
2
3
4
5
6
class FruitBox{
    Object item;
    public void store(Object item){
        this.item = item;
    }
}
cs


위와 같이 작성할 수 있습니다.

코드가 간결해 졌지만, 타입의 안전성이 낮아졌습니다.


그래서 코드의 간결함과, 코드의 안전성이라는 장점을 합쳐놓은 기능이 바로 제네릭(Generic)입니다.


어떻게 생겼고 사용되는지 확인해보겠습니다.

GenericsDemo.java

1
2
3
4
5
6
7
8
9
10
11
12
class Person<T>{
    public T info;
}
 
 
public class GenericsDemo {
    public static void main(String[] args){
        Person<String> p1 = new Person<String>();
        
        Person<int> p2 = new Person<int>();    //에러    
    }    
}
cs


10번라인은 잠시 없다고 생각합시다.


이미지 출처 : 생활코딩(https://opentutorials.org/course/1223/6237)


생활코딩의 이미지와 예제를 보고 공부했고 도움이 많이 되어서 예제와 이미지를 통해 정리해보겠습니다.

제네릭은 위의 그림과 같은 모습으로 사용이 됩니다.

'< >' 제네릭은 꺽쇠를 사용해서 표현을 합니다. 꺽쇠 사이에 T라는 문자는 info라는 필드의 데이터 타입입니다.

Person 클래스를 정의할 때에는 데이터타입을 지정하지 않고, Person 클래스를 실제로 사용할 떄에(인스턴스화 할 때) 그림과 같이 데이터타입을 적어주면

Person 클래스의 필드인 info는 String타입이 되는 것 입니다.


위에서 작성된 GenericsDemo.java에서 10번라인이 오류인 이유는

제네릭은 참조 데이터타입에 대해서만 사용 할 수 있기 때문 입니다.

그래서~ 기본 데이터타입을 사용하기 위해서는 wrapper클래스를 이용해야 합니다.





이런식으로 15번라인을 수정해 주었습니다.