WEEK 3-6: Java Generic

ensalada.de.pollo·2025년 5월 3일

be

목록 보기
10/44

제네릭(Generic)

제네릭은 클래스, 인터페이스, 메서드 등에서 사용할 데이터 타입을 외부에서 지정하는 기법입니다. 어떤 타입이든 받을 수 있지만, 컴파일 시점에 타입을 명확하게 제한할 수 있습니다.

핵심 특징

  • 타입 안정성: ArrayList<Integer>에 String을 추가하려고 할 때 오류를 내뱉음
  • 재사용성: 하나의 클래스, 메서드로 다양한 타입을 처리 가능
    예를 들어서, int를 대상으로 하는 ArrayList를 따로, String을 대상으로 하는 ArrayList를 따로... 이렇게 만들지 않고 여러 타입을 처리할 수 있다는 것입니다.
  • 형 변환 생략: 명시적인 캐스팅이 없어도 타입을 보장받을 수 있습니다.
  • Type Erasue: 컴파일 시에는 제네릭 타입 정보가 제거되어서 런타임에는 Object로 처리됩니다. 이 때, 컴파일러가 자동으로 타입 캐스팅을 추가해서 타입 안정성을 유지합니다.

제네릭의 활용

제네릭 클래스

class GenericBox<T> { // T: 타입 매개변수
	private T item;
    
    public GenericBox(T item) {
    	this.item = item;
    }
    
   	public T getItem() {
    	return item;
    }
}

제네릭 메서드

public <T> void printArray(T[] array) {
	// String 배열이든, Integer 배열이든 어떤 타입의 배열이든지 받겠다는 의미
    for (T element : array) {
    	System.out.println(element);
    }
}

제네릭의 주요 규칙

  • 타입 매개변수 네이밍에 있어서 T(Type), E(Element), K(Key), V(Value) 등 관례적인 네이밍을 사용해야 합니다.
  • 와일드카드(?)를 사용할 수 있습니다.
    예를 들어, List<?> 라는 것은 모든 타입을 허용한다는 의미,
    List<? extends Number> 라는 것은 Number의 하위 타입을 허용하겠다는 의미입니다.
  • GenericBox<Integer>는 GenericBox<Object>의 하위 타입이 아닙니다.

위 예시에서 List<?>를 보여주었는데 List<T>와 무슨 차이가 있나요?

T는 타입을 명확하게 지정하겠다는 의미, ?는 알 수 없는 임의의 타입도 허용하겠다는 의미입니다.
즉, T를 사용하는 것은 타입을 알고 있고, T에 대한 연산을 할 수 있지만, ?를 사용하는 것은 타입을 모르기 때문에 Object로만 다룰 수 있고, 타입 안정성에 의해서 관련된 메서드들을 사용할 수 없습니다.

보통 와일드카드(?)는 읽기 전용과 같은 방식으로 객체를 다루고 싶을 때 사용합니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글