본문 바로가기

6개월 대장정/JAVA 개념

24일차 - 제네릭

반응형

안녕하세요. pitang입니다.

제네릭,, 그것에 대해 알아보겠습니다.

 

제네릭(Generic) 타입

제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.

제네릭 타입을 이용함으로 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다.

 

타입 변환을 제거하였고 컴파일 시 강한 타입 체크를 할 수 있다.

제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용된다. 그러므로 잘 알아두어야 한다.

 

ex1)

- 제네릭타입을 사용하지 않은 경우

   강제형변환을 해줘야 하는 수고로움이 있다.

p01notgeneric Ex01
console

-> Box 클래스의 필드 타입을 Object타입으로 선언한 이유는 필드에 모든 종류의 객체를 저장하려고이다.

     이 경우, 저장할 때에도 읽을 때에도 타입 변환이 발생한다.

 

ex2)

- 제네릭타입을 사용한 경우

  <> 안에는 일반적으로 대문자 알파벳 한 글자로 표현한다. Type의 T를 많이 사용하고 개수가 늘어갈 경우, TUVWXYZ로 쓰인다.

p02generic Ex01
console

-> 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고,

     타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정한다.

 

멀티 타입 파라미터

제네릭 타입은 두개 이상의 멀티 타입 파라미터를 사용할 수 있고, 이 경우 타입 파라미터를 콤마로 구분한다.

자바 컴파일러는 타입 파라미터 부분에 <> 연산자를 사용하면 타입 파라미터를 유추해 자동으로 설정해준다.

 

ex)

p02generic Ex02 - Container
console

 

제네릭 메소드(<T, R> R method(T t))

제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말하고,

선언하는 방법은

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

이다.

 

제네릭 메소드는 두 가지 방식으로 호출할 수 있다. 코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고,

컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수도 있다.

 

ex)

p02generic Ex03(1)
p02generic Ex03(2)
console

 

 

 

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

코드에서 ?를 일반적으로 와일드카드(wildcard)라고 부른다.

 

ex1)

p03wildcard Ex01

 

제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드카드를 세 가지 형태로 사용할 수 있다.

 

제네릭타입<?> : 제한업음

제네릭타입<? extends 상위타입> : 상위 클래스 제한

제네릭타입<? super 하위타입> : 하위 클래스 제한

 

ex2)

p03wildcard Ex02

 

ex3)

Integer, Double 메서드를 따로따로 쓸 필요 없이 와일드 카드로 간단하게 코드를 작성할 수 있다.

p03wildcard Ex03
p03wildcard Ex03 - avg, avg1, avg2
console

avg1과 avg2를 avg 로만 표현할 수 있다.

 

제한된 타입 파라미터(<T extends 최상위 타입>)

제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다.

상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다.

 

public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) {...}  으로 사용된다.

중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버로 제한된다. 

 

ex)

p02generic Ex05

 

 

 

제네릭 타입의 상속과 구현

제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있고, 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다.

 

ex)

p04extends Ex01

 

숫자 타입만 구체적인 타입으로 갖는 제네릭 메소드 compare()이다. 

 

 

감사합니다. 

 

*m1 맥북을 사용 중입니다.*

 

 

 

 

 

 

 

 

 

 

728x90
반응형