[Java] Generic Type

He SEO·2022년 3월 15일
0

Generic?

클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법으로, 이렇게 컴파일 시에 미리 타입 검사를 수행하면 다음과 같은 장점을 가짐

장점

  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있음
  • 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있음

JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했지만 이 경우에 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 하며, 이때 오류가 발생할 가능성이 존재. 하지만 JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 버거로운 작업을 생략할 수 있게 됨.

제네릭의 선언 및 생성

class MyArray<T> {
	T element;
	void setElement(T element) { this.element = element;}
	T getElement() { return element; }
}

위의 예제에서 사용된 T를 타입변수(type variable)라고 하며, 임의의 참조형 타입을 의미함. 꼭 T 뿐만 아니라 어떠한 문자를 사용해도 상관없으며, 여러 개의 타입 변수는 (,)로 구분하여 명시할 수 있음.

타입 변수는 클래스에서뿐만 아니라 메소드의 매개변수나 반환값으로도 사용할 수 있음.

위와 같이 선언된 generic class를 생성할 때는 타입 변수 자리에 사용할 실제 타입을 명시해야 함.

MyArray<Integer> myArr = new MyArray<Integer>();

위처럼 generic class를 생성할 때 사용할 실제 타입을 명시하면, 내부적으로는 정의된 타입 변수가 명시된 실제 타입으로 변환되어 처리 됨.

제네릭의 제거 시기

자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환됨. 그리고서 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 됨. 이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서임.

Generic type에는 <?>도 존재하는데, ?는 알 수 없는 타입이며 사용법은 아래와 같음.

  • <?> : 모든 객체 자료형, 내부적으로는 Object로 인식
  • <? super 객체형> : 명시된 객체자료형의 상위 객체, 내부적으로는 Object로 인식
  • <? extends 객체자료형> : 명시된 객체자료형을 상속한 하위 객체, 내부적으로는 객체 자료형으로 인식

사용 시 주의 사항

  • Generic type으로는 static을 선언할 수 없음
  • Generic type으로는 instance를 생성할 수 없음

타입 매개변수 종류

  • E - element
  • K - key
  • N - number
  • T - type
  • V - value

참고 사이트

profile
BACKEND 개발 기록 중. 감사합니다 😘

0개의 댓글