Purple Bobblehead Bunny

Backend/JAVA

[JAVA] Generic

준영어린이 2022. 3. 4. 13:26

 

 

 

여기서 Line2는 많이 생소했다.  <> 괄호 안에 자료형을 대체하고 있다.

<> 괄호안에 사용되는 것이 제네릭(Generic)이라고 한다.

 

Generic이란, 자료형을 일반화 시키는 것이다.

 

 

 

int형 자료형, double 자료형을 다루는 클래스가 있다.

두 클래스는 기능은 같지만, 두 클래스의 다른 점은 자료형이다. (int, double)

이 자료형을 어떤 것으로 치환을 하는데, 치환하여 표현을 한 것이 바로 Generic이다.

 

이렇게 T로 치환을 할 수 있다.

 

그럼 T에 int가 들어가면 T는 int가 되고, double이 들어가면 double이 들어가게 된다.

 

Generic<Integer> intClass = new GenericClass<>(5);

Generic<double> doubleClass = new GenericClass<>(3.2);

 

하지만, Generic은 int나 double 같은 일반 자료형은 사용할 수 없다. ==> Wrapper 클래스를 사용해야함.

(기본 자료형을 감싼 인스턴스)

기본 자료형 Wrapper 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
void Void
boolean Boolean

그래서, int, double이 아닌 Integer, Double을 사용하면 된다.

 

/--클래스에 제네릭을 사용할 때--/

class TestClass<제네릭 기호> {___}

-->

class GenericClass<T> {

       Private T value;

       GenericClass(final T value) {

            this.value = value;

      }

  public T getValue() {

           return value;

       }

/--메소드에 제네릭을 사용할 때--/

public static<제네릭기호> void func(제네릭 기호...) {___}

-->

public static <t> void printArray(T[] arr) {

      for(T i : arr) {

           System.out.println(i);
       }

}

 

제네릭 클래스 예제

제네릭 메소드 예제

 

Line1 처럼, 제네릭을 1개 이상 사용 할 수도 있다.

 

 

 

위에서 했던 예제를 보면, 모든 자료형이 해당 클래스를 사용할 수 있다.

하지만, 특정 자료형으로 제한하여 사용하도록 할 수도 있다.

<>괄호안에 extends를 사용하는 것.

 

//제네릭을 Integer로 한정시키기

class TestClass <T extends Integer> {,,,,}

 

//제네릭을 String으로 한정시키기

class TestClass <T extends String> {,,,,}

 

예제

제네릭에서는 제한할 때 interface와 클래스 모두 extends를 사용한다.

 

와일드카드 ( WildCard )

파일을 지정할 때, 구체적인 이름 대신에 여러 파일을 동시에 저정 할 목적으로 사용하는 특수 기호.

 

자바에서는 "?" 로 나타낸다. 제네릭에 활용해보자.

 

//Integer를 상속하는 모든 클래스가 사용 가능

GenericClass<? extends Integer> intClass = new GenericClass<>();

 

//Double을 상속하는 모든 클래스가 사용 가능

GenericClass<? extends Integer> DoubleClass = new GenericClass<>();

 

예제

 

 

위 처럼 Human 또는 Human을 상속하는 클래스가 전달되어 생성되는 Introduce<T>의 인스턴스는 무엇이든

이 메소드의 인자로 전달 할 수 있게 된다.

 

WildCard로 하위클래스도 제한할 수 있다.

extends를 super로 바꾸기만 하면 가능하다.

 

//A가 상속하는 모든 클래스 사용 가능

GenericClass<? super A> AClass = new GenericClass<>();

 

//B가 상속하는 모든 클래스 사용 가능

GenericClass<? super B> BClass = new GenericClass<>();

 

 

 

 

'Backend > JAVA' 카테고리의 다른 글

[JAVA] ArrayList  (0) 2022.03.04
[JAVA] GUI 이벤트 구동 프로그래밍  (0) 2022.03.04
[JAVA] 배치 관리자(Layout manager)  (0) 2022.03.02
[JAVA] Java Swing  (0) 2022.03.02
[JAVA] StringBuilder, StringBuffer  (0) 2022.03.02