여기서 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 |