99클럽 코테 스터디 12일차 TIL Generic
728x90

Generic 이란

  • 자바 Generic 은 Generic 타입 및 메소드를 정의하고 사용할 수 있는 언어적 특성
  • 그냥 List 여기서 꺽새에 들어가는 녀석이라고 보면 됨.
    • 파라미터 타입이나 리턴 타입에 대한 정의를 외부로 미룸
    • 타입에 대해 유연성과 안정성을 확보함.
    • 런타임 환경에 아무런 영향이 없는 컴파일 시점의 전처리 기술

장점

  1. 제네릭을 사용하면 잘못된 타입을 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있음.
  2. 클래스 외부에서 타입을 지정해주기 때문에 관리하기 편함.
  3. 코드의 재사용성이 높아짐.

왜 사용함?

  1. 컴파일 타임에 타입 검사를 통해 예외 방지
    컴파일러는 코드에서 잘못 사용된 타입 때문에 발생하는 문제점을 제거하기 위해 제네릭 코드에 대해 강한 타입 체크를 함.
    실행 시 타입 에러가 나는 것보다는 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지함.
  2. 불필요한 캐스팅을 없애 성능 향상

Generic 사용법

  • 클래스, 인터페이스 또는 메소드에 선언할 수 있음.
  • 동시에 여러 타입을 선언할 수 있음.
  • 와일드 카드를 이용해 타입에 대해 유연한 처리를 가능하게 함.
  • 제네릭 선언 및 정의 시에 타입의 상속 관계를 지정할 수 있음.
public class className<> {...}
public interface interfaceName<> {...}

제한

  1. 제네릭 타입의 객체는 생성이 불가
    제네릭 타입 자체로 타입을 지정하여 객체를 생성하는 것은 불가능 함.
    즉, new 연산자 뒤에 제네릭 타입 파라미터가 올수는 없다.
  2. static 멤버에 제네릭 타입이 올 수 없음.
  3. static 변수의 데이터 타입으로 제네릭 타입 파라미터가 올수는 없다.
    왜냐하면 static 멤버는 클래스가 동일하게 공유하는 변수로서 제네릭 객체가 생성되기도 전에 이미 자료 타입이 정해져 있어야 하기 때문이다.
    즉, 논리적인 오류인 것이다.
  4. 제네릭으로 배열 선언 주의
    Generic Class 자체를 배열로 만들 수는 없음.
    제네릭 타입의 배열 선언은 허용됨.
class Sample<T> { 
}

public class Main {
    public static void main(String[] args) {
        // new Sample<Integer>() 인스턴스만 저장하는 배열을 나타냄
        Sample<Integer>[] arr2 = new Sample[10]; 

        // 제네릭 타입을 생략해도 위에서 이미 정의했기 때문에 Integer 가 자동으로 추론됨
        arr2[0] = new Sample<Integer>(); 
        arr2[1] = new Sample<>();

        // ! Integer가 아닌 타입은 저장 불가능
        arr2[2] = new Sample<String>();
    }
}

자주 사용하는 타입인자

타입인자 설명
<T> Type
<E> Element
<K> Key
<N> Number
<V> Value
<R> Result
728x90