Java Generic 관련 정리 from 이것이 자바다(책)
Updated:
Java Generic 관련 정리
왜 제네릭을 사용해야 하는가?
- 컴파일 시 강한 타입 체크를 할 수 있다. 실행 시 타입 에러가 나는 것보다는 컴파일 시에 미리 타입을 강하게 체크를 해서 에러를 사전에 방지하기 위함
- 타입 변환(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) {...}
제한된 타입 파라미터(
ex) 숫자를 연산하는 제네릭 메소드는 매개값으로 Number 타입 or 하위 클래스 타입(Byte, Short, Integer,Long, Double)의 인스턴스만 가져야 함
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...){...}
public <T extends Number> int compare(T t1, T t2) {...}
와일드카드 타입(<?>, <? extends …>,<? super …>)
- <?> : Unbounded Wildcards(제한 없음)
- <? extends 상위타입> : Upper Bounded WildCards(상위 클래스 제한)
- <? super 하위타입> : Lower Bounded WildCards(하위 클래스 제한)
예시
- Course<?> : 수강생은 모든 타입(Person, Worker, Student, HighStudent) 가능
- Course<? extends Student> : 수강생은 Student와 HighStudent만 가능(Student이하 아래 모든 하위클래스)
- Course<? super Worker> : 수강생은 Worker와 Person만 가능(Worker 클래스와 Worker 클래스가 상속하는 모든 타입)
위와 관련한 모든 예제들은 아래 링크 주소에 있으니 참고해주시면 감사하겠습니다.
https://github.com/goodgood619/ThisIsJava
Leave a comment