본문 바로가기

Java

Java 제네릭

제네릭의 주요 개념

  1. 제네릭 클래스(Generic Class): 제네릭 클래스를 정의하면 클래스의 인스턴스를 생성할 때 구체적인 타입을 지정할 수 있습니다.
    public class Box<T> {
        private T item;
    
        public void setItem(T item) {
            this.item = item;
        }
    
        public T getItem() {
            return item;
        }
    }
    여기서 T는 타입 매개변수(Type Parameter)로, Box 클래스가 사용될 때 구체적인 타입으로 대체됩니다.
     
  2. 제네릭 메소드(Generic Method): 제네릭 메소드는 메소드의 선언에 타입 매개변수를 사용하여 다양한 타입을 처리할 수 있습니다.
    public <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }

    여기서 <T>는 메소드의 타입 매개변수로, printArray 메소드가 호출될 때 구체적인 타입으로 대체됩니다.

  3. 제네릭 인터페이스(Generic Interface): 인터페이스에도 제네릭을 사용할 수 있습니다.
    public interface Comparable<T> {
        int compareTo(T o);
    }
  4. 제네릭 타입 제한(Bounded Type Parameters): 제네릭 타입 매개변수에 상한(upper bound)을 지정하여 특정 타입이나 그 하위 타입으로 제한할 수 있습니다.
    public <T extends Number> void printNumber(T number) {
        System.out.println(number);
    }

    여기서 T extends Number는 T가 Number 타입이거나 그 하위 클래스임을 나타냅니다.

 

 

제네릭의 장점

  • 타입 안전성(Type Safety): 컴파일 시 타입을 체크하여 런타임 오류를 방지합니다.
  • 코드 재사용성(Code Reusability): 다양한 타입을 처리할 수 있는 일반화된 코드를 작성할 수 있습니다.
  • 명확성: 코드의 가독성과 명확성이 증가합니다. 어떤 타입이 사용되는지 명확하게 알 수 있습니다.

제네릭의 한계

  • 기본 타입 사용 불가: 제네릭은 참조 타입(Reference Type)만 사용할 수 있으며, 기본 타입(Primitive Type)은 사용할 수 없습니다. 예를 들어, int 대신 Integer를 사용해야 합니다.
  • 타입 소거(Type Erasure): 제네릭 타입 정보는 컴파일 시 제거되어 런타임에는 알 수 없습니다. 이는 역직렬화나 리플렉션을 사용할 때 제약이 될 수 있습니다.
  • 정적 멤버에서 사용 제한: 제네릭 타입 매개변수는 정적 컨텍스트에서 사용할 수 없습니다. 정적 변수나 메소드는 제네릭 타입 매개변수를 사용할 수 없습니다.

예제

아래는 제네릭 클래스와 메소드를 사용하는 예제입니다.

 
public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.setItem("Hello World");
        System.out.println(stringBox.getItem());

        Box<Integer> integerBox = new Box<>();
        integerBox.setItem(123);
        System.out.println(integerBox.getItem());

        Integer[] integers = {1, 2, 3, 4, 5};
        printArray(integers);

        String[] strings = {"one", "two", "three"};
        printArray(strings);
    }

    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

 

이 예제에서 Box 클래스는 제네릭 클래스로, String과 Integer 타입을 각각 지정하여 사용할 수 있습니다. 또한, printArray 제네릭 메소드는 배열의 요소를 출력할 수 있습니다.

'Java' 카테고리의 다른 글

알고리즘 코딩테스트( 시간 복잡도 ~ 구간 합 )  (0) 2024.08.16
Java 람다 표현식  (0) 2024.07.31
Java Stream(스트림)  (0) 2024.07.30
Java 배열  (0) 2024.07.23
Java 반복문 for, while, do-while  (0) 2024.07.23