I. 제네릭 개념 설명
클래스나 메서드를 정의할 때 타입 파라미터(<T> 등)를 사용해서 임시로 타입이 들어갈 것이라고만 정의해두고, 실제 사용할 때 구체적인 타입을 지정하면 해당 클래스나 메서드 내부의 모든 타입 파라미터가 지정된 타입으로 일괄 변환되는 문법입니다.
쉽게 말하면 처음에는 T라는 임시 타입으로 틀만 만들어두고, 실제 사용할 때 String이나 Integer 같은 구체적인 타입을 지정하면,
클래스나 메서드 내부의 모든 T가 지정한 타입으로 자동 변환됩니다.
여기서 타입 파라미터는:
- 임시 지정자(플레이스홀더) 역할
- 클래스/메서드 정의 시점에만 사용
- 실제 사용 시점에서 구체적인 타입(String, Integer 등)으로 변환됨
// 처음에 T로 정의
class Box<T> {
private T item; // T는 임시 타입
public T getItem() { // T는 임시 타입
return item;
}
public void setItem(T item) { // T는 임시 타입
this.item = item;
}
}
// Box<String>으로 객체 생성하면, 모든 T가 String으로 변환됨
Box<String> stringBox = new Box<>();
// 내부적으로 이렇게 변환된 것과 같음:
/*
private String item;
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
*/
// Box<Integer>로 객체 생성하면, 모든 T가 Integer로 변환됨
Box<Integer> intBox = new Box<>();
// 내부적으로 이렇게 변환된 것과 같음:
/*
private Integer item;
public Integer getItem() {
return item;
}
public void setItem(Integer item) {
this.item = item;
}
*/
클릭하여 코드 복사
II. 사용 목적
- 타입 안정성 보장 : 컴파일 타임에 타입을 체크하여 런타임 에러를 방지합니다.
- 코드 재사용성 향상
- 컴파일 시점에서 타입 체크 가능
- 불필요한 타입 캐스팅 제거 : 타입 체크와 형변환을 생략할 수 있게 해줘서 코드가 간결해집니다.
III. 자주하는 실수
- 제네릭 타입 파라미터에 기본 타입(int, boolean 등) 직접 사용
- raw type 사용 (제네릭 타입을 지정하지 않고 사용)
- 배열 생성 시 제네릭 타입 사용 오류
- 와일드카드 사용 시 extends와 super 혼동
IV. 비교
특징 | 제네릭 | Object 사용 |
---|---|---|
타입 안정성 | 높음 | 낮음 |
형변환 필요 | 불필요 | 필요 |
컴파일 시점 체크 | 가능 | 불가능 |
코드 가독성 | 좋음 | 나쁨 |
V. 실무 활용 예시
//제네릭 활용 예시
// 컬렉션 프레임워크
List<String> stringList = new ArrayList<>();
Map<String, Integer> scoreMap = new HashMap<>();
// 커스텀 제네릭 클래스
public class ResponseDTO<T> {
private T data;
private String message;
}
// 제네릭 메서드
public <T> List<T> convertToList(T[] array) {
return Arrays.asList(array);
}
// API 응답 처리
public ResponseEntity<List<UserDTO>> getUsers() {
return ResponseEntity.ok(userList);
}
// DAO/Repository 계층
public interface UserRepository extends JpaRepository<User, Long> {
}
// 유틸리티 클래스
public class Pair<K, V> {
private K key;
private V value;
}
클릭하여 코드 복사
'Java > 자바 학습' 카테고리의 다른 글
자바의 String은 클래스다. (0) | 2025.05.09 |
---|---|
문자 자료형과 메서드 (0) | 2025.05.08 |
자바 컬렉션 프레임워크 (0) | 2025.05.07 |
자바의 예외 처리 (0) | 2025.05.07 |
자바 접근 제어자 (0) | 2025.05.01 |