Today
-
Yesterday
-
Total
-
  • 💡 [자바/코틀린] 제네릭? 타입 T? 자세히 알려주세요
    | 프로그래밍 분야/Kotlin 2021. 6. 28. 13:31

    제네릭(generic)이란?

    제네릭은 generalize, 즉 "일반화하다"에서 나온 개념입니다.

    즉, 데이터의 타입을 일반화한다는 것을 의미합니다.

    제네릭을 통해 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 타임에 미리 지정하는 방법입니다.

     

    이를 통한 장점은 크게 세 가지로 나뉩니다.

    1. 객체의 타입 안정성 증가

    2. 반환값에 대한 타입 변환 및 타입 검사 x

    3. 모든 객체에 대한 확장성

     

    기존의 방식

    JDK 1.5 이전에서는 여러 타입을 사용하는 클래스나 메소드에서 인수나 반환값으로 최상위 객체인 Object 타입을 사용했습니다.

     

    이 때 Object 객체를 다시 원하는 타입으로 변환해야 하며, 오류가 발생할 가능성도 존재합니다.

    하지만 JDK 1.5부터 도입된 제네릭은 컴파일 시에 미리 타입이 정해지므로, 안정성이 증가하고 타입 변환과 검사를 할 필요가 없어집니다.

     

    또한 제네릭, 즉 타입 T에 대한 일반 메서드를 구현해놓으면 모든 타입의 객체에 사용할 수 있으므로(컴파일 타임에 알아서 타입이 지정되므로) 확장성이 증가합니다.

     

     

    제네릭 클래스의 선언 및 인스턴스 생성

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

     

    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>();

     

    위처럼 실제 타입을 명시하면, 내부적으로 타입 변수가 변환되어 처리됩니다.

    이때는 위 예제의 Integer와 같이 래퍼(wrapper) 클래스를 사용해야만 합니다.

     

    또한, Java SE 7부터 인스턴스 생성 시 타입을 추정할 수 있는 경우에는 타입을 생략할 수 있습니다.

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

     

     

    제네릭의 제거 시기

    제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환됩니다.

    그 뒤에, 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 됩니다.

    이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서입니다.

     

     

    Reference

    http://tcpschool.com/java/java_generic_concept
sangilyoon.dev@gmail.com