Java

타입 변수

1space 2025. 6. 25. 09:17

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

타입 변수란?

핵심 요점:

  • 클래스나 메서드를 만들 때, 데이터 타입을 고정된 타입(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