Java generic에는 T(type), E(element) 가 있는데 이 둘의 차이점을 모르겠다.
일단 이 둘의 차이점이 뭔가 확인하기 위해 다음과 같이 테스트 코드를 작성하였다.
Element 클래스는 E 를 받을 수 있게 처리하였고, Type 클래스는 T 를 받을 수 있게 코드를 작성
@Data
public class Element<E> {
private E id;
private String pw;
}
@Data
public class Type<T> {
private T id;
private String pw;
}
도메인 클래스 생성 후 다음과 같이 Junit 테스트 코드를 작성
위에서 생성한 Type, Element 클래스에 String 타입을 전달하였다.
package generic;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
public class GenericTest {
private final String ID = "lng";
private final String PW = "1234";
@Test
public void 타입테스트() {
Type<String> type = new Type<String>();
type.setId(ID);
type.setPw(PW);
assertThat(type.getId(), is(ID));
assertThat(type.getPw(), is(PW));
}
@Test
public void 엘리먼트테스트() {
Element<String> element = new Element<String>();
element.setId(ID);
element.setPw(PW);
assertThat(element.getId(), is(ID));
assertThat(element.getPw(), is(PW));
}
}
결과는 컴파일 에러도 없고 runtime 실행도 에러 없이 성공하였다.
E, T 로 선언되어 있는 제너릭 클래스에 어떤 타입 클래스가 들어가도 테스트는 성공하였다.
결국 똑같은 기능을 하는 E, T를 왜 두 개로 구분했을까? 라는 생각을 해봤지만 답을 찾지 못하고 메모만 한 상태에서
어제 그 답을 알게 되었다. (스터디 모임에 나오시는 분 중에 한 분께서 알려주셨음. 실명을 거론하지는 못하겠고..)
E(element)는 그 의미로 요소라고 해석할 수 있다.
예를 들어 ArrayList는 요소들(오브젝트)를 배열처럼 저장 하기 때문에 E로 선언되어야 한다.
즉, List에서는 E(Element) 가 어울린다.
결론은 컬렉션 클래스와 같이 배열 기반으로 되어 있는 구조에는 E가 어울리고, 그 외에는 T 가 어울린다.
뭔가 결론이 부실한 것 같은 이 느낌은 뭐지?
'프로그래밍' 카테고리의 다른 글
대입연산자 잘못 쓰면 이렇게 된다. (0) | 2012.11.01 |
---|---|
javascript delete 연산자 (0) | 2012.10.29 |
javascript foreach 사용 방법 (1) | 2012.10.29 |
spring 2.5 not supported by MultipartResolver 발생 시 해결 방법 (0) | 2012.10.26 |
getter, setter 자동 생성 라이브러리 lombok (0) | 2012.10.23 |
properties 너가 날 엿 먹이는 구나~ (0) | 2012.04.14 |
메인 도메인과 서브 도메인 세션 공유 문제 (0) | 2012.04.14 |
ant를 이용한 ftp 업로드 (0) | 2009.04.01 |