[JAVA] List-ArrayList, LinkedList

ListList 컬렉션은 데이터를 저장할 경우 인덱스 순으로 데이터가 저장됩니다.List 인터페이스를 실현하는 클래스에는, 대표적으로 ArrayList<E>와 LinkedList<E>가 있습니다.이 두 가지는 기능적으로는 동일하지만 데이터를 저장하는 방법에 차이가 있습니다.그리고 여기서 말하는 데이터는 인스턴스(객체)를 말합니다.먼저 이 두 가지 공통점은 데이터의 저장 순서를 유지하는 것입니다.둘 다 List 인터페이스를 구현하기 때문입니다.두 번째 공통점은 둘 다 동일한 인스턴스의 중복 저장을 허용합니다.그럼 각각 데이터를 저장하는 방법은 어떤 면에서 차이가 있을까요?ArrayList는 배열 기반의 자료 구조입니다. 따라서 배열을 이용하여 데이터를 저장합니다.LinkedList는 목록 기반의 자료 구조입니다. 따라서 목록을 구성하여 데이터를 저장합니다.

그럼 먼저 List 인터페이스의 메소드 종류에 대해 알아보겠습니다.메서드 내용 add(Ee) 데이터 추가 set(intindex,Ee) 해당 인덱스에 입력된 데이터에서 대체 get(intindex) 해당 인덱스의 데이터 리턴 is Empty() 데이터의 유무 리턴 size() 저장된 데이터의 수 리턴 remove(Objecto) 해당 데이터 삭제 자주 사용되는 List 인터페이스의 메서드에 대해 간략히 살펴보았습니다.그러면 ArrayList부터 알아보겠습니다.

ArrayListArrayList는 List 인터페이스를 구현한 클래스입니다.데이터를 저장할 경우 실제로는 배열에 값이 저장되지만 저장공간이 고정적인 배열과 달리 이미 ArrayList 클래스 내부에서 값을 저장하고 삭제할 경우 내부적으로 배열의 저장공간을 관리할 수 있도록 설계되었습니다.쉽게 말해 5개의 데이터를 저장하면 5칸 배열이 생성되고 각 칸에 데이터가 저장되며 여기서 0번째 값을 삭제하면 배열의 0번째 값이 삭제되는 것이 아니라 4칸 배열이 다시 생성되고 거기에 0번째 값을 제외한 1~4번째 값이 새로운 배열로 이동합니다.이렇게 내부적으로 이미 설계가 되어 있어서 우리는 이것을 사용법만 알면 데이터를 효율적으로 관리할 수 있습니다.

예시를 확인해 보겠습니다.ArrayList에 값을 저장하고 삭제하고 수정하는 예입니다.실행 결과 아래와 같이 잘 출력되었습니다.

지금 확인한 예는 ArrayList의 데이터 자료형이 Integer입니다.(<>내부를 Integer라고 선언함) 그러나 개발자가 정의한 클래스도 위치할 수 있습니다.

그 예시를 지금 확인해 보겠습니다.ArrayList <Student>와 같이 제네릭을 통해 직접 정의한 Student 클래스에 자료형을 설정해 주었습니다.이것이 가능한 이유는 ArrayList를 구현하여 데이터를 저장할 때 실제로 각 저장 공간에 데이터 그대로가 저장되는 것이 아니라 데이터를 저장하고 있는 인스턴스(객체)의 주소 값을 저장 공간에 저장하기 때문입니다.즉 아래 그림과 같습니다.

마치 아까 공부했던 반배열을 생각하면 이해가 더 빠를 것 같아요.즉, 첫 번째 인덱스의 저장공간에는 ‘영수’ 오브젝트의 참조값이 두 번째 인덱스의 저장공간에는, ‘영수’ 오브젝트의 참조값이 세 번째 인덱스의 저장공간에는 ‘영수’ 오브젝트의 참조값이 저장되어 있는 것입니다.여기까지 이해가 되면 리스트 사용법을 보도록 하겠습니다.이전 예와 달리 ArrayList 참조값을 그대로 출력하면 이전 예에서는 내부값이 그대로 출력되지만 정의한 클래스를 제네릭으로 설정할 경우 toString을 재정의해야 합니다. 왜냐하면 ArrayList 참조값(arData)을 그대로 출력하면 상기 코드에서는 arData.toString( )이 실행되며, 이는 내부적으로 각각의 저장 공간에 저장되어 있는 오브젝트의 toString() 메서드에 따른 값을 출력하도록 설계되어 있기 때문입니다.따라서 String, Integer와 같은 클래스는 이미 내부적으로 toString 메서드가 값을 출력되도록 설정되어 있기 때문에 재정의할 필요는 없지만 정의한 클래스는 재정의하지 않을 경우 부모 클래스인 Object에 정의된 toString을 사용하게 되므로 반드시 재정의하여 객체에 저장된 값이 출력되도록 해야 합니다.따라서 아래와 같이 잘 출력되고 있음을 확인할 수 있습니다.

LinkedListLinkedList도List 인터페이스를 구현한 클래스입니다.다만 ArrayList는 배열 기반의 저장이라면 LinkedList는 목록 기반의 저장이라는 차이가 있습니다.목록에서 스토리지 용량을 관리하기 때문에 인덱스는 존재하지 않습니다.즉, 각각의 스토리지 공간을 하나하나 연결하는 방법으로 데이터를 저장합니다.

그림으로 간단하게 표현해봤습니다.이렇게 하나하나 직접 연결되어 있기 때문에 데이터를 추가하거나 삭제하는 것이 ArrayList에 비해 원활합니다.다만 ArrayList는 인덱스가 존재하여 저장공간을 빠르게 찾을 수 있는 반면 LinkedList는 원하는 저장공간을 찾기 위해 1번 저장공간에서 2번, 3번… 순서대로 찾아야 하기 때문에 조금 더 시간이 걸리는 단점이 있습니다.따라서 검색이 필요한 경우 ArrayList를 사용하고 데이터 삽입/삭제가 빈번한 경우 LinkedList를 사용합니다.

LinkedList와 ArrayList 모두 List 인터페이스를 구현하기 때문에 사용법은 동일합니다.따라서 아까 공부했던 ArrayList 사용법과 동일하게 사용하시면 됩니다.

다만 LinkedList 오브젝트 생성은 List<E>arData=newLinkedList<E>( ); 이렇게 오브젝트만 LinkedList로 생성하여 사용하면 됩니다.

이상으로 List에 대해 알아보았습니다!!!

error: Content is protected !!