제네릭이란 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타이븡로 대체시키는 기능
package ch13.sec01;
public class Box<T> {
public T content;
}
Box 클래스에서 결정되지 않은 content 타입을 T라는 타입 파라미터로 정의했다.
<T>는 타입 파라미터를 뜻하는 기호로, 타입이 필요한 자리에 T를 사용할 수 있음을 알려준다.
여기서 Box 클래스는 T를 content 필드의 타입으로 사용했다. 즉 Box 클래스는 T가 무엇인지 모르지만,
Box 객체가 생성될 시점에 다른 타입으로 대체된다는걸 알고있다.
package ch13.sec01;
public class GenericEx {
public static void main(String[] args) {
//Box <String> box1 = new Box<String>();
Box<String> box1 = new Box<>();
box1.content = "안녕";
String str = box1.content;
System.out.println(str);
// Box <Integer>
Box<Integer> box2 = new Box<>();
box2.content = 50;
int value = box2.content;
System.out.println(value);
}
}
타입 파라미터에서 쓰이는 T는 단지 이름일 뿐이기 때문에 어떤 알파벳을 사용해도 상관 없다.
주의할 점은 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스라는 것을 알아두자.
Box<int>라고 하지 않는 이유는 기본 타입이기 때문에 당연히 안될것이다..
제네릭 타입
제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다. 선언부에 <>가 붙는다.
public class 클래스명<A, B, ...> { .. }
public interface 인터페이스명<A, B, ...> { .. }
타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다.
외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야한다.
지정하지 않는다면 Object 타입이 암묵적으로 사용된다.
package ch13.sec02.ex02;
public interface Rentable<P> {
P rent();
}
인터페이스도 제네릭 타입으로 선언할 수 있다.
타입 파라미터 P를 리턴 타입으로 사용한 추상 메소드 선언
package ch13.sec02.ex02;
public class HomeAgency implements Rentable<Home> {
@Override
public Home rent() {
return new Home();
}
}
타입 파라미터 P를 Home으로 대체했다.
오버라이딩하는 메서드는 반드시 리턴타입이 Home이어야 한다.
타입 파라미터는 기본적으로 Object 타입으로 간주된다고 했다. 그 말은 Object가 가지고 있는 메소드를 호출할 수 있다는 것이다.
Box의 내용물을 비교하기 위해 equals() 메소드를 사용해보자
package ch13.sec02.ex03;
public class Box<T> {
public T content;
// Box 내용물 비교
public boolean compare(Box<T> other) {
boolean result = content.equals(other.content);
return result;
}
}
Object의 equals() 메소드로 필드값을 비교한다. 다만 Object의 equals()를 오버라이딩 하는 클래스가 있다고 한다면
equals의 값이 달라질 수 있다. (오버라이딩한 메서드가 우선순위를 가지기 때문에 오버라이딩 된 메서드의 값이 나온다)
'Java' 카테고리의 다른 글
제네릭 - 제한된 타입 파라미터/ 와일드카드 (0) | 2024.07.11 |
---|---|
제네릭(Generic) 메소드 (0) | 2024.07.11 |
어노테이션 (0) | 2024.07.10 |
정규표현식 (0) | 2024.07.10 |
래퍼 (wrapper) 클래스 (0) | 2024.07.10 |