자바 5.0 이후로 추가된 문법이다.

자바에서 제공하는 많은 라이브러리를 활용하려면
제네릭에 대해 이해하고 있어야한다.

많은 라이브러리가 제네릭으로 이루어져있기 때문이다.

제네릭이란

매개변수가 어떤 값이 들어와도 성립하도록 그 때 그 때 바뀌게 만든
쉽게 말하면
모든 값에 대해 이루어 질 수 있게 하는 것이다.

예를 들면
AAA class로 참조 받아야하는 클래스가 있다.
이 클래스는 제네릭이 아닌 그냥 설계한다면
AAA class만 받을 수 있다.

그렇기에 BBB class에 관한 그 클래스를 만들고 싶으면
또 만들어야한다.

하지만 이 것을 제네릭으로 만들면 하나만 만들어도 된다.

그 하나가 AAA 일때는 AAA에 맞춰 생성되고
BBB일 때는 BBB에 맞춰 생성되기 때문이다.

표현 방법은


class FruitBox<T>
{ T item;
...
}


위는 과일 상자를 제네릭으로 표현한 것이다. < > 안에 T는 기호이다.
저 클래스에 AAA를 참조하려하면 제네릭 클래스 안에 표시한 T기호가 AAA로 바뀌어서 나타내어진다.

문제 21-1
FruitBox<T>클래스에 생성자를 추가해서 코드를 만들어보자.

(생성자 코드 추가)



위 코드는 생성자를 추가한 코드이다.
제네릭 표현으로 클래스 앞에 < > 기호를 쓴것과 아래 표현하고 싶은 클래스를 기호 T로 쓴것을 제외하면
일반적인 표현 방법과 다르지 않다.

제네릭의 문법은 생각보다 복잡하다.
제네릭을 직접 만들 일은 적겠지만,

대신 우리는 제네릭으로 이루어진 라이브러리를 잘 활용해야할 필요가 있다.

제네릭 표현에 제네릭 메소드도 있다.
이 메소드에 참조되는 값은 제네릭클래스와 마찬가지로 전부 올 수 있는데
이렇게 되면 Object 클래스의 메소드만 호출할 수 있게된다.

왜냐하면 모든 경우에 대비해야되기 때문에..

이런 문제점 때문에

참조변수를 제한하는 방법이 있다.

많이 사용되는 배열을 제한하는 방법으로는

ex)


public static <T> void showArrayData(T[] arr)

{ ....

}

[] 의 표현으로 들어오는 타입을 제한할 수 있고
또 추가적으로 arr의 .length라든가 배열의 메서드를 이용할 수 있게된다.

* 와일드 카드

자료형에 상관없이 FruitBox<T>의 인스턴스를 참조하려면


FruitBox<?> box;

라고 표현하면 된다. 여기서 '?' 기호는 어떤값이 들어와도 된다는 뜻이다.

(* 참조 - 난 JAVA를 공부한 적이 없다구요, 윤성우)


+ Recent posts