본문 바로가기

Java

Generic

Generic :

클래스 내부에서 사용할 데이터 타입을 외부에서 지정.


Generic 사용 이점
- 컴파일시 강한 타입 체크를 할 수 있다. (실행시 타입 에러가 나는 것보다는 컴파일시에 미리 타입을
체크해서 에러를 사전에 방지한다. )
- 타입 변환을 제거할 수 있다. 
비제네릭 코드는 불필요한 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미친다. 


List list = new ArrayList();
list.add("aaa");
String str = (String) list.get(0); //타입변환.

List<String> list = new ArrayList<String>();
list.add("aaa");
String str = list.get(0); //타입 변환을 하지 않는다. 

-----------------------------------------------------------------------------------------------------------------------
Generic 타입이란. 
타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.  class<T>, interface<T>

Generic 타입을 사용할 경우의 효과
비제네릭
- Object 타입을 사용하므로서 빈번한 타입 변환 발생 ( 성능저하)
Object타입을 사용하면, 모든 종류의 자바 객체를 저장할 수 있다는 장점은 있지만, 저장할 때 타입 변환이 발생하고 , 읽어올 때에도 타입 변환이 발생한다. 
모든 종류의 객체를 저장하면서 타입 변환이 발생하지 않도록 하는 것을 제네릭에서 찾을 수 있다. 




제네릭 타입에서 사용되는 형식 매개 변수 이름

E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

[출처] 제네릭(Generic)|작성자 

[출처] 제네릭(Generic)|작성자 



[출처] 제네릭(Generic)|작성자 

-generic에서는 Primitive 타입은 사용할 수가 없다. 때문에 Reference 타입인 Integer를 사용한다.

ex)

public Class GenericSample {

public static void main(String[] args){

Sample<String> eg = new Sample<String>();

Sample<Integer> eg2 = new Sample(); //참고로 위처럼 인스턴스를 만들어 줄 때 오른쪽의 항에 타입을 명시해 주지 않아도 문제없이 실행은 되지만                                                                   //이클립스에서 Type safety를 위해 Integer로 명시해 주라는 경고를 보냄


eg.info = "string";

eg2.info = 3;


Syste.out.println(eg.info);

Syste.out.println(eg2.info);

}

}


class Sample<T> {

public T info;

}




결과 : string

       3




Generic)|작성자 



[출처] 제네릭(Generic1)|작성자 

-generic 사용 예제1




이렇게 사용할것을 아래와 같이 사용할수 있다.



-generic 사용 예제2



//실제 아래 Map import해서 많이 사용함

import java.util.Map;

Map<String, Object> map  = new HashMap<String, Object>();

map.put("string","안녕");


-generic 사용 예제3 Wildcard


Unbounded Wildcards



 unbounded wildcard 타입은 List<?> 와 같이 물음표 만으로 정의 되어 진다(모든 타입을 인자로 받을 수 있다). 이 방법은 두 가지 유효한 사용법이 있다. 첫 번째는 Object 클래스에서 제공되는 기능만을 사용할 경우이고, 두 번째는 제네릭 클래스의 메소드들중에 List.size, List.clear처럼 타입 파라미터에 의존하지 않는 메소드들만을 사용할 경우이다.


Upper Bounded Wildcards



위의 코드에서는 Number 클래스를 상속받는 어떠한 클래스(Integer, Double, 등)가 와도 됨



Lower Bounded Wildcards



여기서는 Integer의 부모 클래스들(Number, Object, 등)을 사용할 수 있게 됨


출처 | http://blog.naver.com/oos2/220621559667

        http://blog.naver.com/harryandws/220612702094

'Java' 카테고리의 다른 글

[펌]Java Persistence API(JPA)  (0) 2016.03.16
Reflection API  (0) 2016.03.08
Collection API  (0) 2016.03.08
Excel download & upload  (1) 2016.03.03
[error] The type BASE64Decoder is not accessible due to restriction on required library  (0) 2016.01.11