이번에는 Generic을 정리해 보겠습니다.
Generic이란?
제네릭이란 타입을 파라미터로 사용할 수 있 해주는 기술입니다.
제네릭을 사용하면 데이터 타입을 클래스 내부에서 지정하는 것이 아니라 외부에서 지정할 수 있습니다.
List<Integer> list = new ArrayList<>();
<> 부분이 제네릭입니다. Integer를 입력하여 List의 내부 타입을 Integer로 만듭니다.
ava의 제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있게 해주는 기능입니다.
제네릭을 사용하면 클래스, 메소드에 사용할 내부 데이터 타입을 컴파일 시에 미리 지정할 수 있습니다. 이를 통해 코드의 타입안정성, 재사용성, 가독성을 높일 수 있습니다.
JDK 1.5 이전에는 여러 타입을 사용하는 클래스나 메소드는 Object 타입을 사용했습니다.
하지만 이 경우는 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 했으며 이 때 오류가 발생할 수도 있었습니다.
JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시에 미리 타입이 지정되므로 타입 검사나 타입 변환 같은 번거로운 작업을 생략하고 안정성을 높일 수 있었습니다.
타입 변수
제네릭은 타입 변수를 사용하여 특정 타입 대신 사용되어 제네릭 클래스나 메소드가 다양한 타입의 객체들과 함께 잘 작동할 수 있도록 합니다.
타입 변수들은 꺾쇠 괄호(<,,,>) 안에 위치하며 실제 코드 구현에는 이 타입 변수들이 실제 클래스나 인터페이스 타입으로 대체되어 사용합니다.
타입 변수의 종류
타입 변수에는 주로 T, K, V, E 등이 사용됩니다.
T (Type) : 가장 일반적으로 사용되는 타입 변수로 Type의 약자입니다. T는 어떠한 타입이 될 수 있으며 주로 단일 파라미터를 가진 제네릭 클래스나 메소드에 사용됩니다.
K (key) : Key의 약자입니다. 주로 Map이나 키-값 쌍을 다루는 컬렉션에서 키의 타입을 지정하는데 사용됩니다.
V (Value) : Value의 약자입니다. K와 마찬가지로 Map이나 키-값 쌍을 다루는 컬레션에서 값을 나타내는 타입을 지정하는데 사용됩니다.
E (Element) : Element의 약자입니다. 주로 컬렉션 또는 배열에서 요소의 타입을지정하는데 사용합니다.
사용법
클래스나 인터페이스에 제네릭을 적용할 때는 클래스나 인터페이스 뒤에 <T>와 같이 타입 파라미터를 추가합니다. 여기서 T는 타입 변수로 실제 클래스나 인터페이스를 구현할 때 구체적인 타입으로 대체됩니다.
클래스
public class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
메소드
메소드에 제네릭을 적용할 때 입력 파라미터나 반환 파라미터에 제네릭을 사용할 수 있습니다.
public <T> T genericMethod(T t) {
return t;
}
사용 예시 - 클래스
public class Main {
public static void main(String[] args) {
// Integer 타입을 저장하는 Box 생성
Box<Integer> integerBox = new Box<>();
integerBox.set(123); // Integer 객체 저장
Integer someInteger = integerBox.get(); // 객체 반환
System.out.println(someInteger);
// String 타입을 저장하는 Box 생성
Box<String> stringBox = new Box<>();
stringBox.set("Hello Generic"); // String 객체 저장
String someString = stringBox.get(); // 객체 반환
System.out.println(someString);
}
}
같은 Box 클래스에 Integer, String 두 가지 타입으로 사용할 수 있습니다.
사용시 주의할 점
제네릭을 사용할 때 타입 입력값으로 기본 데이터 타입(primitive type)을 사용할 수 없습니다. 대신 래퍼 클래스(wrapper)를 사용해야 합니다. int 대신 Integer를 사용해야 합니다.
제네릭의 대표적인 예시로는 컬렉션 프레임워크가 있습니다.
ArrayList<T>, LinkedList<T>, HashMap<K,V> 등의 컬렉션 클래스들은 제네릭을 사용해 구현합니다. 이를 통해 컴파일 시점에 타입 안정성을 보장하고 런타입 시에 발생할 ClassCastException을 방지할 수 있습니다.
정리
Generic에 대해 정리해보겠습니다.
제네릭은 타입을 파라미터로 사용할 수 있게 해주는 기능입니다. 제네릭을 사용하면 내부의 데이터 타입을 외부에서 지정할 수 있습니. 이로 인해 타입 안정성과 재사용성을 얻을 수 있습니다.
타입을 지정해주므로 컴파일 시점에 타입 체크를 할 수 있습니다. 이는 런타임 시점에 예외 발생을 최소화시켜 프로그램을 더 안정적으로 만듭니다. 또한 타입 변환 코드가 줄어들어 가독성이 좋아집니다.
제네릭을 사용하면 다양한 데이터 타입을 하나의 클래스나 메소드에 사용할 수 있게 되어 재사용성이 좋아집니다.
마무리
이번에는 Generic에 대해 정리해보았습니다.
감사합니다.
참고 사이트
https://jehuipark.github.io/java/java-generic
https://velog.io/@heetaeheo/자바-제네릭이란