배움과 기록의 장
[Java] 제네릭 본문
2023.1.4 작성
🔸 제네릭과 제네릭의 장점
-클래스나 메서드의 코드를 작성할 때, 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반해두는 것, 특정 데이터 타입에 얽매이지 않게!
-c++ 할 때 배운 템플릿 같은 거임
-제네릭에 들어가는 타입으로 기본 타입이 아닌 래퍼클래스로 들어간다. int는 기본타입이고, int의 래퍼클래스는 Integer이므로 int가 아닌 Interger로 들어간다.
-래퍼클래스(wrapper class)에 대한 자세한 내용은 검색해보기~ 100을 참조변수로 참조하며 객체의 값으로 받는 느낌?
🔸 제네릭 클래스 정의와 사용
-정의 예시
타입 매개변수는 임의의 문자로 지정
자주 사용하는 타입 매개변수 T:Type, K:Key, V:Value, E:Element, N:Number, R:Result
class Example<T>{
private T item;
public Example(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
-사용 예시
Example<String> ex1 = new Example<String>("Hello");
Example<Integer> ex2 = new Example<Integer>(10);
Example<Double> ex3 = new Example<Double>(3.14);
-클래스 변수 또는 클래스 메서드에는 타입 매개변수를 사용할 수 없음. 인스턴스 별로 클래스변수의 타입이 달라지는 상황이 생기기 때문에
-제한된 제네릭 클래스
특정 클래스를 상속받은 클래스 또는 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한 할 수 있음
class Example<T extends ClassName & InterfaceName> { // 클래스가 인터페이스보다 앞에와야함
private T item;
...
}
🔸 제네릭 메서드 정의 및 활용
-클래스 내부의 특정 메서드만 제네릭으로 선언 가능
class Example {
...
public <T> void add(T element) {
...
}
}
-제네릭 클래스와 달리 제네릭 메서드에서는 static 메서드에서도 선언하여 사용가능
-제네릭 메서드는 메서드가 호출되는 시점에서 제네릭 타입이 결정되어 정의하는 시점엔 타입을 모른다.
따라서 element.length()와 같은 String클래스의 메서드를 사용할 수 없음
모든 자바 클래스의 최상위 클래스인 Object클래스의 메서드는 사용가능함 ex. element.equals(), element.toString()
4.와일드카드란?
- 자바의 제네릭에서 어떠한 타입으로든 대체될 수 있는 타입 파라미터, 기호는 ?
-일반적으로 extends와 super키워드를 조합하여 사용
<? extends T>
<? super T>
-<? extends T> 는 와일드 카드에 상한제한을 두는 것, T와 T를 상속받는 하위 클래스 타입만 타입파라미터로 받을 수 있음
-<? super T> 는 와일드카드에 하한제한을 두는 것, T와 T의 상위클래스만 타입 파라미터로 받을 수 있도록 지정
-잘모르겠음.. 제한된 제네릭 클래스랑 뭔 차이지? 다른 자료도 찾아보면서 공부 더 해봐야할듯
'backend > java' 카테고리의 다른 글
[Java] Stringifyjson (0) | 2025.04.09 |
---|---|
[Java] 예외 처리 (0) | 2025.04.09 |
[Java] Enum (0) | 2025.03.23 |
[Java] 배열의 요소와 값, 배열과 주소값 (0) | 2023.01.12 |