개발 공부/[java]

List와 ArrayList

죽밥죽밥화이팅 2024. 8. 13. 14:02

ArrayList와 List는 Java에서 자주 사용되는 컬렉션이다.

하지만 ArrayList와 List를 각각 언제 어디서 어떻게 사용하는 것이 적합한지, 그 차이는 무엇인지 궁금해져서 찾아보게 되었다.

 

List 인터페이스

List는 순서가 있는 요소의 컬렉션을 나타내며, 중복을 허용하는 Java의 인터페이스이다.

Java에서는 List 인터페이스를 구현한 다양한 클래스가 존재하며, 그 중 대표적인 것이 ArrayList인 것이다.

List 인터페이스를 사용함으로써, 다양한 리스트 구현체를 유연하게 사용할 수 있게 된다.

즉, List 타입을 사용하면, 이후에 필요에 따라 다른 리스트 구현체(LinkedList, Vector 등)로 쉽게 전환이 가능해진다. 

 

List<Integer> myList = new ArrayList<>();

 

위와 같이 선언된 myList는 ArrayList 구현체를 참조하고 있지만, 필요시 아래와 같이 LinkedList로 변경할 수 있다.

List<Integer> myList = new LinkedList<>();

 

 

 

ArrayList 클래스

ArrayList는 List 인터페이스를 구현한 구체적인 클래스이다.

ArrayList는 내부적으로 배열을 사용하여 요소를 관리하므로, 인덱스를 통한 빠른 접근이 가능하지만,

요소를 추가하거나 제거하는 작업에는 비교적 높은 비용이 소요될 수 있다.

따라서, ArrayList는 리스트의 내용을 자주 수정하지 않고, 인덱스를 통해 요소에 빠르게 접근해야 할 때 적합한 선택이라고 한다.

ArrayList<Integer> myList = new ArrayList<>();

 

위와 같이 선언된 myList는 ArrayList의 구체적인 구현체를 참조하고 있다.

그러나, 이 경우 리스트의 구현체를 변경하려면 코드 전체에서 ArrayList를 다른 구현체로 직접 수정이 필요하다.

 

 

차이점

  • 유연성: List를 사용하면 다양한 리스트 구현체로 전환할 수 있는 유연성을 제공하지만, ArrayList는 특정 구현체를 직접 사용하는 것이므로 유연성이 상대적으로 떨어짐
  • 구체적 구현: ArrayList는 특정 구현체이므로, 이를 직접 사용할 경우 해당 구현체의 성능 특성을 잘 이해하고 있어야 함. 예를 들어, ArrayList는 대량의 데이터를 삽입하거나 삭제할 때 성능 저하가 발생할 수 있음.
  • 타입 안정성: List는 인터페이스이기 때문에, 다른 구현체로의 변경이 용이. 반면에, ArrayList는 고정된 구현체이므로 변경 시 코드 수정이 필요.

 

  • 리스트의 구현체를 나중에 변경할 가능성이 있거나, 다양한 리스트 타입을 다루어야 하는 상황에서는 List 를 사용하는 것이 좋음
  • 구현체를 고정할 수 있고, ArrayList의 성능 특성이 요구에 부합하는 경우에는 ArrayList를 사용하는 것이 적합

 

따라서, 대부분의 경우 유연성을 위해 List 인터페이스를 사용하여 변수를 선언하고, 필요에 따라 적절한 구현체(ArrayList, LinkedList 등)를 선택하는 것이 베스트인 셈이다.