자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
타입 변수에 대입하기
개념 정리: 타입 변수(E) 대신 실제 타입(Tv)을 지정(대입)
지네릭(Generic) 은 클래스나 메서드를 선언할 때 사용할 데이터 타입을 나중에 결정하도록 하는 기능입니다.
예를 들어 ArrayList<E>는 타입 E를 사용하는 클래스인데, 객체를 만들 때 E를 Tv로 바꿀 수 있습니다.
코드
ArrayList<Tv> tvList = new ArrayList<Tv>();
- ArrayList<E> 라는 클래스에 E = Tv 라고 지정한 것.
- 즉, 이 객체는 내부적으로 Tv 타입의 데이터만 저장하게 됩니다.
public class ArrayList<E> extends AbstractList<E> {
private transient E[] elementData;
public boolean add(E o) { ... }
public E get(int index) { ... }
}
- 이 코드는 지네릭 클래스 ArrayList<E>의 일부입니다.
- E는 타입 변수이므로, 실제 객체 생성 시 어떤 타입을 지정하느냐에 따라 결정됩니다.
여기서 E를 Tv로 지정했기 때문에 다음처럼 모든 E가 Tv로 대체됩니다:
public class ArrayList extends AbstractList {
private transient Tv[] elementData;
public boolean add(Tv o) { ... }
public Tv get(int index) { ... }
}
👉 즉, 원래는 get()이 Object를 반환했지만, 지네릭을 사용하면 Tv를 반환하게 되어 형변환이 필요 없게 됩니다.
형변환 차이 비교
❌ 지네릭을 쓰지 않았을 때 (Object 기반)
ArrayList tvList = new ArrayList(); // 타입 미지정
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0); // (Tv) 형변환 필요
- 내부적으로 Object 배열에 저장되므로 Object → Tv로 강제 형변환(casting) 해야 함
✅지네릭을 사용했을 때
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0); // 형변환 필요 없음!
- 이미 Tv 타입으로 고정되어 있기 때문에 get() 메서드는 Tv를 바로 반환함
지네릭스 용어
주요 용어 설명
1. Box<T>
- 지네릭 클래스(Generic Class) 선언
- <T>는 타입 변수 (타입 매개변수)
- 읽을 때는 “T의 Box” 또는 “타입 T를 가지는 Box”라고 읽습니다
2. T
- 타입 변수 또는 타입 매개변수(type parameter)
- 실제로는 아무 타입이 아니라, 나중에 지정될 타입
3. Box (raw type, 원시 타입)
- 타입 매개변수가 없는 버전 → 즉 Box<T> 중 <T>를 생략한 형태
- 예전 방식. 자바 5 이전에는 이런 방식으로 사용
코드
class Box<T> { }
- T는 타입 변수 (타입 매개변수)
- 이 클래스는 어떤 타입이든 받을 수 있는 일반화된 클래스
Box<String> b = new Box<String>();
- 이때 T에 String을 지정했기 때문에 Box는 String을 다루는 클래스가 됨
- 이런 식으로 타입이 지정된 지네릭 타입을 parameterized type (매개변수화 타입)이라고 부름
지네릭이 주는 이점
지네릭 사용 전 | 지네릭 사용 후 |
Object 기반 저장 → 형변환 필요 | 타입 고정 → 형변환 불필요 |
타입 오류가 런타임에 발생 | 컴파일 시점에서 타입 오류 잡음 |
가독성 낮음 | 가독성 높음, 유지보수 쉬움 |
'Java' 카테고리의 다른 글
지네릭스 제약네릭스 제약 (0) | 2025.06.25 |
---|---|
Iterator, HashMap과 지네릭스 (0) | 2025.06.25 |
타입 변수 (0) | 2025.06.25 |
지네릭스 (0) | 2025.06.25 |
컬렉션 클래스 정리 & 요약 (0) | 2025.06.24 |