Backend/Java

Java - Generic

chillmyh 2023. 12. 15. 03:24

제네릭(Generic)의 기본 형태는 클래스, 인터페이스, 메서드 등에서 타입 매개변수를 사용하여 일반화된 형태의 코드를 작성하는 것입니다.

 

기본형태 :

public class ClassName<T> {
    // T 타입을 사용하는 멤버 변수, 메서드 등을 선언
}


여기서 `T`는 타입 매개변수로, 어떤 타입이든 사용할 수 있습니다. `T`는 클래스 이름 뒤에 `<T>`와 같이 선언되어야 합니다. 이렇게 선언된 클래스는 인스턴스를 생성할 때 구체적인 타입을 지정할 수 있습니다.

 

제네릭(Generics)은 Java에서 매우 유용하며 주로 다음과 같은 몇 가지 용도로 사용됩니다:

1. 타입 안정성(Type Safety) 보장
제네릭은 컴파일 시간에 타입 안전성을 제공하여 잘못된 타입의 객체가 코드 내부로 들어오는 것을 방지합니다.

// 제네릭을 사용하지 않은 경우
List myList = new ArrayList();
myList.add("문자열");
myList.add(1); // 컴파일 시간에는 오류가 발생하지 않음

String str = (String) myList.get(1); // 실행 시 ClassCastException 발생

// 제네릭을 사용한 경우
List<String> myGenericList = new ArrayList<>();
myGenericList.add("문자열");
myGenericList.add(1); // 컴파일 시간에 오류 발생

String str = myGenericList.get(1); // 컴파일 시에 타입 안정성을 보장하여 오류 방지



2. 컬렉션(Collection)과 데이터 구조 활용
제네릭을 통해 컬렉션 및 데이터 구조를 사용할 때, 특정 타입의 요소만 다룰 수 있도록 지정할 수 있습니다.

Map<String, Integer> myMap = new HashMap<>();
myMap.put("one", 1);
myMap.put("two", 2);

int value = myMap.get("one"); // 형 변환 없이 안전하게 값을 가져올 수 있음

 


3. 재사용성과 일반화(Generics in Algorithms)
제네릭을 사용하여 일반화된 알고리즘을 작성하면 다양한 데이터 유형에 대해 재사용 가능한 코드를 작성할 수 있습니다.

 

Pair 클래스 설명:

public class Pair<T, U> {
    private T first;
    private U second;

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public U getSecond() {
        return second;
    }
}



- `Pair` 클래스는 제네릭 타입 `T`와 `U`를 가지고 있습니다. 이 클래스는 두 개의 제네릭 타입을 가진 쌍(pair)을 나타냅니다.
- `private T first;`와 `private U second;`는 제네릭 타입 `T`와 `U`로 선언된 멤버 변수입니다. `first` 변수는 첫 번째 요소를 저장하고, `second` 변수는 두 번째 요소를 저장합니다.
- `public Pair(T first, U second)`는 `Pair` 클래스의 생성자입니다. 이 생성자는 `first`와 `second` 요소를 받아서 `Pair` 객체를 생성합니다.
- `public T getFirst()`와 `public U getSecond()` 메서드는 각각 `first`와 `second` 요소를 반환합니다.

Pair 클래스의 재사용:

Pair<String, Integer> pair1 = new Pair<>("one", 1);
String first = pair1.getFirst();
Integer second = pair1.getSecond();

Pair<Double, String> pair2 = new Pair<>(3.14, "pi");
Double doubleValue = pair2.getFirst();
String stringValue = pair2.getSecond();



- `Pair<String, Integer> pair1 = new Pair<>("one", 1);`은 `Pair` 클래스를 사용하여 `String`과 `Integer` 타입의 쌍을 생성합니다.
- `pair1.getFirst()`와 `pair1.getSecond()`를 통해 해당 `Pair` 객체의 첫 번째 요소와 두 번째 요소에 접근합니다.
- `Pair<Double, String> pair2 = new Pair<>(3.14, "pi");`는 다른 타입의 쌍을 생성합니다.
- `pair2.getFirst()`와 `pair2.getSecond()`를 사용하여 해당 `Pair` 객체의 요소에 접근합니다.

이렇게 `Pair` 클래스를 사용하면 다양한 데이터 유형의 쌍을 담을 수 있으며, 각 요소에 안전하게 접근할 수 있습니다. 제네릭을 사용하면 재사용 가능한 일반화된 코드를 작성할 수 있어 유연하고 타입 안전성을 보장할 수 있습니다.