[Java] 제네릭(Generic)

Yeoonnii·2023년 1월 22일
0

Java

목록 보기
18/30
post-thumbnail

컬렉션 프레임워크를 구성하는 모든 클래스가 제네릭으로 표현되어있다고 하였는데, 제네릭이란 무엇일까?


제네릭(Generic)이란?

특정 타입만 다루는것이 아니라 여러 종류의 타입으로 사용할 수 있도록 클래스나 메서드를 일반화시키는 기법이며, 자바에서 제네릭(Generic)이란 데이터의 타입(data type)을 일반화한다(Generalize)는 것을 의미한다.

제네릭을 사용하여 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 경우, 타입 검사나 타입 변환과 같은 번거로운 작업을 생략할 수 있게 된다.



제네릭의 선언 및 생성

자바에서 제네릭은 클래스와 메소드에만 다음과 같은 방법으로 선언할 수 있다.

class MyArray<T> {

    T element;

    void setElement(T element) { this.element = element; }

    T getElement() { return element; }

}

위에서 사용된 'T'를 타입 변수(type variable)라고 하며, 임의의 참조형 타입을 의미한다.

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

선언된 제네릭 클래스(Generic Class)를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야 한다.

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

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



제네릭 클래스와 인터페이스

제네릭 클래스(Generic Class)

class 이름<T1, T2, ..., Tn> {
	// ...
}

제네릭 클래스는 보통 위와 같이 정의한다.

여기서 'T'를 타입 매개변수(type parameter)라고 하며, 임의의 참조형 타입을 의미한다.
괄호 <> 사이에 타입 매개변수를 쉼표로 구분하여 늘어놓는다.
이러한 클래스를 매개변수화된 클래스(parameterized classes)라고 부르기도 한다.

타입 매개변수(type parameter) vs 타입 인수(type argument)

타입 매개변수는 제네릭 클래스를 정의할 때 사용하며,
타입 인수는 제네릭 클래스를 사용할 때 사용한다.

class Box<T> { ... } // T = 타입 매개변수
Box<Integer> box = new Box<Integer>(); // Integer = 타입 인수

제네릭 클래스의 객체를 만드려면 아래와 같이 타입 인수(type argument)로 사용할 실제 타입을 명시한다.

Box<String> box = new Box<String>();

실제 사용할 타입을 적을 때 기본 타입이 아니라 참조 타입만 적을 수 있다는 점을 주의해야 한다.

🚨 아래와 같이 기본 타입을 작성하면 에러가 발생한다.

Box<int> box = new Box<int>();

제네릭 인터페이스(Generic Interface)

제네릭 인터페이스도 제네릭 클래스와 같은 방법으로 선언할 수 있다.

interface 이름<T1, T2, ..., Tn> {
    // ...
}

타입 매개변수명 작성 규칙

보통 타입 매개변수명은 하나의 대문자로 사용한다.
가장 일반적으로 쓰이는 타입 매개변수명은 아래와 같다.

  • E - 요소(Element)
  • K - 키(Key)
  • N - 숫자(Number)
  • T - 타입(Type)
  • V - 값(Value)
  • S, U, V 등 - 2번째, 3번째, 4번째 타입

Java™ 자습서
29편. 제네릭(Generic)

0개의 댓글