학원/JDBC

10/25 28-4 제너릭(Generic) 이론정리

도원결의 2022. 10. 25. 19:28

제너릭(Generic)

어려워서 뭔말인지 하.나.도 모르겠음 멘붕멘붕멘붕

다행히도 선생님이 이거 어려워서 이해 못해도 괜찮다고 하셨는데 ... 절대 안 괜찮을 거 같아서 걍 교안내용이라도 퍼 와야 겠음..... 근데 아직도 멘붕멘붕

 

클래스메소드 사용 시 타입을 지정할 수 있도록 하는 일반(Generic)화된 타입이라는 의미 

아!!!! 제너릭은 클래스나 메소드 애들이랑 관련 되어있는 거군 !!

풀어서 설명하자면 클래스나 메소드에서 사용할 데이터 타입을 클래스 정의할 때 결정하는 것이 아니라 인스턴스를 생성할 때나 메소드를 호출할 때 결정하는 기법이다   

더 풀어서 설명하면 아예 처음부터 타입을 결정해 놓는게 아니고 실제로 사용 할 때 타입이 결정된다는 그런 말! 

   ex) List  ==> 지정안하면 모든 타입 입력 가능

         List<타입지정>   => 지정된 타입만 입력가능

 

제너릭은 왜 써요?
제너릭은 사용 시 타입을 지정하기 때문에 컴파일시 타입 체크를 해주는 기능(Type Safety)를 통해 런타임에러를 사전에 방지할 수 있다. 
JDK1.7부터 클래스를 인스턴스화 할 때 new 클래스명<파라미터 타입>()의  '파라미터 타입'을 생략할 수 있다.
즉, new 클래스명<>()로 인스턴스화 할 수 있다     

ex) List<student> = new ArrayList<>(); 이게 가능했던 이유다!!!!!

정리하면

-컴파일시 타입 체크 ok
-형변환 안해도 ok
-코드의 중복 제거 ok

 

제너릭 타입
타입을 파라미터로 가지는 클래스(제너릭 클래스)와 인터페이스(제너릭 인터페이스)들을  제너릭 타입이라 한다.(즉 Integer 타입,String타입이 아닌 일.반.화.된. 타입이다! 말이 일반화지 아무거나 가 더 이해하기 쉬울 듯?) 
 타입 파라미터는 일반적으로 대문자 알파벳 한 글자(T) 로 보통 표현한다 
 제네릭 타입은 두 개 이상의 멀티 파라미터를 이용할 수 있다. 이 때 각 타입 파라미터는 콤마로 구분한다.  Map<K,V>
타입 파라미터는 static 이 붙는 정적 멤버변수 나 정적 메소드, new로 초기화하는 인스턴스 멤버 변수에는 사용할 수 없다

 ****단,제너릭 메소드에는 static을 붙일 수 있다

주의할 것이 제너릭 메소드랑 클래스랑은  관계가 무관함 !!!!

 

ex)

 public class A <T> { 
              T num ;
             }
new A <integer> ( ) 요렇게 생성하면  num 도 integer로 사용된다!
T num = new T(); 이건 노노노노노노

 

제너릭을 사용한 경우 예시 
public class Generic <T> {
           private T field;
           private T newField=new T();

                               // class인스턴스화 할 때 결정되는데, 지금은 타입이 결정 되지 않아서 heap에 메모리 생성 불가
           public static T staticField;  마찬가지 타입이 결정되지 않아서 클래스 로드시점에 메모리 생성불가
           public void add(T field){      //제너릭 메소드가 아님 인스턴스형 메소드 => static 못 붙임
                        this.field=field;
                           }
           public T get(){                        //얘도 제너릭 메소드가 아님
                         return field;
                           } 
          public <T> T genericMethod(T param){    <T>이 의미는 T는 타입파라미터야 라는 정보를 알려 줌
                         return param;
                           }                   // 얘는 제너릭 메소드 이때 T는 Generic의  T와 무관하다   => static 붙일 수 있음
           public static <E> E genericStaticMethod(E param){    E는 타입파라미터야 라는 정보랑 같이 로드..
                          return param;     // 얘도 제너릭 메소드 이 때도 E는 Generic의  T와 무관하다
                             }
      }
  

제너릭 메소드(Generic Method)   => 위에서 보듯 클래스랑 아무런 상관 없음

non제너릭클래스에 제너릭 메소드 사용 가능!
클래스에 "타입 파라미터를 선언하지 않고"  "메소드마다" 타입 파라미터를 선언 해 사용할 수 있다.
즉, 제너릭 클래스(제너릭 타입)가 아니어도 해당 클래스안에 제너릭 메소드를 만들 수 있다
제너릭 메소드는 반환타입 이전에 <>로 타입 파라미터를 선언하고, 제너릭 클래스의 타입 파라미터와는 무관하다

ex)  2여기에 string 들어옴
      public <T> T genericMethod(T param){   
                  return param;
                          }     => T 여기에 String 이 들어오면 T 여기도 String이 들어옴

   ++ 컴파일러가 인자의 타입을 보고 반환 타입을 "추정"할 수 있다

                  String value = 인스턴스변수.genericMethod<String>("문자열");
                                             string 생략 가능 뒤에 "문자열"로 string을 추정 함

 

제너릭 메소드 호출
방법1.
 클래스명(static이 붙은경우).<자료형>메소드명(데이타)
 혹은 인스턴스변수.<자료형>메소드명(데이타)
:타입에 맞는 데이타만 전달할 수 있다
방법2.
 클래스명(static이 붙은경우).<자료형>메소드명(데이타)
 혹은 인스턴스변수.<자료형>메소드명(데이타)
:데이타의 타입을 보고 컴파일러가 타입을 추정한다

 

앤 여기서 .... 끝내야겠어 .... 더 이상 뭔소린지 모르겠다.... 안녕 제너릭