개요
알고리즘 문제를 풀다가 문득 그런 생각이 들었다.
Java에서 new ArrayList<>()와 new ArrayList()의 차이가 무엇일까?
꺽쇠의 역할이 무엇일까?
<>는 뭐지?
아래와 같은 코드가 있다고 해보자.
이때, 제네릭 문법의 의미는 아래와 같다.
즉, new ArrayList<>()는 그냥 new ArrayList<Integer>()인 것이다(앞에서 String으로 선언했으면 <String>임.)
Java에 var 과는 또 다른, 타입 추론 기능이 있었다는 걸 쓰면서도 모르고 있었다.
컴파일러가 컴파일 타임에 <> 안에 추론된 타입을 넣어준다고 이해하면 된다.
그러면 <>를 안쓰면 어떻게 되는거지?
간단하다. Object 타입을 받는 ArrayList가 선언되는 것이다.
물론 컴파일러는 simpleList 변수가 Integer 타입의 List라는 것을 알고 있기 때문에,
simpleList.add(5.0f); 와 같은 코드에서는 컴파일에러를 뱉어준다.
그러면 왜 <>를 빼는 스타일도 가능하게 해놨지?
제네릭이 도입되기 이전과 호환성을 유지하기 위해서라고 한다.
제네릭은 Java 5에 도입되었고, 그 이전의 모든 ArrayList들은 아래처럼 선언되었다고 한다;;
그러나 이런 형태라면, 리스트에서 꺼낸 원소가 무슨 타입인지 개발자가 매번 알고 있어야하고, 실수라도 저지르면 Exception이 터졌다.
그래서 제네릭을 통해서 타입을 제한하고, 컴파일 타임에 체크가 가능해졌다.
아무튼 옛날 코드는 이런 형태였으니, 지금도 사용이 가능하도록 남겨두었다고 이해하면 될 듯 하다.