이번에 코드를 작성하면서 List, Set 뒤에 제네릭 타입이 명시되지 않은 코드를 보았다. 익숙하지 않은 형태였지만 우선 작성했는데, 컴파일 오류 없이 잘 작동되었다. 그런데 SonarLint에서는 바람직하지 못하니 타입을 명기하라고 하였다. 그 이유는 무엇일지 궁금하였는데 마침 그룹원 중 Tany가 질문해서 찾아보게 되었다.
위 링크를 찾아보니, 타입을 명기하지 않는 경우 다음과 같은 경우가 발생할 수 있다.
public class UseClass {
public void exceptionExample() {
List test = new ArrayList<>();
test.add("a");
test.add("b");
test.add("c");
int a = (Integer) test.get(0) / 1;
}
}
위 코드를 보면 List의 타입이 명기되지 않은 raw type을 사용하고 있어서 List에 담겨있는 string을 Integer로 형변환하여 1로 나누려고 하니 실행하면 에러가 뜬다. 하지만 문제는 실행하기 전까지는 이를 눈치챌 방법이 없다는 것이다.
public void example() {
List<String> test = new ArrayList<>();
test.add("a");
test.add("b");
test.add("c");
int a = (Integer) test.get(0) / 1;
}
이를 이런식으로 List에 담길 타입을 명시적으로 표현해주면, 컴파일러가 이를 감지하고 Integer로 형변환 하는 부분에 빨간 줄이 생기면서 컴파일 에러를 띄워주게 된다.
추가적으로, 이펙티브 자바에도 제네릭에 대한 섹션이 있고, 맨 첫 챕터가 raw type을 사용하지 말라고 되어있다. 시간을 내서 제네릭 문법, 그리고 이펙티브 자바를 통해 어떻게 활용하면 좋을지 학습해야겠다.