제네릭이란?
-> 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것
-컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용된다.
제네릭을 사용하므로서 얻는 이점
1. 컴파일시 강한 타입 체크를 할 수 있다.
-컴파일시에 미리 타입을 강하게 체크해서 에러를 사전에 방지한다. 따라서 실행 시 타입에러가 나는 것을 방지해준다.
*컴파일러가 미리 오류를 체크함으로서 실행 시의 버그를 줄일 수 있음
2. 타입 변환을 제거할 수 있다.
-타입 변환이 생기면 생길수록 전체 애플리케이션 실행 성능에는 좋지 않다. 따라서 타입변환을 적게 발생시키는 것이 좋다.
-다음과 같이 제네릭을 사용하면 타입변환을 제거할 수 있다.
제네릭 사용 전 |
| 제네릭 사용 후 |
List list = new ArrayList(); list.add("hello"); String str = (String) list.get(0); | ▶ ▶ | List<String> list = new ArrayList<String>(); list.add("hello"); String str = list.get(0); |
<제네릭 사용 전>
컬렉션의 ArrayList는 다양한 타입의 객체를 저장할 수 있다.
list.add("hello");로 문자열을 저장했지만, 내부적으로는 Object타입으로 저장이 된다. (자동 타입 변환 발생)
따라서 저장한 값을 호출할 때에는 Object타입의 값이 반환되기때문에 String으로 (강제 타입 변환)을 해주어야 한다.
<제네릭 사용 후>
ArrayList에 String타입의 객체만 저장하겠다고 명시적으로 선언
자동타입변환, 강제타입변환이 일어나지 않음
제네릭 타입이란?
-타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
-선언시 클래스 또는 인터페이스 이름 뒤에 "< >"부호가 붙는다.
-"< >" 사이에는 타입 파라미터가 위치한다.
public class 클래스명 <T>{ .... }
public interface 인터페이스명 <T> { .... }
-타입 파라미터
-일반적으로 대문자 알파벳 한문자로 표현한다.
-개발 코드에서는 타입 파라미터 자리에 구체적인 타입을 지정해야 한다.
제네릭 타입의 사용
1. 클래스를 선언할 때 타입 파라미터를 기술한다. *꼭 T일 필요는 없다.
public class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
2. 클래스 사용 시, 구체적인 타입 파라미터를 지정해 주면,
Box<String> box1 = new Box<String>();
*만약 Box box = new Box(); 와 같이 구체적인 타입을 지정해주지 않는다면 T자리에 object가 들어가게 된다.
3. 컴파일러가 클래스 재구성: 컴파일 시 타입 파라미터가 구체적인 클래스로 변경된다.
public class Box<String> {
private String t;
public void set(String t) { this.t = t; }
public String get() { return t; }
}
4. 값을 넣게 되면 다음과 같다.
box1.set("hello");
String str = box1.get();
---> String타입에 대한 타입변환 없이 클래스가 사용된다.
본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.
'Java 공부' 카테고리의 다른 글
13장 제네릭(Generic) (3)_제네릭 메소드 (0) | 2019.05.22 |
---|---|
13장 제네릭(Generic) (2)_멀티 타입 파라미터 (0) | 2019.05.22 |
12장 스레드풀(4) (0) | 2018.12.12 |
12장 스레드풀(3) (0) | 2018.12.11 |
12장 스레드풀(2) (0) | 2018.12.11 |