"이것이 자바다" 정리 13장 제네릭

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만 올 수있다.