자바에서 제네릭은 클래스, 인터페이스, 메소드에서 사용할 데이터 타입을 코드 작성 시점이 아닌, 실제 사용할 때 지정할 수 있도록 해주는 기능입니다. -> 타입을 변수처럼 다루는 기능
예전에 다운 캐스팅과 업캐스팅을 공부할 때 캐스팅 개념이 너무 어려웠는데, 제네릭을 사용하면 이러한 명시적인 형변환(casting)을 하지 않아도 되기 때문에 훨씬 편리합니다.
캐스팅(casting)은 한 타입을 다른 타입으로 변환하는 과정입니다.
예를 들어, Object 타입을 String 타입으로 변환하려면 명시적으로 캐스팅을 해야 합니다.
제네릭은 타입을 미리 지정해주는 기능이기 때문에, 컴파일 시점에 타입을 결정할 수 있습니다. 그래서 캐스팅을 하지 않아도 되며 타입 안전성을 보장해줄 수 있습니다.
예를 들어 List<Object>처럼 Object로 처리하게 되면 데이터를 꺼낼 때마다 (String)과 같은 형변환이 필요하지만,
List<String>과 같이 제네릭을 사용하면 형변환 없이도 타입이 자동으로 보장되므로 코드가 더 안전하고 깔끔해집니다.
또한, 제네릭은 컴파일 시점에 타입 오류를 미리 확인할 수 있도록 도와주기 때문에 런타임 오류를 방지하는 데에도 큰 장점이 있습니다.
예제를 보여드리겠습니다.

MessageBox라는 클래스는 제네릭을 사용하고 있습니다. 이 클래스에서는 <T>를 사용하여 타입 파라미터를 선언하고,
getter와 setter 메소드를 구현합니다.

메인 클래스에서는 제네릭 부분이 T가 아닌 String으로 바뀌어 있습니다.
그 이유는 제네릭을 사용했기 때문입니다. (보통 제네릭 타입 파라미터는 T로 정하는 것이 일반적입니다.)
제네릭을 사용하면, T와 같은 타입 파라미터를 선언하고, 이를 객체 생성 시점에 원하는 타입으로 지정할 수 있습니다.
예를 들어, MessageBox<String>으로 선언하면, T는 String으로 대체되어 "Hello Generics"라는 문자열을 setMessage 메소드를 통해 설정할 수 있습니다.
또한, msg라는 String 변수를 선언하여, setMessage로 설정한 "Hello Generics" 문자열을 그 변수로 사용할 수 있습니다.
그렇다면 제네릭을 왜 사용할까?
1. 타입 안정성 확보
제네릭을 사용하지 않으면, 모든 타입을 Object로 처리해야 하므로 형변환(캐스팅)을 자주 하게 됩니다. 이 과정에서 타입 오류가 발생할 가능성이 있습니다. 제네릭을 사용하면 컴파일 시점에 타입을 체크하기 때문에 타입 안전성이 보장됩니다.
2. 코드 재사용성 증대
제네릭을 사용하면 하나의 클래스, 메소드를 다양한 타입에 대해 재사용할 수 있습니다. 제네릭을 통해 타입을 매개변수처럼 사용할 수 있어, 같은 클래스를 다양한 데이터 타입에 대해 사용할 수 있습니다.
3. 컴파일 타임에 오류 검출
제네릭은 컴파일 타임에 타입을 체크합니다. 그래서 잘못된 타입을 사용할 경우 컴파일 시점에서 오류가 발생합니다. 이를 통해 런타임 오류를 줄일 수 있습니다.
4. 더 깔끔하고 간결한 코드 작성
제네릭을 사용하면 타입을 명시적으로 정의할 수 있어, 캐스팅을 하지 않아도 되고 불필요한 중복 코드를 줄일 수 있습니다. 또한, 제네릭은 타입 정보를 클래스 외부에서 지정할 수 있기 때문에 코드가 더 간결하고 명확해집니다.
'JAVA' 카테고리의 다른 글
| [Java] Java 에서는 객체 복제를 어떻게 할까? (0) | 2025.04.26 |
|---|---|
| [Java] Jave 의 컬렉션 프레임워크는 무엇일까? (2) | 2025.04.23 |
| [Java] 인터페이스를 사용하는 이유는 무엇일까? (0) | 2025.04.21 |
| [Java] GC(가비지 컬렉션)이란? (1) | 2025.04.21 |
| [Java] Java 의 주요 특징 (2) | 2025.04.17 |