10/25 28-4 제너릭(Generic) 이론정리
제너릭(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이 붙은경우).<자료형>메소드명(데이타)
혹은 인스턴스변수.<자료형>메소드명(데이타)
:데이타의 타입을 보고 컴파일러가 타입을 추정한다
앤 여기서 .... 끝내야겠어 .... 더 이상 뭔소린지 모르겠다.... 안녕 제너릭