자바로 코딩을 하다 보면, 가끔 "Raw type을 사용하지 마라"라는 조언을 듣습니다. 실제로 Effective Java에서도 언급합니다.
그렇다면 Raw type은 무엇이고, 왜 사용하지 않는 것이 좋을까요?
Raw type에 대해 알아보려면 우선 Generic type이 무엇인지 알아야합니다.
Generic type 이란?
Generic 이란 generalize(일반화하다)를 변형시킨 단어로 보입니다. 그래서 '데이터의 타입을 일반화하다' 로 뜻을 유추할 수 있습니다.
클래스와 인터페이스, 메서드를 정의할 때 타입을 지정하지 않고 파라미터로 사용할 수 있게 만듭니다.
이해가 안 된다면 아래 예시를 봅시다.
같은 Box 클래스를 사용하고 있지만, String, Integer, Boolean의 다양한 세 가지 타입의 Box 객체를 만들었습니다.
Generic Type을 이용하여 Box 클래스를 만들었기 때문입니다.
위 예제에서 사용된 'T'는 타입 변수라고 하며, 참조형 타입을 의미합니다.
꼭 'T'가 아니라 어떤 문자든지('S', 'K' 등) 사용해도 괜찮지만, 보편적으로 'T'를 씁니다.
여러 개를 쓰고 싶다면, 쉼표(,)로 구분하여 사용할 수 있습니다.
이제 Generic에 대해 알아보았으니, Raw type을 들어가 봅시다.
그렇다면 Raw type 이란?
이해하기 쉽게 사진 1-1의 예시에서 확장해보겠습니다.
위의 사진 1-1 예시와 차이점이 보이시나요?
1-1에서는 타입을 지정해 주었지만, Raw type에서는 타입이 딱히 지정되지 않았습니다.
Raw type은 타입 파라미터가 없는 Generic type을 의미합니다.
타입을 지정하지 않아도 되니 마냥 편리하게만 보이는데, 왜 사용하면 안 된다는 걸까요?
심지어 IntelliJ까지 사용하지 말라고 경고문을 날립니다.
왜 Raw type을 지양해야 할까?
Box 클래스에서 Integer 타입을 받아서, 출력할 때 double 타입으로 변환하고 싶습니다.
그러나 Raw type을 사용하면, String 타입을 받는다 해도 컴파일 상에서 오류가 나타나지 않습니다.
물론, 코드를 실행한다면 ClassCastException 오류가 발생하기는 합니다.
그러나 오류는 가장 빨리 발견하는 것이 좋고, 가능한 컴파일 상에서 발견하여 고쳐야 합니다.
런타임 오류는 오류가 발생하고 한참 뒤에나 발견할 수 있고, 어디서부터 잘못되었는지 코드를 전체적으로 다시 훑어봐야 합니다.
이번엔 타입을 지정하였을 때의 예시입니다. 전과 다르게 이번에는 Integer 타입으로 명시해 주었습니다.
Box 객체에 String 변수를 넣으려 하니, 빨간 줄이 뜨면서 컴파일 오류가 발생하였습니다.
이번에는 발생 즉시 고칠 수 있게 되었습니다.
바쁜 당신을 위한 3줄 요약
- Generic type: 클래스와 인터페이스, 메서드를 정의할 때 타입을 지정하지 않고 파라미터로 사용
- Raw type: 타입 파라미터가 없는 Generic type
- Raw type은 컴파일 단에서 오류를 발생시키지 않으니, 사용을 지양하자.
'Java & Spring Boot' 카테고리의 다른 글
스프링 빈 중복 에러 해결하기 (0) | 2023.03.07 |
---|---|
자원을 반납하자 (부제: try-catch-finally 멈춰!) (0) | 2023.02.26 |
실전, MVC 패턴! (1) | 2022.10.01 |
DTO와 VO의 차이를 알아보자 (0) | 2022.09.18 |
Java Stream과 for문은 무엇이 다를까? (0) | 2022.08.18 |