Java Generic 01. Introduction

from : https://docs.oracle.com/javase/tutorial/extra/generics/intro.html


Introduction : 
- JDK 1.5이상 부터 지원 
- Type을 추상화 할 수 있다. (Collection의 예를 보면 잘 알수 있음)

Generic을 사용하지 않은 경우 : 

List myIntList = new LinkedList();
myIntList.add(new Integer(0));
Integer x = (Integer) myIntList.iterator().next()
문제점 :
    1. Type Cast가 필수적이다. (Integer)로 변환
    2. 프로그래머가 어떤종류의 데이터가 리스트에 들어갔는지 알고 있어야한다.
    3. Type Safe하지 않다.
    4. 성가신 타입변환이 필요하며, 잘못된 타입의 경우 runtime error 를 받게된다.


Generic을 이용한 경우 :
List<Integer> myIntList = new LinkedList<Integer>();
myIntList.add(new Integer(0));
Integer x = myIntList.iterator().next();
- 달라진점 :
    1. 작성자의 의도를 표현할 수 있다. List<Integer> 정수형 리스트의 의미
    2. Type Safe : 제한된 Integer타입만 들어갈 수 있다.
    3. List는 generic 인터페이스이며, 타입 파라미터를 이용하여 특정 타입을 제한할 수 있다.
(Compile Time에 Type 체크를 수행한다. 코드의 적법성을 컴파일 타임 단일 지점에서 이를 확인할 수있게 된다. )
    4. 타입캐스트가 더이상 필요하지 않다. (3번째 라인에서 사라짐)
    5. 큰 프로그램에서 이러한 점들은 코드를 더 읽기 쉽게하고, 견고하게 해준다.

Defining Simple Generic : 
다음은 java.util패키지에서 List와 Iterator 인터페이스 부분이다.

Generic정의 :
public interface List<E> {
    void add(E x);
    Iterator<E> iterator();
}
public interface Iterator<E> {
    E next();
    boolean hasNext();
}
1. angle brackets ('<', '>')이 추가되었다. 이것은 List와 Iterator인터페이스의 파라미터를 정의한 것이다.
2. 타입 파라미터는 generic선언에 사용될 수 있다.
3. angle brackets 사이에는 일반적인 타입이 올 수 있다. 코드에서 'E' 부분에 실제 타입을 지정할 수 있다.

Integer을 사용했다면 다음과 같은 클래스가 만들어 짐을 상상할 수 있다.
public interface IntegerList {
    void add(Integer x);
    Iterator<Integer> iterator();
}
차이점 :
1. 코드는 직관적으로 보이긴 하지만 잘못된 방향으로 인도한다.
2. parameterized type 인 List<Integer>은 사실 위 코드처럼 생성되지는 않는다.
즉, java generic은 C++의 template와는 다르게 특정 코드를 만들거나 저장하지 않는다.
단지 일반 클래스나 인터페이스 선언과 같이 평범한 클래스 파일을 만들 뿐이다. 
3.일반 파라미터처럼 메소드나 생성자에 parameterized type이 사용된다. 이것은 메소드가 호출될때 실제 아규먼트가 formal parameter들을 대체하게 되며, 메소드 내용은 검증 되어진다.
4. formal parameter의 이름 규칙은 한글자로 표시한다. 아직 이 파라미터를 위한 의미있는 이름은 제공되지 않고 있다.




Share this

Related Posts

First