
자바 중급 문법 – 제네릭 – 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
는 타입 파라미터입니다. 이렇게 선언된 T
는 ArrayList<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>>
는 제네릭 타입 파라미터에 대한 제약 조건을 나타냅니다. 이를 통해 T
는 Comparable
인터페이스를 구현한 타입만 사용할 수 있습니다. 따라서 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
클래스의 제네릭 메서드를 사용하여 정수형 배열에서 최솟값을 찾아 출력하였습니다.
주의해야 할 점
제네릭을 사용할 때 주의해야 할 몇 가지 점이 있습니다.
- 제네릭 클래스나 메서드에서 타입 파라미터로 기본 타입(primitive type)을 사용할 수 없습니다. 대신 기본 타입의 래퍼 클래스를 사용해야 합니다.
- 제네릭 타입은 컴파일 시에 타입 체크를 수행하므로, 타입 안정성을 보장합니다. 따라서 컴파일 경고를 최대한 없애도록 노력해야 합니다.
- 제네릭을 사용하면 코드의 가독성이 향상되고 타입 변환을 줄일 수 있지만, 잘못 사용하면 코드 복잡성이 증가할 수 있습니다. 따라서 적절하게 사용해야 합니다.
이상으로 제네릭 클래스와 제네릭 메서드에 대해 알아보았습니다. 제네릭은 자바에서 강력한 기능 중 하나이며, 다양한 타입에 대해 유연하게 코드를 작성할 수 있도록 도와줍니다. 자바 중급 문법을 공부하는 여러분들에게 유용한 도구가 될 것입니다. 활용해보시고 즐거운 자바 프로그래밍 되시기 바랍니다!
주의해야 할 점:
- 제네릭 클래스나 메서드에서 기본 타입을 사용할 수 없으므로 래퍼 클래스를 사용해야 합니다.
- 컴파일 시에 타입 체크가 이루어지므로 타입 안정성을 유지하고 컴파일 경고를 최소화해야 합니다.
- 제네릭을 적절하게 사용하여 가독성을 높이고 코드를 단순화해야 합니다.
이상으로 자바 중급 문법의 제네릭에 대한 소개였습니다. 자바 공부를 열심히 하시는 여러분들께 도움이 되었길 바랍니다. 다음 시간에는 더 다양한 자바 중급 문법을 알아보도록 하겠습니다. 감사합니다!