Kim-Baek 개발자 이야기

제네릭이란 무엇일까 본문

개발/java basic

제네릭이란 무엇일까

김백개발자 2024. 11. 12. 13:08

제네릭(Generics)은 자바에서 컴파일 타임에 타입(type)을 검증하고, **코드의 재사용성과 타입 안전성(type safety)**을 높이기 위해 도입된 기능입니다. 제네릭을 사용하면 클래스나 메서드를 여러 타입에 대해 일반화(generalize)하여 작성할 수 있어, 다양한 데이터 타입을 처리하는 코드를 보다 효율적이고 안전하게 작성할 수 있습니다. 이번에는 자바 제네릭에 대해 상세히 설명하겠습니다.

제네릭의 필요성

자바는 **타입 안전성(type safety)**을 보장하기 위해 컴파일 시점에 타입을 확인합니다. 제네릭을 도입하기 이전에는 다양한 타입의 객체를 처리할 때 Object 타입을 사용하거나, 특정 타입으로 캐스팅(casting)하는 방식이 일반적이었습니다. 하지만 이러한 방식은 다음과 같은 문제점을 야기했습니다.

  • 타입 안전성 미보장: 잘못된 타입으로 캐스팅할 경우 런타임 시 ClassCastException이 발생할 수 있습니다.
  • 코드의 중복: 다양한 타입을 처리하기 위해 반복적인 코드 작성이 필요했습니다.
  • 가독성 저하: Object 타입을 사용하면 코드의 의도를 파악하기 어려워집니다.

제네릭은 이러한 문제를 해결하고, 재사용 가능하고 안전한 코드를 작성할 수 있게 도와줍니다.

제네릭의 기본 개념

제네릭은 클래스, 인터페이스, 메서드에 타입 매개변수(type parameter)를 도입하여, 다양한 타입을 처리할 수 있도록 합니다. 타입 매개변수는 주로 대문자 한 글자로 표기되며, 관례적으로 다음과 같은 이름을 사용합니다.

  • E – Element (컬렉션에서의 요소 타입)
  • T – Type (일반적인 타입)
  • K – Key (키)
  • V – Value (값)
  • N – Number (숫자 타입)

제네릭 클래스

제네릭 클래스를 정의하려면 클래스 이름 뒤에 <T>와 같이 타입 매개변수를 명시합니다.

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello Generics");
String message = stringBox.getContent(); // 형변환 불필요

Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer number = integerBox.getContent();

 제네릭의 장점과 단점

장점

  1. 타입 안전성(Type Safety): 컴파일 시점에 타입 검증이 이루어지므로, 런타임 오류를 줄일 수 있습니다.
  2. 코드 재사용성: 동일한 클래스나 메서드를 다양한 타입에 대해 재사용할 수 있어, 코드의 중복을 줄일 수 있습니다.
  3. 가독성 및 유지보수성 향상: 제네릭을 사용하면 코드의 의도가 명확해지고, 타입 관련 버그를 사전에 방지할 수 있습니다.
  4. 자동 형변환: 제네릭을 사용하면 명시적인 형변환(casting)이 필요 없어져, 코드가 간결해집니다.

단점

  1. 런타임 타입 정보 부재: 타입 소거로 인해 런타임에 제네릭 타입 정보를 확인할 수 없어, 일부 기능 제한이 있습니다.
  2. 복잡성 증가: 제네릭의 사용과 관련된 규칙과 개념을 이해하는데 시간이 필요할 수 있습니다.
  3. 호환성 문제: 제네릭과 배열을 함께 사용할 때 발생하는 제약으로 인해, 코드 작성이 복잡해질 수 있습니다.

정리

  • 타입 매개변수: 클래스나 메서드에 타입을 일반화하여 다양한 타입을 처리할 수 있게 함.
  • 제한된 타입 매개변수: 타입 매개변수가 특정 타입을 상속하거나, 인터페이스를 구현하도록 제한.
  • 와일드카드: 유연한 타입 매개변수 처리(?, ? extends T, ? super T).
  • 타입 소거: 컴파일 후 제네릭 타입 정보 제거, 런타임에 제네릭 타입 정보 접근 불가.
  • 실무 활용: 컬렉션 프레임워크와 함께 제네릭을 적극적으로 활용하여 타입 안전성 확보.
반응형
Comments