제네릭(Generic)
1. 제네릭(Generic)란?
제네릭은 Java에서 다양한 데이터 타입을 지원하기 위한 강력한 기능 중 하나이다.
클래스, 인터페이스, 메서드 등을 정의할 때 특정한 타입을 미리 지정하지 않고, 사용할 때 동적으로 지정할 수 있다.
이로 인해 코드의 재사용성과 타입 안정성을 높일 수 있습니다.
2. 제네릭 사용 이유
제네릭의 대한 설명을 읽어보면, 제네릭 사용 이유가 딱 보인다. 데이터 타입을 명시하지 않고, 사용이 가능하다는 점이 강점이다.
- 타입 안정성(Type Safety): 컴파일 시간에 타입 오류를 잡아낼 수 있다. 컴파일러가 제네릭을 사용하여 코드의 일관성을 검증하기 때문에 런타임에 발생할 수 있는 에러를 줄일 수 있다.
- 코드 재사용성: 제네릭을 사용하면 여러 종류의 데이터 타입에 대해 동일한 코드를 작성할 수 있다.
※ 예를 들어, 컬렉션 클래스나 알고리즘을 한 번만 작성하고, 다양한 타입의 데이터에 적용할 수 있습니다. - API 유연성: 제네릭을 사용하면 라이브러리나 API를 설계할 때 미리 정해진 타입이 아닌 다양한 타입의 데이터를 다룰 수 있다.
3. 제네릭 선언 방법
public class MyClass<T> {
// 클래스 내용
}
여기서 T는 타입 매개변수(Type Parameter)를 나타낸다.
이는 클래스나 메서드에서 사용할 데이터 타입을 나타내는 일종의 변수라고 생각하면 된다.
T는 여러 다른 글자로 대체할 수 있으며, 보통 아래 표와 같은 관례가 있다.
E | 요소(Element) |
K | 키(Key) |
V | 값(Value) |
N | 숫자(Number) |
T | 일반 타입(Type) |
제네릭을 사용하면 클래스 또는 메서드를 선언할 때 어떤 타입을 사용할지 나중에 지정할 수 있으므로, 더 유연하고 재사용 가능한 코드를 작성할 수 있다.
4. 제네릭 사용 예시
import java.util.HashMap;
public class test<T> {
public static void main(String[] args) {
String test1 = "String"; // 1
int test2 = 42; // 2
HashMap<String, Integer> test3 = new HashMap<>(); // 3
test3.put("Map", 1);
test<String> t1 = new test<>();
test<Integer> t2 = new test<>();
test<HashMap<String, Integer>> t3 = new test<>();
t1.testGeneric(test1);
t2.testGeneric(test2);
t3.testGeneric(test3);
}
public void testGeneric(T t) {
System.out.println(t);
}
}
출력
String
42
{Map=1}
위는 제네릭 사용 예시 코드를 작성한 것이다. 설명하자면, 일단 Test라는 클래스를 만들어주고 <T> 타입 매개변수를 작성해준다. 이 부분이 제네릭에서 가장 중요하다.
(<T>타입 매개변수로 명시해두면 실제 사용될 때 구체적인 타입으로 대체)
그리고 main메서드에서 각각 다른 타입(String, int, HashMap)을 선언해주었다.
testGeneric 메서드는 제네릭 메서드로, 어떤 타입이든 받아들일 수 있다. 매개변수 t를 출력하는 역할을 한다.
main 메서드에서 testGeneric 메서드를 호출할 때, 각각의 인스턴스에 대해 타입이 일치하도록 호출한다.
만약 제네릭이 없었다면?
위 코드 예시에서 제네릭을 사용하지 않고 같은 결과값을 내려면...
public void testString(String s) {
System.out.println(s);
}
public void testInt(int i) {
System.out.println(i);
}
public void testHashMap(HashMap<String, Integer> map) {
System.out.println(map);
}
각각의 데이터 타입에 대한 메서드를 따로 만들어줘야 한다.
그러나 이런 방식은 타입이 늘어날수록 메서드의 수도 증가하게 되어 유지보수가 어려워지기 때문에 상황에 따라 제네릭을 사용해준다면 이런 불편함을 해소하고 코드의 재사용성을 높일 수 있을 것이다.
'Programming > Java' 카테고리의 다른 글
[Java] 스트림(Stream)이란? | 민민의 하드디스크 - 티스토리 (0) | 2024.02.05 |
---|---|
[Java] 스레드(Thread)란? (사용 이유, 사용법) | 민민의 하드디스크 - 티스토리 (0) | 2024.02.04 |
[Java - 자료구조] Map(HashMap, Hashtable, TreeMap)이란? (feat. JSON) | 민민의 하드디스크 - 티스토리 (0) | 2024.02.04 |
[Java - 자료구조] LinkedList와 ArrayList란? | 민민의 하드디스크 - 티스토리 (0) | 2024.02.02 |
[Java] 예외 처리(Exception handling)란? | 민민의 하드디스크 - 티스토리 (1) | 2024.02.01 |