2023. 3. 19. 17:32ㆍ자바/이론 공부
이 게시글은 내가 "이것이 자바다" 책을 읽고 노트에 정리해놨던 내용들을 검색하기 쉽게 데이터로 백업하는 용도의 글이다.
문제가 된다면 삭제하겠음.
13장 제네릭
*제네릭
- 제네릭을 사용하면 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 된다.
- 컬렉션, 람다식, 스트림, NIO에서 널리 사용된다.
*제네릭 특징
1. 컴파일 시 강한 타입 체크를 할 수 있다.
-컴파일 시 타입을 강하게 체크해서 에러를 사전에 방지함.
2. 타입 변환(casting)을 제거한다.
- 불필요한 타입 변환은 프로그램 성능에 악영향을 미친다.
- 제네릭을 사용하면 요소의 타입을 하나로 국한하기때문에 요소를 찾아올 때 타입 변환을 할 필요가 없어 성능이 향상된다.
*제네릭 타입 (class<T>, intergace<T>)
- 타입을 파라미터로 가지는 클래스와 인터페이스를 말함.
- 제네릭 타입을 사용하지 않고 모든 타입을 받는 클래스를 만드려면 Object를 사용해야하는데 그렇게 되면 계속 타입 변환을 해야해서 프로그램 성능이 낮아진다.
- 모든 종류의 객체를 저장하면서 타입 변환이 발생하지 않도록 하기 위해서 제네릭 타입을 사용한다.
- 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화시킨다.
*제네릭 메소드(<T, R> R method(T t))
- 매개타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말함.
- 리턴 타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술하면된다.
public <T> Box<T> boxing<T t>{
//...
}
- 제너릭 메소드는 두가지 방식으로 호출할 수 있다.
Box<Integer> box= <Integer>boxing(100); //타입 파라미터의 구체적인 타입을 명시적으로 지정
Box<Integer> box= boxing(100); //컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정
*제한된 타입 파라미터( <T extends 최상위타입> )
- 타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 있을 때 사용한다.
ex)숫자를 연산하는 제네릭 메소드라 매개값으로 Number 타입 혹은 하위 클래스 타입(byte, short, Integer, Long, Double)의 인스턴스만 가져야할 때.
- 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다.
- 메소드의 중괄호 {} 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)로 제한된다. //이게 무슨 소리지..? 아, 깨달았다. 우리가 아는 상속과 구현과 비슷한것이다. 부모타입의 필드와 메소드만 사용가능한 점! 이 비슷하게 나타나는 것 같다.
*와일트카드 타입(<?>, <? extends ...>, <? super ...> )
- 코드에서 '?'를 일반적으로 와일드카드라고 함.
- 제네릭 타입에서 와일드카드를 사용하는 법
1. 제네릭타입<?> : 제한 없음.
: 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있다.
2. 제네릭타입<? extends 상위타입> : 상위 클래스 제한
: 상위타입이나 하위 타입만 올 수 있다.
3. 제네릭타입<? super 하위타입> : 하위 클래스 제한
: 하위 타입이나 상위타입이 올 수 있다.
- 예를 들어
이런 관계의 클래스가 있을 때,
- Course<?> : ?에는 모든 타입(Person, Worker, Student, HighStudent)이 올 수있다.
- Course<? extends Student> : ?에는 Student, HighStudent만 올 수있다.
- Course<? super Worker> : ?에는 Person, Worker만 올 수있다.
'자바 > 이론 공부' 카테고리의 다른 글
"이것이 자바다" 정리 14장 람다식 (0) | 2023.03.21 |
---|---|
[Java / Spring] RequestBody, ModelAttribute, RequestParam (0) | 2023.03.14 |
"이것이 자바다" 정리 12장 멀티 스레드 (1) | 2023.03.10 |
"이것이 자바다" 정리 11장 기본 API 클래스 (0) | 2023.03.10 |
"이것이 자바다" 정리 10장 예외 처리 (0) | 2023.02.28 |