본문 바로가기

Java 공부

13장 제네릭(Generic)


제네릭이란?

 -> 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것

-컬렉션, 람다식(함수적 인터페이스), 스트림, 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