본문 바로가기
study_java/자바 공부하기

자바의 제네릭(Generic)

by developer_j 2023. 6. 13.
728x90
반응형

자바의 제네릭 개념은, 다양한 자료형에 대한 재사용 프로그래밍이 가능하게 한다. 다이아몬드 연산자로 읽을 수도 있고, ‘<>’ 형태로 표기한다.

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) 등을 남용하다보면 오류가 발생할 수 있는 가능성이 있다.

728x90
반응형