티스토리 뷰
자바 제네릭(Generic)에 대해 알아보려고 합니다. 자바에서 제네릭은 클래스나 메서드를 다양한 타입에 대해 안전하게 재사용할 수 있도록 해주는 강력한 기능인데요, 이 개념을 이해하면 자바 프로그래밍의 수준을 한층 더 높일 수 있습니다.
지금부터 제네릭의 기본 개념부터 실제 사용 방법까지 차근차근 살펴보겠습니다.
1. 제네릭(Generic)란?
제네릭은 클래스나 메서드를 특정 타입에 제한하지 않고 다양한 데이터 타입을 지원할 수 있게 해줍니다. 예를 들어, 배열이나 리스트 같은 자료 구조를 사용할 때 제네릭을 활용하면, 타입별로 별도의 클래스를 만들지 않아도 되고, 컴파일 시점에서 타입 검사를 통해 안정성을 보장받을 수 있습니다.
제네릭의 기본 구조
제네릭의 기본적인 문법은 타입 매개변수를 사용하는 것인데요, 주로 T
, E
, K
, V
와 같은 대문자로 표현합니다.
public class Box<T> {
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
위 코드에서 Box<T>
는 제네릭 클래스로, T
는 나중에 어떤 타입이 들어올지 미리 결정하지 않고 사용될 타입을 나타냅니다. 이 클래스는 T
타입의 값을 저장하고 반환하는 메서드를 가지고 있습니다.
사용 예시
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println(stringBox.get()); // 출력: Hello
이렇게 제네릭 클래스를 사용할 때 실제로 사용할 타입을 지정해줍니다. 이 경우 T
는 String
타입으로 지정됩니다.
2. 제네릭 메서드란?
제네릭은 클래스뿐만 아니라 메서드에도 적용할 수 있습니다. 메서드의 리턴 타입 앞에 제네릭 타입을 선언하여 다양한 타입을 처리하는 메서드를 만들 수 있습니다.
public class Utility {
public static <T> void printArray(T[] inputArray) {
for (T element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
}
사용 예시
Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};
Utility.printArray(intArray); // 출력: 1 2 3
Utility.printArray(strArray); // 출력: A B C
위 코드에서 printArray
는 배열을 받아서 각 요소를 출력하는 기능을 합니다. T
타입은 메서드를 호출할 때 실제 타입으로 대체됩니다.
3. 제한된 제네릭(Bounded Generics)
가끔은 제네릭 타입이 어떤 특정 클래스의 하위 타입만 받도록 제한하고 싶을 때가 있습니다. 이럴 때 사용하는 것이 바로 제한된 제네릭입니다. 상위 클래스를 상속받은 타입만 사용할 수 있도록 제한할 수 있습니다.
public <T extends Number> void printNumber(T num) {
System.out.println(num);
}
이 메서드는 Number
클래스 또는 그 하위 클래스(Integer
, Double
등)만 사용할 수 있습니다. 다른 타입을 사용하려고 하면 컴파일 오류가 발생합니다.
4. 와일드카드(Wildcards)란?
제네릭에서 와일드카드 ?
는 더 유연하게 제네릭 타입을 지정할 수 있도록 도와줍니다. 와일드카드는 어떤 타입이라도 허용하지만, 구체적인 타입을 명시하지 않는 상황에 유용합니다.
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
이 메서드는 List
타입이지만 구체적인 타입이 명시되지 않은 리스트를 받아서 모든 요소를 출력할 수 있습니다.
5. 제네릭의 장점
- 코드 재사용성: 동일한 코드를 여러 타입에 대해 사용할 수 있어 중복 코드를 줄일 수 있습니다.
- 타입 안전성: 컴파일 시점에 타입을 체크하여 런타임 오류를 방지할 수 있습니다.
- 유연성: 여러 타입을 처리하는 클래스를 쉽게 구현할 수 있습니다.
6. 제네릭의 한계
- 기본 타입 사용 불가: 제네릭은
int
,char
와 같은 기본 데이터 타입을 직접 사용할 수 없습니다. 대신Integer
,Character
등의 래퍼 클래스를 사용해야 합니다. - 타입 소거(Type Erasure): 컴파일 후 제네릭 타입 정보가 소거되므로 런타임에는 제네릭 타입 정보를 알 수 없습니다. 즉,
List<String>
과List<Integer>
는 런타임에는 동일하게 처리됩니다.
이상으로 자바 제네릭에 대한 설명을 마치겠습니다. 제네릭은 자바에서 매우 중요한 개념이므로, 실제 코드를 작성하면서 반복적으로 연습해보시면 더 확실하게 이해하실 수 있을 겁니다.
'프로그래밍 > 자바' 카테고리의 다른 글
Reflections로 알아보는 자바 어노테이션 활용 가이드 (1) | 2025.04.22 |
---|---|
코틀린 코루틴 이해하기 (1) | 2025.03.02 |
코틀린 입문 기초 정리 (2) | 2025.02.27 |
- Total
- Today
- Yesterday
- ai통합
- 스브링부트
- RESTfull
- generated_body()
- Stack Area
- Heap Area
- 카프카 개념
- 스프링부트
- unreal engjin
- 일급 객체
- cqrs
- react.js
- 도커
- 코틀린
- model context protocol
- 자바
- JAVA 프로그래밍
- 코프링
- JVM
- method Area
- vite
- 타입 안전성
- springai
- MCP
- 디자인패턴
- Java
- 언리얼엔진5
- redis
- First-class citizen
- 언리얼엔진
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |