제네릭, 나는 템플릿이란 용어가 더 익숙하다. 

일반화란 의미로, 지정해 두면 사용하고자 하는 데이터타입으로 변환시킬 수 있다. 

그렇다면 왜 제네릭이 등장한 것일까? 

제네릭은 일종에 불편함을 해소하기 위함이다. 가령 이런 생각을 해보자. 

특정 인스턴스를 받는 클래스내 메소드가 있다고 하자. 클래스내 메소드는 인스턴스를 담지만 인스턴스화된 메소드에 접근하기 위해서는 각각 다른 인스턴스를 선언하고 알맞게 형변환 해주어야 한다. 

그런데, 이때 만일에 문자열을 담는다 하더라도 큰 문제가 발생하지 않는다. 역으로 이를 출력하고자 할때 형변환이 이루어지는데 여기서 ERROR가 발생하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class boy{
    ... 
    "남자아이"
}
class girl{
    ...
    "여자아이"
}
class People{
    Object obb;
    void set(Object o)
        obb = o;
    void get()
        return obb;
}
cs


이럴 경우 People p1 = new People(), People p2 = new People() 를 만들고,
p1.set(new boy()) 말고 p1.set("boy") 해도 문제가 없다 한다. 하지만,
(boy)p1.get 시에는 치명적인 오류가 발생한다고 한다.
 
여기서 제네릭은 자료형에 독립적이다. 가 중요하다.
 
T data 이런걸 본적이 있는가? 혹은 void set(T int)
이런식으로 T에 어느 자료형이든 개발자가 지정한 자료형으로 선언하여 재사용할 수 있다는 점이 크다.
 
1
2
3
4
class boy<T>{
    ... 
    "남자아이"
}
cs

이런식으로 말이다. 그럼 위 클래스를 통해서 인스턴스를 생성해 보자.
People<boy> p1 = new People<boy>(); 이런식으로 가능하다.
이때 T는 Type parameter 라고 부른다 카더라. 그리고 예시로 들어온 boy는 Type Argument라 카더라.
그리고 마지막으로 People<boy> 를 Parameterized Type 라고 한다 카더라.
결과적으로 제네릭을 사용함으로써 형변환 의 귀찮음이 없어지고 컴파일 시 에러가 덜 발생할 수 있다는 장점과
코드 측면에서 재사용 할 수 있다는 점에서 제네릭은 정말 훌륭하고,
중요한 문법인듯 하다.
 
1
2
People<girl> p2 = new People<girl>();
 
cs

 

익숙하지 않아서 한번 더 써봤다.

 

* 제네릭의 기본 문법

 

자바에서 제네릭은 기본 자료형이 제한된다. 하지만, Wapper가 존재한다 카더라!

 

Wapper란 감싸고 있는거,

 

boxing 과 unboxing이 존재하는데 일종에 값을 넣었다면 빼는 과정을 생각하면 된다.

 

1
2
Box<Integer> iBox = new Box<Integer> //O
Box<Int> iBox = new Box<Int> //X
cs

 

다이아몬드라는 표시방법이 있는데 크게 중요하지 않는것 같아 간단히 말하면,

앞에 이미 Integer를 선언했다면 뒤에는 <> 만 써줘도 된다는 것이다.

교재에 문제가 하나 있어 간단하게 소개해 볼까 한다.

하나의 클래스에 제네릭으로 선언된 파라미터가 두개 들어간다. 이때 이 출력 양식은 다음과 같다.

 

1
public String toString() { return left + " & " + right; } 이다.
cs

이때 또다른 클래스가 존재하는데 이 클래스 마찬가지로 위 조건과 같다. 이때
 
Apple & 25
 
Orange & 33
 
을 출력하는 프로그램으로 수정하는 문제였다.
 
이 구문에서 DBox를 통째로 넣어주기 때문에 처음에 dddbox.toString을 하게 되면
 
Apple&25&Orange&33 으로 출력된다. 따라서,
 
각각의 파라미터에 대해서 toString으로 출력해주면 되는데,
 
이전에는 클래스 내부 메소드를 변경하고 난리쳤는데 생각해보니 무척 간단했다.