자바의 제네릭 개념은, 다양한 자료형에 대한 재사용 프로그래밍이 가능하게 한다. 다이아몬드 연산자로 읽을 수도 있고, ‘<>’ 형태로 표기한다.
1. 제네릭 클래스(Generic class)
제네릭 클래스는 자료형을 <T>로 표기한다. 보편적인 제네릭 타입의 매개변수(Type Parameter)에 대한 명명 규칙은 아래와 같다.
표기 알파벳 | 의미 |
E | Element |
K | Key |
N | Number |
T | Type |
V | Value |
사용 예)
int<N> list = new ArrayList<N>();
2. 제네릭 클래스 활용
2-1. 제네릭 클래스 선언부
(접근제어자) class 클래스명<참조자료형> {
...
}
2-2 제네릭 클래스 인스턴스 생성
클래스명<참조자료형> 인스턴스명 = new 생성자<참조자료형(생략가능)>();
사용 예)
//실 사용 예
class Sample<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t){
this.t = t;
}
}
public class Main {
public static void main(String[] args){
Sample<Integer> age = new Sample<Integer>();
Sample<String> name = new Sample<String>();
age.setT(19);
name.setT("빵형");
int personAge = age.getT();
String personName = name.getT();
System.out.println(personAge + ", " + personName);
// 결과 : 19, 빵형
}
}
- java 7에서 추가된 기능
1. java 7 이전
Map<String, String> map = new HashMap<String, String>();
2. java 7
Map<String, String> map = new HashMap<>(); -> 타입을 추론하여 인식한다.
3. var 사용 시
var map = new HashMap<String, String>();
2-3. 제한된 자료형의 제네릭
<T>에 올 수 있는 자료형을 제한할 수 있다.
→ 예1) <T extends Class> 형태로 특정 클래스를 상속받는 자료형만 받도록 정의하는 방법 사용
→ 예2) <T extends Integer> == <C extends Number> : Integer, Double 등의 숫자를 사용하는 자료형들은 Number 클래스를 상속받고 있다.
…생성자에도 제네릭을 선언할 수 있는데 너무 어려워서 PASS😂😂 (이해안됨)
2-4. 복수의 제네릭
제네릭 두개 이상 사용하기! 아래 캡쳐처럼, 2개 이상의 제네릭 클래스를 사용할 수 있다. (콤마로 구분)
3. 제네릭 메서드(Generic Method)
클래스에서 제네릭 타입을 선언하지 않고,
메서드의 반환될 자료형 앞에 다이아몬드 연산자를 넣는 것이 제네릭 메서드.
3.1 제네릭 메서드 활용
[접근제어자] (static) <E> [반환될 자료형] [메서드명] (E e) {
구현체
return 반환될 자료형의 리터럴;
}
인자에 들어가는 자료형에 제네릭 타입이 들어갈 경우, 꼭 반환될 자료형 앞에 제네릭 타입을 선언해줘야 한다.
class Data {
String value;
public <T> void setValue(T t) { // <- 인자에 제네릭타입
this.value = t.toString();
}
public String getValue(){
return this.value;
}
}
4. 제네릭 사용 이유
제네릭에는 참조 자료형만 올 수 있다.
Object도 사용할 수 있는데 왜 제네릭을 사용하는가?
자료형이 다르게 되면 오류도 발생할 수 있는 위험요소가 존재하므로, 한가지 자료형으로만 사용할 수 있는 제네릭 사용을 추천.
Object를 사용하면서 입맛대로 다운캐스팅 (String) 등을 남용하다보면 오류가 발생할 수 있는 가능성이 있다.
'study_java > 자바 공부하기' 카테고리의 다른 글
Java의 클래스와 클래스의 구성요소 (0) | 2023.04.06 |
---|---|
프로그래밍 언어에 대한 간략한 개념들 - [절차지향과 객체지향], [런타임과 컴파일타임], [컴파일 언어와 인터프리터 언어] (0) | 2023.04.06 |
반복문의 continue와 break (0) | 2023.04.06 |
List와 Array 구분 (List형 컬렉션프레임워크와 배열의 구분) (0) | 2023.03.30 |
java 배열의 할당 (0) | 2023.03.30 |