ArrayList <Object> list = new ArrayList <>();
List <Object> list = new ArrayList <>();
2가지 모두 같은 결과를 도출합니다. 하지만 List를 사용해 ArrayList를 생성하는 것은 유연성에서 효과를 볼 수 있습니다.
여기서 Generic(제너릭)에 대한 개념이 나옵니다.
만약에 우리가 어떤 자료구조를 만들어 배포하려고 합니다.
그런데 String 타입도 지원하고 싶고 Integer타입도 지원하고 싶고 많은 타입을 지원하고 싶습니다.
그러면 String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만들 것인가요?
그건 너무 비효율적이게 됩니다. 이러한 문제를 해결하기 위해 우리는 Generic(제너릭)이라는 것을 사용합니다.
Generic은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.
한마디로 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입입니다.
즉, 저런 인스턴스의 형 변환을 통해 내부 디테일과 메모리 함축에서 이점과 성능을 개선시킬 수 있습니다.
데이터의 용도에 따라 빠른 탐색을 위해서 ArrayList를 사용할 때도 있고, 삽입/삭제를 위해 LinkedList를 사용해야 하는 경우도 있습니다.
(유연성의 예)
List <Object> list = new List <>();
List <Object> list = new LinkedList <>();
클래스를 생성할 때 도형 타입으로 생성하게 되면 정사각형이 아닌
다른 직사각형, 삼각형 등 도형 인터페이스를 구현한 클래스에서 사용될 수 있습니다.
하지만 정사각형 클래스로 생성하게 되면 직사각형, 삼각형 등 에서는 사용할 수 없습니다.
도형에 비유하여 풀어보면,
List list = new ArrayList();
-> 도형 list = new 정사각형();
ArrayList list = new ArrayList();
-> 정사각형 list = new 정사각형();
데이터의 삽입이나 삭제가 필요한 상황에서 List로 선언한 인스턴스를 LinkedList로 바꾸게 되면 아무런 문제 없이 LinkedList의 장점을 취할 수 있습니다.