JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Java/자바 학습

자바 제네릭

lamarcK 2025. 5. 7. 14:42

제네릭 개념 설명

클래스나 메서드를 정의할 때 타입 파라미터(<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;
    }
*/

사용 목적

  • 타입 안정성 보장 : 컴파일 타임에 타입을 체크하여 런타임 에러를 방지합니다.
  • 코드 재사용성 향상
  • 컴파일 시점에서 타입 체크 가능
  • 불필요한 타입 캐스팅 제거 : 타입 체크와 형변환을 생략할 수 있게 해줘서 코드가 간결해집니다.

자주하는 실수

  • 제네릭 타입 파라미터에 기본 타입(int, boolean 등) 직접 사용
  • raw type 사용 (제네릭 타입을 지정하지 않고 사용)
  • 배열 생성 시 제네릭 타입 사용 오류
  • 와일드카드 사용 시 extends와 super 혼동

비교

특징 제네릭 Object 사용
타입 안정성 높음 낮음
형변환 필요 불필요 필요
컴파일 시점 체크 가능 불가능
코드 가독성 좋음 나쁨

실무 활용 예시

//제네릭 활용 예시
// 컬렉션 프레임워크
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