java generic에서 E와 T 차이

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 가 어울린다.

뭔가 결론이 부실한 것 같은 이 느낌은 뭐지?