1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉 관리가 편하다.
3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
보통 제네릭은 아래 표의 타입들이 많이 쓰인다.
타입 | 설명 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
Type은 여러가지가 될 수가 있음.
String, Integer, arrayList 등
# 단일 제네릭 클래스
// 제네릭 클래스
class ClassName<E> {
private E element; // 제네릭 타입 변수
void set(E element) { // 제네릭 파라미터 메소드
this.element = element;
}
E get() { // 제네릭 타입 반환 메소드
return element;
}
}
class Main {
public static void main(String[] args) {
ClassName<String> a = new ClassName<String>();
ClassName<Integer> b = new ClassName<Integer>();
a.set("10");
b.set(10);
System.out.println("a data : " + a.get());
// 반환된 변수의 타입 출력
System.out.println("a E Type : " + a.get().getClass().getName());
System.out.println();
System.out.println("b data : " + b.get());
// 반환된 변수의 타입 출력
System.out.println("b E Type : " + b.get().getClass().getName());
}
}
보면 ClassName이란 객체를 생성할 때 <> 안에 타입 파라미터(Type parameter)를 지정한다.
그러면 a객체의 ClassName의 E 제네릭 타입은 String으로 모두 변환된다.
반대로 b객체의 ClassName의 E 제네릭 타입은 Integer으로 모두 변환된다.
실제로 위 코드를 실행시키면 다음과 같이 출력된다.
# 만약 제네릭을 두 개 쓰고 싶다면 이렇게 할 수도 있다.
// 제네릭 클래스
class ClassName<K, V> {
private K first; // K 타입(제네릭)
private V second; // V 타입(제네릭)
void set(K first, V second) {
this.first = first;
this.second = second;
}
K getFirst() {
return first;
}
V getSecond() {
return second;
}
}
// 메인 클래스
class Main {
public static void main(String[] args) {
ClassName<String, Integer> a = new ClassName<String, Integer>();
a.set("10", 10);
System.out.println(" fisrt data : " + a.getFirst());
// 반환된 변수의 타입 출력
System.out.println(" K Type : " + a.getFirst().getClass().getName());
System.out.println(" second data : " + a.getSecond());
// 반환된 변수의 타입 출력
System.out.println(" V Type : " + a.getSecond().getClass().getName());
}
}
결과
이렇게 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것. 이 것이 바로 제네릭 프로그래밍이다.
위 과정까지는 클래스 이름 옆에 예로들어 <E>라는 제네릭타입을 붙여 해당 클래스 내에서 사용할 수 있는
E 타입으로 일반화를 했다.
그러나 그 외에 별도로 메소드에 한정한 제네릭도 사용할 수 있다.
# 제네릭 메소드
public <T> T genericMethod(T o) { // 제네릭 메소드
...
}
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
// 텍스트
}
클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다.
위에서 다룬 제네릭 클래스에서 활용해보도록 하자.
제네릭 타입 T / T / 메소드명(제네릭타입, 파라미터)
public <T extends Object> T parseJSONObject(HashMap<String, String> resultSet, String name, Class<T> type)
으로 사용할 수 도 있음.
출처 : https://st-lab.tistory.com/153
자바 [JAVA] - 제네릭(Generic)의 이해
정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고
st-lab.tistory.com
'개발 > JAVA' 카테고리의 다른 글
[Mybatis] useGeneratedKeys="true" , keyProperty= "keyId" (0) | 2022.12.01 |
---|---|
Java 변수 타입 확인 log 이용 (0) | 2022.11.29 |
Java 대용량 데이터 DB 처리 방법, batch (0) | 2022.11.24 |
NestedConvertHelper helper에서 값 안받아와져서 변경 해준것. (0) | 2022.11.14 |
return 필요 없으면 void로 하기 (0) | 2022.11.14 |