[Java] 제네릭(Generic)이란?

Jiisuniui·2023년 12월 22일

Java의 모든 것

목록 보기
6/7
post-thumbnail

제네릭(Generic) 이란?

  • 데이터의 타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것

  • 구체적인 타입을 명시하지 않고 타입 파라미터로 넣어두었다가, 실제 설계한 클래스가 사용되어질 때 구체적인 타입을 지정하여 사용

    class ExClassGeneric<T> { 
        private T t;
    
        public void setT(T t){
            this.t = t;
         }
    
        public T getT() {
            return t;
        }
    }

제네릭을 사용하는 이유

  • 컴파일할 때 타입 검사를 통해 예외 방지
  • 불필요한 캐스팅을 없애 성능 향상

제네릭 사용 주의사항

  • 제네릭 타입의 객체는 생성 불가

  • static 멤버에는 제네릭 불가

  • 제네릭 클래스 자체가 배열은 불가, 그런데 제네릭 타입의 배열 선언은 가능

    class Sample<T> { 
    }
    
    public class Main {
        public static void main(String[] args) {
        	// 불가능
            Sample<Integer>[] arr1 = new Sample<>[10];
            // 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), 예를 들어 List
< K >키(Key), 예를 들어 Map<k, v>
< V >리턴 값 또는 매핑된 값(Variable)
< N >숫자(Number)
< S,U,V >2번째, 3번째, 4번째에 선언된 타입

제네릭 와일드 카드

제네릭 간의 형변환을 성립되게 하기 위해 와일드 카드 ?문법을 이용함

  • 제네릭타입<?> : 타입 파라미터를 대치하는 것으로 모든 클래스나 인터페이스타입이 올 수 있음
  • 제네릭타입<? extends 상위타입> : 와일드카드의 범위를 특정 객체의 하위 클래스만 올 수 있음
  • 제네릭타입<? super 하위타입> : 와일드카드의 범위를 특정 객체의 상위 클래스만 올 수 있음
profile
why error?

0개의 댓글