아이템 26. 로(raw) 타입은 사용하지 말라

제네릭은 java5 부터 사용할 수 있음

컬렉션이 담을 수 있는 타입을 컴파일러에 미리 알려줄 수 있다.

그래서 컴파일러는 알아서 형변환 코드를 추가할 수 있게 되고, 엉뚱한 타입의 객체를 넣으려는 시도를 컴파일 과정에서 차단하여 더 안전하고 명확한 프로그램을 만들어 준다.

제네릭

Generic type은 타입을 파라미터로 가지는 클래스(class<T>)와 인터페이스(interface<T>)를 말한다.

이때, Raw type은 타입 파라미터가 없는 제네릭 타입을 의미한다.

raw 타입의 문제점

Raw type : runtime 오류

public class RawTypeTest {

    static class Coin {
        public void cancle(){
            System.out.println("Coin.cancle");
        }
    }

    static class Stamp {

        public void cancle(){
            System.out.println("Stamp.cancle");
        }
    }

    public static void main(String[] args) {
        // stamps는 Stamp 인스턴스만 취급
        Collection stamps = new ArrayList();

        // Stamp만 받고 싶지만, Coin이 들어가도 아무 오류 없이 컴파일되고 실행됨.
        stamps.add(new Stamp());
        stamps.add(new Coin());

        // 조회시 ClassCastException 발생
        for (Iterator i = stamps.iterator(); i.hasNext();) {
            Stamp stamp = (Stamp) i.next();
            stamp.cancle();
        }
    }
}

오류는 가장 빨리 발견하는 것이 좋으며, 즉 가능한 발생 즉시(컴파일) 발견하는 것이 좋음

위의 예제에서는 오류가 발생하고 한참뒤인 런타임에서야 오류를 발견할 수 있음

런타임시 ClassCastException 오류가 발생하게 되면, 해당 오류가 발생한 부분을 찾기 위해 전체 코드를 훑어봐야할 수도 있음

컴파일타임(Compile time)이란? : 개발자에 의해 C, JAVA 등과 같은 개발 언어로 소스코드가 작성되며, 컴파일 과정을 통해 컴퓨터가 인식할 수 있는 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정을 의미

런타임(Run time)이란? : 컴파일 과정을 마친 응용 프로그램이 사용자에 의해서 실행되어지는 '때(time)'를 의미

런타임에러(Run time error)란? : 이미 컴파일이 완료되어 프로그램이 실행중임에도 불구하고, 의도치 않은 예외 상황으로 인하여 프로그램 실행 중에 발생하는 오류 형태를 의미