[JAVA] List-ArrayList, LinkedList

List List컬렉션은 데이터를 보존하는 경우 인덱스 순서대로 데이터가 저장됩니다. List인터페이스를 구현하는 클래스에는 대표적으로 ArrayList<E>과 LinkedList<E>이 있습니다.이들 2개는 기능적으로는 같지만 데이터를 보존하는 방법에서 차이가 있습니다.그리고 여기서 데이터는 인스턴스입니다.우선 이 2가지 공통점은 데이터의 보존 순서를 유지하는 것입니다.모두 List인터페이스를 구현하기 때문입니다2번째의 공통점은 모두 같은 인스턴스의 중복 보존을 허가합니다.그럼 각각 데이터의 보존 방법은 어떤 면에서 차이가 있을까요?ArrayList는 배열 기준 자료 구조입니다. 그러므로, 배열을 이용하여 데이터를 저장합니다.Linked List는 리스트 기반의 자료 구조입니다. 그래서 명단을 구성하여 데이터를 저장합니다.그럼 우선 List인터페이스의 메소드의 종류에 대해서 봅시다.

메서드 내용 add(Ee) 데이터 추가set(intindex,Ee) 해당 인덱스에 입력된 데이터로 대체 get(intindex) 해당 인덱스의 데이터 리턴 is Empty() 데이터 유무 리턴 size() 저장된 데이터의 수 리턴 remove(Objecto) 해당 데이터 삭제

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

publicクラステスト{publicstaticvoidmain(String[]args){ist<Integer>arData=新しいArrayList<>();rData.add(10);rData.add(20);rData.add(30);rData.add(40);rData.add(50);ystem.out.println(arData.size();i+){rrayList{rData.addd(10)};rData.add(30);rData.adddln(arData);

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

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

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

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

마치 아까 공부한 클래스 배열을 생각하면 이해가 더 빠른 것 같아요.즉 처음의 인덱스의 저장 공간에는 “입력”객체의 참조치가 2번째 인덱스의 저장 공간에는 “입력”객체의 참조치가 3번째 인덱스의 저장 공간에는 “입력”객체의 참조 값이 저장되고 있습니다.여기까지 이해할 수 있다면, 리스트의 사용 방법을 봅시다.앞의 예와 달리 ArrayList의 참조 값을 그대로 출력하면 앞의 예에서는 내부 값이 그대로 출력되었지만, 우리가 정의한 클래스를 제네릭에 설정하는 경우에는 toString을 재정의할 필요가 있습니다. 왜냐하면 ArrayList의 참조 값(arData)을 그대로 출력하면 위 코드에서는 arData.toString()가 실행되며, 이는 내부적으로 각각 저장 공간에 저장된 객체의 toString()메소드에 의한 값을 출력하도록 설계되어 있기 때문이죠.그러므로 String, Integer 같은 반은 이미 내부적으로 toString()메소드가 값을 출력되도록 설정되어 있기 때문에, 재정의할 필요는 없지만 우리가 정의한 반은 재정의하지 않을 경우 부모 클래스인 Object에 정의되고 있는 toString을 사용하게 되므로 반드시 재정의하고 객체에 저장된 값이 출력되도록 해야 합니다.그러므로 다음과 같게 출력되고 있는 것을 볼 수 있습니다.

Linked List Linked List도 List 인터페이스를 구현한 클래스입니다.다만 ArrayList는 배열 기반 저장이라면 LinkedList는 목록 기반 저장이라는 차이가 있습니다.목록을 통해 스토리지 용량을 관리하기 때문에 인덱스는 존재하지 않습니다.즉, 각각의 스토리지 용량을 하나하나 연결하는 방식으로 데이터를 저장합니다.그림으로 쉽게 표현했습니다 이처럼 하나하나 직접 연결되어 있어 데이터를 추가하거나 삭제하는 것이 ArrayList에 비해서 원활합니다.다만 ArrayList는 인덱스가 존재하고 저장 공간을 빠르게 찾을 수 있는 반면, LinkedList는 원하는 저장 공간을 찾으려고번 저장 공간에서 2번, 3번,…차례로 순서대로 찾아야 하니까 조금 더 시간이 걸린다는 단점이 있습니다.그래서 검색이 많이 필요한 경우 ArrayList를 사용하여 데이터 삽입/삭제가 잦은 경우는 LinkedList를 사용합니다.Linked List와 Array List이 모두 List인터페이스를 구현하기 때문에, 사용법은 똑같아요.그러므로 아까 공부한 ArrayList의 사용법과 같이 사용하면 된다고 생각합니다.다만 LinkedList객체 생성은 List<E>arData=newLinkedList<E(); 이렇게 객체만 LinkedList으로 생성하고 사용하면 됩니다.이상으로 List에 대해서 알아봤습니다.!!!

error: Content is protected !!