26. 로 타입은 사용하지 말라

26. 로 타입은 사용하지 말라

제네릭(Generics)이란?

자바 5(JDK 1.5) 이후 부터 사용가능 타입을 파라미터로 가지는 클래스와 인터페이스 이다

즉, 담을 수 있는 데이터 타입을 미리 지정하는 방법이다

제네릭의 작동 방식

// 모든 타입의 물건을 담을 수 있는 상자 만들기
public class Box<T> {    // T는 타입 파라미터
    private T item;      // T 타입의 아이템을 담을 변수

    public void put(T item) {  // T 타입의 아이템을 넣는 메서드
        this.item = item;
    }

    public T get() {           // T 타입의 아이템을 꺼내는 메서드
        return item;
    }
}

제네릭 사용 예시

제네릭의 중요한 특징

  1. 타입 안정성(Type Safety)

    잘못된 타입의 물건이 들어가지 않도록 컴파일러가 확인해준다

  2. 형변환이 필요 없음 (불필요한 cast 제거)

    제네릭을 사용하면 꺼낼 때 무슨 타입인지 확인하는 과정이 필요 없다

  3. 다양한 타입 문자를 사용

    • <T>: 일반적인 타입을 나타냄 (Type의 첫 글자)

    • <E>: 컬렉션의 요소 타입을 나타냄 (Element의 첫 글자)

    • <K, V>: 키와 값을 나타냄 (Key, Value의 첫 글자)

  4. 예시

로 타입(Raw Type)이란?

제네릭 타입에서 타입 정보를 모두 지워버린 것 -> 어떤 타입의 객체든지 넣을 수 있다

자바 5(JDK 1.5) 이전에는 제네릭이 없었기 때문에, 모든 컬렉션은 로 타입이었다

➔ 타입을 지정하지 않아도 사용가능한거면 오히려 더 좋지 않나? 라고 생각할 수 있음

로 타입의 문제점

  1. 타입 안정성을 잃게 된다

    • 로 타입을 사용하면 어떤 타입의 값이 들어갈지 모른다

    • 꺼낼 때 타입 변환 오류(ClassCastException) 가 발생할 수 있다

  2. 컴파일러가 오류를 잡아주지 못한다

    • 로 타입을 쓰면 컴파일러가 잘못된 데이터 입력을 막아주지 못한다

    • 실행 중에야 오류를 발견할 수 있다 (너무 늦음)

✅ 제네릭을 사용하면?

로 타입 대신 사용할 수 있는 것들

  1. 매개변수화 타입 - List<Object>

    모든 종류의 객체를 담을 수 있지만, 컴파일러에게 그 의도를 명확히 알려준다

  2. 비한정적 와일드카드 타입 - List<?>

    타입 안전성을 유지하면서, 다양한 타입을 받을 수 있다

로 타입 대신 사용할 수 있는 것들

  1. class 리터럴에는 로 타입을 써야 해!

    ✔️ List<String>.class 같은 형태는 사용할 수 없다

  2. instanceof 연산자에서는 로 타입 사용!

    ✔️ 하지만 로 타입을 그대로 쓰면 안 되고, Set<?>로 변환해야 안전하다


🧩 어려웠던 점

로 타입을 쓰면 왜 위험한지 구체적인 이유를 정리하는 과정이 필요했다

💡 느낀 점

제네릭을 사용하면 프로그램이 더 안전하고 명확해진다는 것을 느꼈다

Last updated