자바 기본 문법 – 예외 처리 – 4 – 사용자 정의 예외 클래스

자바 기본 문법 - 예외 처리 - 4 - 사용자 정의 예외 클래스
자바 기본 문법 – 예외 처리 – 4 – 사용자 정의 예외 클래스

자바 중급 문법 – 제네릭 – 1 – 제네릭 클래스와 제네릭 메서드

안녕하세요! 자바 중급 문법에 대한 제네릭에 관해 이야기해보도록 하겠습니다. 제네릭은 자바에서 많이 사용되는 기능 중 하나로, 클래스나 메서드에서 사용할 수 있는 타입 매개변수입니다. 이를 통해 자바 코드의 재사용성과 유연성을 높일 수 있습니다.

제네릭이란?

제네릭은 자바에서 클래스나 메서드를 정의할 때, 일반적인 타입 대신 실제 사용될 타입을 나중에 지정할 수 있도록 하는 기능입니다. 이를 통해 여러 종류의 타입에 대해 동일한 코드를 작성할 수 있으며, 타입의 안정성을 보장할 수 있습니다.

제네릭 클래스

제네릭 클래스는 클래스 내부에서 사용되는 타입을 파라미터로 받는 클래스입니다. 제네릭 클래스는 클래스 이름 뒤에 <T>와 같은 형식으로 타입 파라미터를 선언합니다. 여기서 T는 타입 파라미터의 이름으로, 관례적으로 많이 사용됩니다. 이렇게 선언된 타입 파라미터는 클래스 내부에서 변수, 메서드의 매개변수, 반환 타입 등에 사용될 수 있습니다.

예를 들어, 제네릭 클래스로 스택(Stack)을 구현해보겠습니다. 스택은 후입선출(LIFO, Last-In-First-Out)의 자료구조로, 가장 최근에 추가된 데이터가 가장 먼저 꺼내지는 구조입니다. 제네릭을 사용하여 스택을 구현하면, 어떤 타입의 데이터도 저장하고 꺼낼 수 있습니다.

public class Stack<T> {
    private ArrayList<T> elements;

    public Stack() {
        elements = new ArrayList<T>();
    }

    public void push(T item) {
        elements.add(item);
    }

    public T pop() {
        if (elements.isEmpty()) {
            throw new EmptyStackException();
        }
        return elements.remove(elements.size() - 1);
    }
}

위 코드에서 Stack<T>에서 T는 타입 파라미터입니다. 이렇게 선언된 TArrayList<T>의 타입이나 push 메서드의 매개변수 타입으로 사용되어 다양한 타입의 스택을 생성할 수 있게 됩니다.

제네릭 메서드

제네릭 메서드는 메서드 내부에서 사용되는 타입을 파라미터로 받는 메서드입니다. 제네릭 메서드는 반환 타입 앞에 <T>와 같은 형식으로 타입 파라미터를 선언합니다. 이렇게 선언된 타입 파라미터는 메서드 내부에서 변수, 매개변수 등에 사용될 수 있습니다.

제네릭 메서드를 이해하기 위해, 배열에서 최솟값을 찾는 메서드를 구현해보겠습니다. 이때, 제네릭 메서드를 사용하여 다양한 타입의 배열에서 최솟값을 찾을 수 있도록 만들어보겠습니다.

public class ArrayUtils {
    public static <T extends Comparable<T>> T findMin(T[] array) {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException("배열이 유효하지 않습니다.");
        }

        T min = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i].compareTo(min) < 0) {
                min = array[i];
            }
        }

        return min;
    }
}

위 코드에서 findMin 메서드에서 <T extends Comparable<T>>는 제네릭 타입 파라미터에 대한 제약 조건을 나타냅니다. 이를 통해 TComparable 인터페이스를 구현한 타입만 사용할 수 있습니다. 따라서 compareTo 메서드를 사용하여 최솟값을 비교할 수 있습니다.

제네릭 사용 예시

이제 제네릭 클래스와 제네릭 메서드를 사용하는 예시를 살펴보겠습니다. 아래 예시는 Stack 클래스와 ArrayUtils 클래스를 활용하여 문자열과 정수형 배열에 대한 동작을 수행하는 코드입니다.

public class Main {
    public static void main(String[] args) {
        // 제네릭 클래스 사용 예시
        Stack<String> stringStack = new Stack<>();
        stringStack.push("Java");
        stringStack.push("Programming");
        String topString = stringStack.pop();
        System.out.println("맨 위 문자열: " + topString);

        // 제네릭 메서드 사용 예시
        Integer[] numbers = { 3, 1, 4, 1, 5, 9, 2, 6 };
        Integer minNumber = ArrayUtils.findMin(numbers);
        System.out.println("가장 작은 숫자: " + minNumber);
    }
}

위 예시에서는 Stack 클래스를 활용하여 문자열을 저장하고 꺼내어 출력하였으며, ArrayUtils 클래스의 제네릭 메서드를 사용하여 정수형 배열에서 최솟값을 찾아 출력하였습니다.

주의해야 할 점

제네릭을 사용할 때 주의해야 할 몇 가지 점이 있습니다.

  1. 제네릭 클래스나 메서드에서 타입 파라미터로 기본 타입(primitive type)을 사용할 수 없습니다. 대신 기본 타입의 래퍼 클래스를 사용해야 합니다.
  2. 제네릭 타입은 컴파일 시에 타입 체크를 수행하므로, 타입 안정성을 보장합니다. 따라서 컴파일 경고를 최대한 없애도록 노력해야 합니다.
  3. 제네릭을 사용하면 코드의 가독성이 향상되고 타입 변환을 줄일 수 있지만, 잘못 사용하면 코드 복잡성이 증가할 수 있습니다. 따라서 적절하게 사용해야 합니다.

이상으로 제네릭 클래스와 제네릭 메서드에 대해 알아보았습니다. 제네릭은 자바에서 강력한 기능 중 하나이며, 다양한 타입에 대해 유연하게 코드를 작성할 수 있도록 도와줍니다. 자바 중급 문법을 공부하는 여러분들에게 유용한 도구가 될 것입니다. 활용해보시고 즐거운 자바 프로그래밍 되시기 바랍니다!

주의해야 할 점:

  1. 제네릭 클래스나 메서드에서 기본 타입을 사용할 수 없으므로 래퍼 클래스를 사용해야 합니다.
  2. 컴파일 시에 타입 체크가 이루어지므로 타입 안정성을 유지하고 컴파일 경고를 최소화해야 합니다.
  3. 제네릭을 적절하게 사용하여 가독성을 높이고 코드를 단순화해야 합니다.

이상으로 자바 중급 문법의 제네릭에 대한 소개였습니다. 자바 공부를 열심히 하시는 여러분들께 도움이 되었길 바랍니다. 다음 시간에는 더 다양한 자바 중급 문법을 알아보도록 하겠습니다. 감사합니다!

답글 남기기