안녕하세요. pitang입니다.
제네릭,, 그것에 대해 알아보겠습니다.
제네릭(Generic) 타입
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
제네릭 타입을 이용함으로 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다.
타입 변환을 제거하였고 컴파일 시 강한 타입 체크를 할 수 있다.
제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용된다. 그러므로 잘 알아두어야 한다.
ex1)
- 제네릭타입을 사용하지 않은 경우
강제형변환을 해줘야 하는 수고로움이 있다.
-> Box 클래스의 필드 타입을 Object타입으로 선언한 이유는 필드에 모든 종류의 객체를 저장하려고이다.
이 경우, 저장할 때에도 읽을 때에도 타입 변환이 발생한다.
ex2)
- 제네릭타입을 사용한 경우
<> 안에는 일반적으로 대문자 알파벳 한 글자로 표현한다. Type의 T를 많이 사용하고 개수가 늘어갈 경우, TUVWXYZ로 쓰인다.
-> 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고,
타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정한다.
멀티 타입 파라미터
제네릭 타입은 두개 이상의 멀티 타입 파라미터를 사용할 수 있고, 이 경우 타입 파라미터를 콤마로 구분한다.
자바 컴파일러는 타입 파라미터 부분에 <> 연산자를 사용하면 타입 파라미터를 유추해 자동으로 설정해준다.
ex)
제네릭 메소드(<T, R> R method(T t))
제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말하고,
선언하는 방법은
public <타입파라미터,,,> 리턴타입 메소드명(매개변수, ...) {...}
이다.
제네릭 메소드는 두 가지 방식으로 호출할 수 있다. 코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고,
컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수도 있다.
ex)
와일드카드 타입(<?>, <? extends ...>, <? super ...>)
코드에서 ?를 일반적으로 와일드카드(wildcard)라고 부른다.
ex1)
제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드카드를 세 가지 형태로 사용할 수 있다.
제네릭타입<?> : 제한업음
제네릭타입<? extends 상위타입> : 상위 클래스 제한
제네릭타입<? super 하위타입> : 하위 클래스 제한
ex2)
ex3)
Integer, Double 메서드를 따로따로 쓸 필요 없이 와일드 카드로 간단하게 코드를 작성할 수 있다.
avg1과 avg2를 avg 로만 표현할 수 있다.
제한된 타입 파라미터(<T extends 최상위 타입>)
제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다.
상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다.
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) {...} 으로 사용된다.
중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버로 제한된다.
ex)
제네릭 타입의 상속과 구현
제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있고, 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다.
ex)
숫자 타입만 구체적인 타입으로 갖는 제네릭 메소드 compare()이다.
감사합니다.
*m1 맥북을 사용 중입니다.*
'6개월 대장정 > JAVA 개념' 카테고리의 다른 글
26일차 - 컬렉션 프레임 워크-Set컬렉션 (0) | 2021.09.20 |
---|---|
24일차 - 컬렉션 프레임 워크-List컬렉션 (0) | 2021.09.15 |
23일차 - 멀티 스레드 (0) | 2021.09.15 |
23일차 - 기본 API 클래스(4, Wrapper 클래스) (0) | 2021.09.14 |
22일차 - 기본 API 클래스(3, Object클래스) (0) | 2021.09.13 |