제네릭이란 ?
: 클래스 내부에서 사용할 변수들의 데이터 타입을 외부에서 지정하는 기법, 자바 1.5버전부터 도입된 개념이다
제네릭을 사용하는 이유?
: 비슷한 코드를 중복을 줄이면 코드수도 줄어들고 그만 큼 유지보수가 쉬워진다.
가령 Info라는 변수를 가진 person이라는 클레스가 있다고 생각해보자
class Person{
...
StudentInfo info = new StudentInfo();
or
EmployeeInfo info = new EmployeeInfo();
...
}
위와같은 형식으로 Person의 info가 학생(학번,학년,이름,담당교수 등의 정보를 가지고있음)에 대한것 일 수도 있고 직장인(직원ID, 부서, 사무실위치 등의 정보를 가지고있음)에 대한 것일 수도 있다.
때문에 다음과 같이 표현해 보았다.
Object info ;
public void setInfo(Object info){
info = this.info
}
위와같이 모든 클레스의 조상인 Object를 사용하므로서 StudentIfo와 EmployeeInfo 둘다 받을 수 있게 작성하였다. 하지만 info 자리에 사용자의 부주의에 따라 "부장" 이라는 String이 들어올수도 있고 123이라는 Integer형식이 들어올 수도 있다. 즉 원치않는 데이터타입이 들오게 되지만 이는 컴파일 타임에러에서 검출할 수 없다.
자바는 컴파일 언어이다. 실제로 코드가 프로그램이 되기 전에 사용자의 착오를 미리 검출해주는 기능을 제공한다. 모든 에러가 컴파일 타임수준에서 검출될 수 있도록 코드를 작성해야 자바가 제공해주는 혜택을 누릴 수 있다는 것이다.
쉽게말해 저 코드는 사용자가 원치 않는 데이터타입이 들어가도 오류없이 진행되기 때문에 버그를 찾아내기가 힘들다는 말이다.
실제로 1.4버전까지 다양한 콜렉션들이 데이터를 저장하기위해 Object 형을 썻고 의도치 않는 다른 데이터타입의 삽입/삭제로 인해 일어나는 런타임 에러로 고생한 경험이 많다고 한다.
하지만 제네릭을 사용한다면
class Person<T>{
T info;
public void setInfo(T info extends Info_Interface){
this.info = new Info;
}
}
그리고 StudentInfo와 EmployeeInfo가 Info_interface를 확장하고 있다면 제너럴 T가 받을 수 있는 데이터 타입은 개발자가 의도한 이 두가지 타입밖에 없을것이다. 만약 그 외의 데이터 타입을 넣으려고 시도한다면 컴파일러가 컴파일 에러를 검출 할 것이다.
다시말해 코드의 중복을 없에고 데이터 타입의 안정화를 위해 제네릭을 사용한다. 라고 이해하면 되겠다.
제네릭의 제한
<T extends Info>
// 다음과 같은 제네릭에서 제네릭에 올수있는 데이터 타입은 Info의 자식 클레스만 올 수 있다.
=> 제네릭 범위 안에서 extends키워드는 "부모가 누구다"라는 것을 명시해 주기때문에 Info가 인터페이스라도implements 대신 expends를 쓴다.
제네릭의 중복
한 클래스 안에 복수의 변수타입을 외부에서 지정하고 싶을 경우가 있을 것이다. <T,S,U>와 같은 형식으로 사용하면 된다. 제네릭은 따로 그 모양세의 규정은 없지만 암묵적으로 TSU..순으로 대문자 알파벳을 사용하는 것 같다.(찾아보시길..)
제네릭이 받을 수 없는 변수타입, 기본 데이터타입
제목 그대로 int, double, boolean 과 같은 기본 데이터타입은 제네릭의 인자로 들어갈 수 없다. 떄문에 레퍼클레스(wrapper class)를 사용해야한다. Integer, Double 과 같은 클래스를 이용해 인스턴스화 해서 사용하자
객체명.intValue(); 와 같은 함수를 이용하여 원시 데이터타입의 데이터를 얻을 수 있다.
제네릭의 생략
매개변수를 통해 변수의 타입을 알수 있는 경우 제네릭을 생략할 수 있다.
참고
http://civan.tistory.com/170
http://opentutorials.org/module/516/6237 (비중있게 참고)
'~ 2014 > JAVA & ANDROID' 카테고리의 다른 글
java :; LinkedList ArrayList Vector (0) | 2014.06.18 |
---|---|
인터페이스와 추상클래스의 사용 목적 (0) | 2014.06.14 |
JAVA :: 예약종료 (0) | 2013.09.03 |
ANDROID :: 액티비티 투명처리 (0) | 2013.07.19 |
ANDROID :: 환경설정창 만들기 preferenceScreen (0) | 2013.07.16 |