본문으로 바로가기

제네릭, 그 시작은

category Programing/JAVA 2023. 9. 20. 18:03
반응형

제네릭(Generic)은 Java에서 데이터 타입을 일반화하여 코드를 재사용하고 타입 안전성을 높이기 위한 프로그래밍 기능입니다. 제네릭을 사용하면 컬렉션과 같은 다양한 타입의 객체를 처리할 수 있는 클래스나 메서드를 생성할 수 있습니다.

제네릭의 기본 개념:
1. 타입 안전성(Type Safety):
제네릭을 사용하면 컴파일 시점에 타입 검사를 수행하여 런타임 에러를 방지할 수 있습니다.

2. 타입 파라미터(Type Parameter):
제네릭에서는 꺾쇠 괄호(<>) 안에 타입 파라미터를 사용합니다.
예: ArrayList<T> 여기서 T는 타입 파라미터입니다.

3. 제네릭 클래스와 인터페이스:

클래스나 인터페이스를 정의할 때 타입 파라미터를 추가하여 제네릭화할 수 있습니다.
기본 예제:

// 제네릭 클래스의 예
public class Box<T> {
    private T content;

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }
}

// 사용 예
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello, Java!");
String value = stringBox.getContent();

이 예에서 Box 클래스는 어떤 타입의 content를 담을 수 있습니다. 이를 사용할 때 원하는 타입으로 인스턴스화할 수 있습니다.

제네릭 메서드:
클래스뿐만 아니라 메서드도 제네릭화할 수 있습니다.

public class GenericMethodExample {

    public static <T> void printContent(T content) {
        System.out.println(content);
    }

    public static void main(String[] args) {
        printContent("Hello, World!"); // 출력: Hello, World!
        printContent(123);             // 출력: 123
    }
}

제한된 타입 파라미터(Bounded Type Parameter):
제네릭에서 특정 타입 또는 그 하위 타입만을 허용하고 싶을 때 사용합니다.

public class NumericBox<T extends Number> {
    private T content;

    // 나머지 코드 ...
}

이 예에서 NumericBox는 Number의 서브클래스만 담을 수 있습니다. (Integer, Double 등)

장점:
타입 안전성: 제네릭을 사용하면 컴파일러가 타입 검사를 수행하기 때문에 잘못된 타입 사용 시 오류를 즉시 발견할 수 있습니다.
코드 재사용: 같은 코드를 여러 타입에 대해 사용할 수 있기 때문에 코드의 재사용성이 높아집니다.

제네릭을 사용하면서 주의해야 할 점:
런타임 시 제네릭 정보 소실: Java의 제네릭은 타입 소거(Type Erasure) 때문에 런타임에는 제네릭 정보가 사라집니다. 따라서 List<Integer>와 List<String>은 런타임에 동일한 List 타입으로 취급됩니다.
기본 타입 사용 불가: 제네릭 타입 파라미터로는 기본 타입(int, char, double 등)을 사용할 수 없습니다. 대신 래퍼 클래스(Integer, Character, Double 등)를 사용해야 합니다.

제네릭은 처음에는 복잡해 보일 수 있지만, 익숙해지면 Java 프로그래밍에서 큰 도움이 됩니다. 제네릭을 활용하면 타입 안전성을 높이면서도 유연한 코드를 작성할 수 있습니다.

 

반응형