Java Generic 관련 정리 from 이것이 자바다(책)

Updated:

Java Generic 관련 정리

왜 제네릭을 사용해야 하는가?

  1. 컴파일 시 강한 타입 체크를 할 수 있다. 실행 시 타입 에러가 나는 것보다는 컴파일 시에 미리 타입을 강하게 체크를 해서 에러를 사전에 방지하기 위함
  2. 타입 변환(casting)을 제거한다. 비제네릭 코드는 불필요한 타입 변환을 하기 때문에, 프로그램 성능에 악영향을 미친다. 요소를 찾아 올때, 반드시 String으로 타입 변환을 해야 한다.
List list = new ArrayList(); // 제네릭을 사용하지 않았음 
lisd.add("hello");
String str = (String) list.get(0); // String으로 casting(타입변환)을 해야함

List<String> list = new ArrayList<String>(); // new ArrayList<String>에서 String은 생략 가능하다. List<String>으로 부터 추론이 가능하기 때문에, 컴파일러가 자동으로 인식해줌
list.add("hello");
String str = list.get(0); // 타입 변환을 하지 않음

//public class 클래스명<T> {...}
//public interface 인터페이스명<T> {...}

제네릭 메소드(Generic method) : <T,R> R method(T t) 의 형태

public <타입파라미터,...> 리턴타입 메소드명(매개변수, ...) {...}
public <T> Box<T> boxing(T t) {...}

제한된 타입 파라미터() : 타입 파라미터(T)에 지정되는 구체적인 타입을 제한할 필요가 종종 있을 수 있다.

ex) 숫자를 연산하는 제네릭 메소드는 매개값으로 Number 타입 or 하위 클래스 타입(Byte, Short, Integer,Long, Double)의 인스턴스만 가져야 함

public <T extends 상위타입> 리턴타입 메소드(매개변수, ...){...}
public <T extends Number> int compare(T t1, T t2) {...}

와일드카드 타입(<?>, <? extends …>,<? super …>)

  1. <?> : Unbounded Wildcards(제한 없음)
  2. <? extends 상위타입> : Upper Bounded WildCards(상위 클래스 제한)
  3. <? super 하위타입> : Lower Bounded WildCards(하위 클래스 제한)

예시

Generic

  1. Course<?> : 수강생은 모든 타입(Person, Worker, Student, HighStudent) 가능
  2. Course<? extends Student> : 수강생은 Student와 HighStudent만 가능(Student이하 아래 모든 하위클래스)
  3. Course<? super Worker> : 수강생은 Worker와 Person만 가능(Worker 클래스와 Worker 클래스가 상속하는 모든 타입)

위와 관련한 모든 예제들은 아래 링크 주소에 있으니 참고해주시면 감사하겠습니다.
https://github.com/goodgood619/ThisIsJava

Leave a comment