자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
타입 변수란?
핵심 요점:
- 클래스나 메서드를 만들 때, 데이터 타입을 고정된 타입(Object 등) 으로 하지 않고, 변수처럼 일반화된 타입(E 등) 으로 지정하는 방식.
- 이게 바로 지네릭 클래스입니다.
public class ArrayList extends AbstractList {
private transient Object[] elementData;
public boolean add(Object o) { ... }
public Object get(int index) { ... }
}
- Object로 작성된 add()나 get() 메서드는 모든 타입을 받을 수는 있지만, 꺼낼 때 형변환(casting) 을 해야 합니다.
- 예: String s = (String)list.get(0);
만약 잘못된 형변환을 하면 실행 중 오류가 납니다 → ClassCastException.
개선 방식
public class ArrayList<E> extends AbstractList<E> {
private transient E[] elementData;
public boolean add(E o) { ... }
public E get(int index) { ... }
}
- Object 대신 타입 변수 E를 사용합니다.
- 이 클래스는 타입을 아직 확정하지 않고, 사용하는 시점에 구체적인 타입을 대입해서 사용하는 지네릭 클래스입니다.
- 예를 들어, ArrayList<String> 이라고 하면, 이 클래스는 내부적으로 전부 String 타입으로 동작합니다.
타입 변수에 실제 타입(Tv 등) 대입하기
핵심 요점:
- 지네릭 클래스에 타입 변수(E) 를 썼다면, 그 클래스를 사용할 때 E에 어떤 실제 타입을 쓸지를 정해줘야 합니다.
- 이걸 타입 인자 지정 또는 대입 이라고 합니다.
ArrayList<Tv> tvList = new ArrayList<Tv>();
- 여기서 Tv는 사용자 정의 클래스라고 가정합니다.
- 이제 tvList는 오직 Tv 객체만 저장할 수 있습니다.
- 이때 E는 Tv로 대체됩니다. 즉 클래스는 다음처럼 작동하게 됩니다:
public class ArrayList<Tv> extends AbstractList<Tv> {
private transient Tv[] elementData;
public boolean add(Tv o) { ... }
public Tv get(int index) { ... }
}
- 이제 tvList.get(0)은 무조건 Tv 타입을 반환하므로, 더 이상 형변환이 필요 없습니다.
- Tv t = tvList.get(0); ← 형변환 생략 가능!
요약 정리
일반 클래스 | Object로 되어 있어서 모든 타입 가능하지만, 꺼낼 때 형변환 필요하고 실수하면 ClassCastException 발생 |
지네릭 클래스 | E, T, K, V 같은 타입 변수를 사용해 작성. 나중에 실제 타입을 지정해서 타입 안정성 확보 |
타입 변수 대입 | 클래스 사용할 때 ArrayList<String>, ArrayList<Tv>처럼 구체적인 타입을 지정해줌 |
장점 | 컴파일 시점에 타입 오류를 잡고, 형변환 생략 가능, 코드 안정성 향상 |
'Java' 카테고리의 다른 글
Iterator, HashMap과 지네릭스 (0) | 2025.06.25 |
---|---|
지네릭 다형성 (0) | 2025.06.25 |
지네릭스 (0) | 2025.06.25 |
컬렉션 클래스 정리 & 요약 (0) | 2025.06.24 |
Colections의 메서드 (0) | 2025.06.24 |