본문 바로가기

Study

[JAVA]제네릭이란? 사용 방법, 사용 이유

제네릭

 

제네릭이란?

 

자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다. 

제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

 

한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.

 

 

제네릭을 사용하는 이유

 

보통은 객체<타입> 객체명 = new 객체<타입>();의 방식으로 미리 타입을 지정해준다. 하지만 간혹 여러 타입을 가진 자료구조를 만들 고 싶을 때가 있다. 그럴 때 제네릭을 사용해서 문제를 해결할 수 있다. 

 

 

제네릭의 장점

 

1) 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

2) 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

3) 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

 

 

제네릭 선언 방법
1. 일반적인 경우
접근제한자 class 클래스이름 <사용할 타입>{
}
public class ClassName<T> {
}

2. HashMap의 경우
public class HaspMap<K, V>{
}

 

 

제네릭에서 사용하는 타입
타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

<>에 들어가는 알파벳은 T, E, K.. 등으로 고정된 것이아니라 통상적으로 쓰이는 값 이름이다. 

 

1. 클래스
public class ClassName <T, K> { ... }

2. 인터페이스
public Interface InterfaceName <T, K> { ... }

*제네릭 타입을 두 개로 둘 수도 있다. 
*해쉬맵은 일반적으로 key와 value값 두개를 지정하기 때문에 저렇게 쓴 것. 

3. 해쉬맵(key, value)
public class HashMap <K, V> { ... }

 

 

제네릭 사용 방법
//제네릭 클래스
public class Test<E, T> {
	
	private E test1;	// 제네릭 타입 변수
	private T test2;	// 제네릭 타입 변수
	
	void set(E test1, T test2) {	// 제네릭 파라미터 메소드
		this.test1 = test1;
		this.test2 = test2;
	}
	
	E getTest1() {
		return test1;
	}
	
	T getTest2() {
		return test2;
	}
	
}
package com.kh.test;

public class ccc {
	public static void main(String[] args) {
		
		Test<String, Integer> a = new Test<String, Integer>();
		
		a.set("테스트중입니다", 10);
	
		System.out.println("a data : " + a.getTest1());
		System.out.println("a data : " + a.getTest2());
		// 반환된 변수의 타입 출력 
		System.out.println("a E Type : " + a.getTest1().getClass().getName());
		System.out.println("a E Type : " + a.getTest2().getClass().getName());
		
	}
}

 

 

주의사항

1) <>안에 명시할 수 있는 것은 참조 타입만 가능하다.

즉, int, double, char 등과 같은 원시타입(primitive type)은 사용할 수 없다. Wrapper Type으로 바꿔줘야 한다. 

 

int -> Inteager

double -> Double

char -> Character

 

2) 사용자가 정의한 클래스 타입으로도 <>안에 명시할 수 있다.

public class ClassName <T> { ... }
 
public class Menu { ... }
 
public class Main {
	public static void main(String[] args) {
		ClassName<Menu> a = new ClassName<Student>();
	}
}

 

 

References

https://st-lab.tistory.com/153

 

자바 [JAVA] - 제네릭(Generic)의 이해

정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고

st-lab.tistory.com

https://hoony-devblog.tistory.com/12

 

[Java] 제네릭(Generic) 타입을 쓰는 이유

 * 제네릭(Generic) 타입 Java에서 제네릭 타입을 사용할 경우 컴파일 과정에서 타입체크를 할 수 있습니다. 클래스와 메소드를 선언할때 파라미터로 선언할 수 있습니다.  * 왜 제네릭 타입을 쓸까

hoony-devblog.tistory.com