Java

지네릭 다형성

1space 2025. 6. 25. 10:07

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

타입 변수에 대입하기

개념 정리: 타입 변수(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