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 가 어울린다.
뭔가 결론이 부실한 것 같은 이 느낌은 뭐지?
감사합니다.
깔끔하고 명쾌한 답변이었습니다.