오라클에서 제공하는 'Generic Programming Guide' 문서 참고본입니다.
왜 제네릭을 써야 하는가!?
마치 견과류의 껍질처럼, 제네릭은 파라미터를 통해 클래스를 정의하거나, 인터페이스, 함수등을 정의할 때 type을 쓸 수 있습니다.
메소드를 선언할 때 정해진 파라미터만 받는 경우보다 파라미터의 타입을 무엇이든 받을 수 있도록 정의를 하게 되면 같은 코드를 통해 여러다른 타입의 입력을 받을 수 있기 때문에 재사용에 유리합니다.
non-generic code에 비해 generics를 사용하는 것은 많은 장점이 있습니다.
- 컴파일 시에 type check에 강점을 가진다.
자바 컴파일러는 코드가 안전성을 위반하는 경우 문제오류를 검사하는 과정을 가지고 있습니다. 컴파일 타임 오류를 수정하는 것은 런타임 오류를 수정하는 것보다 훨씬 쉽습니다. (제네릭을 쓰면 컴파일러에서 오류를 내준다는 의미)
- Casting의 제거
generics code가 아닌 경우
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);
generics code
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
- generic 알고리즘의 가능
제네릭을 쓰게 되면 프로그래머는 다른 타입을 가지고 있는 자료형에 제네릭알고리즘을 사용해 customized가 가능합니다. 이것은 역시 type safe하며, 가독성도 좋습니다.
제네릭 타입
제네릭타입은 다양한 타입을 받을 수 있는 제네릭 클래스 혹은 인터페이스를 의미합니다. 다음 box 예제는 제네릭의 컨셉을 보여줍니다.
A Simple Box Class
non-generic 타입의 box Class를 만들어 보도록 하겠습니다. 이것은 오로지 두가지 메소드만 가집니다. box에 object를 더하거나, 가져오거나 이 두가지 메소드만 정의합니다.
public class Box {
private Object object;
public void set(Object object) { this.object = object };
public Object get() {return object; }
이 메소드들은 당신이 원하는 타이밍에 호출을 통해 object를 return할 수 있습니다. 하지만 그 Object는 어떤 타입인지 알수가 없습니다. 컴파일 시 타입이 명시되어 있지 않기 때문에 확인할 방법이 없습니다. 한 곳에서 Integer를 넣어놓고 다른 클래스에서 String으로 쓰고자하면 런타임 에러가 발생하게 됩니다.
A Generic Version of the Box Class
제네릭 클래스는 다음과 같은 포맷으로 정의됩니다.
class name<T1, T2, T3....> { /*...*/ }
Type parameter는 angle brackets(<>)안에 자유롭게 정의할 수 있습니다. 이것은 type parameters(type variables라고 불리는)라고 부릅니다. (T1, T2, T3) box class를 generics방식으로 바꾸면, 당신의 public class Box 가 아닌 public class Box<T> 로 정의하면 됩니다. type variable T를 포함시키는 것입니다.
다음은 바꾼 Box Class입니다.
public class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
Object가 T로 대체되었음을 볼 수 있습니다. type variable을 통해 이클래스가 정의되는 초기단계에 Object의 타입이 정의되게 됩니다.(어떤 array type, class type, interface type 혹은 다른 변수들도 대입이 가능합니다.)
이와 같은 기법이 generic interface를 만들게 됩니다.
Type Parameter Naming Converntions
문법 상, type parameter의 이름은 한글자여야 하고, 대문자여야 합니다.
E - Element
K - Key
N - Number
T- Type
V - value
S, U, V etc - 2nd, 3nd, 4th types
Java SE API 를 통해 위와같이 정의되어있습니다.
위의 Box<T> 클래스를 생성할 때에는 Box<Integer> 와 같은 방식으로 생성을 하면 됩니다.
'옛글 > 번역본' 카테고리의 다른 글
프로그래밍 Design Pattern 이해하기 - 4 팩토리 패턴 (0) | 2014.08.14 |
---|---|
프로그래밍 Design Pattern 이해하기 - 1 스트래티지패턴 (0) | 2014.07.29 |
안드로이드 아키텍쳐 (Analysis of the Android Architecture) #2-2 안드로이드 구조 (3) | 2013.10.25 |
Object-Oriented Programming Concepts 객체지향의 컨셉 (0) | 2013.10.18 |
안드로이드 아키텍쳐 (Analysis of the Android Architecture) #2-1 안드로이드 구조 (0) | 2013.10.15 |