본문 바로가기

LANG../JAVA

List - ArrayList, LinkedList

List

  • List 인터페이스는 Java에서 제공하는 컬렉션 프레임워크(Collection Framework)에 속하는 인터페이스 중 하나이다.
  • List는 순서가 있는 데이터의 집합으로, 중복된 요소를 허용한다.
  • List는 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스 번호가 부여되고 인덱스를 통해 객체를 검색, 삭제할 수 있는 기능을 제공한다.
    • 객체 추가 기능
      • add(E d): 주어진 객체를 List의 맨 끝 부분에 추가
      • add(int index, E e) : 주어진 인덱스에 객체를 추가
      • set(int index, E e) : 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
    • 객체 검색 기능
      • contains(Object o): 주어진 객체가 저장되어있는지의 여부를 판단
      • get(int index): 주어진 인덱스에 저장되어 있는 객체를 리턴
      • isEmpty(): 컬렉션이 비어있는지의 여부를 판단
      • size(): 저장되어 있는 전체 객체 수를 리턴
    • 객체 삭제 기능
      • clear() : 저장된 모든 객체를 삭제
      • remove(int index) : 주어진 인덱스에 저장된 객체를 삭제
      • remove(Object o) : 주어진 객체를 삭제
      •  

[ ArrayList ]

: ArrayList클래스는 List 인터페이스의 구현 클래스로 ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다.

- 배열은 생성될 때 크기가 고정되고, 사용 중에 크기 변경이 불가하지만, ArrayList는 저장용량을 초과한 객체가 들어오면 자동으로 저장 용량을 증가시킨다.

 

  • 내부 구현: 배열 기반의 동적 배열로 구현되어 있다.
  • 접근 속도: 특정 인덱스에 직접 접근할 수 있기 때문에 빠른 접근이 가능하다. 시간 복잡도는 O(1).
  • 메모리 사용: 요소의 추가/삭제 시 배열을 조정해야 하므로, 중간에 요소를 삽입하거나 삭제할 때 비효율적이다.
    • 삭제시 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1칸씩 당겨짐
  • 용도: 요소를 자주 읽고 쓰는 경우에 유용하며, 크기가 자주 변경되지 않는 경우에 적합하다.

 

[ LinkedList ]

: LinkedList는 List 인터페이스의 구현 클래스로 객체를 인접 참조를 링크하여 체인처럼 관리한다.

  • 내부 구현: 노드(각각의 요소)들이 서로 링크되어 있는 구조로 구현되어 있다.
  • 접근 속도: 특정 인덱스에 직접 접근하는 것이 아닌, 처음부터 해당 인덱스까지 차례로 이동해야 하므로 접근 속도가 느리다. 시간 복잡도는 O(n).
    • 객체를 찾을 경우 링크를 타고타고 넘어가야 하므로 속도가 느리다.
    • 삭제나 추가 시 앞 뒤 해당 객체의 앞 뒤 링크만 변경되고 나머지 링크는 변경되지 않아 ArrayList보다 좋은 성능을 발휘한다.
  • 메모리 사용: 중간에 요소를 추가/삭제하는 경우에 효율적이다. 노드를 조정하기만 하면 되므로 배열보다 유연하다.
  • 용도: 요소의 추가/삭제가 빈번하게 일어나는 경우에 유용하며, 크기가 동적으로 변할 때 적합하다.

 

[ 언제 사용하는가 ]

  • ArrayList: 요소의 조회가 많은 경우, 크기가 변하지 않는 경우, 요소의 추가/삭제가 적은 경우에 적합하다.
  • LinkedList: 요소의 추가/삭제가 빈번한 경우, 크기가 동적으로 변하는 경우에 적합하다.

보통은 대부분의 상황에서 ArrayList가 사용된다. 하지만 특정한 사용 사례에 따라 LinkedList가 더 효율적일 수 있다. 선택은 문제의 특성과 성능 요구사항에 따라 달라진다.

 

 

 

 

[ 예제 ]

package collection.list;

import java.util.ArrayList;
import java.util.List;
import java.util.LinkedList;

public class ListExample {

	public static void main(String[] args) {
		//ArrayList와 LinkedList는 사용양식은 전부 List 인터페이스를 따릅니다.
		//따라서 교환이 가능합니다. 인터페이스가 같은 구현체들은 사용법이 모두 같습니다.
		//제네릭 : 타입 안정화를 위해 객체 내부에 저장되는 타입을 일치시키는 방법
		//String만 저장할 수 있는 컬렉션
		
		//다형성이 적용되는 특정 인터페이스 타입에 구현체를 선택적으로 대입하는 패턴을 전략패턴이라고 합니다.
		//List<String> list = new ArrayList<>(); //1.8버전부터는 생성자에 제네릭 표시 x
		List<String> list = new LinkedList<>();
		
		String str1="Java";
		String str2="SpringBoot";
		System.out.println(list); //컬렉션들은 toString()이 자동으로 오버라이딩 되어
								//주소값이 아닌 내부 저장 요소가 바로 콘솔에 찍힘
		
		//list에 객체를 저장하는 메서드 add() : 데이터를 마지막 지점에 추가
		list.add(str1);
		list.add(str2);
		list.add("infra");
		list.add("docker");
		list.add("linux");
		list.add("linux");//중복저장 허용
		System.out.println(list);
	
		//list에 저장된 총 객체 수 얻기 .size()
		int size=list.size();
		System.out.println("list에 저장된 총 객체의 수 : "+size);
	
		//list에 객체 삽입 add(index, 객체) : 데이터를 해당 인덱스 번호에 넣고
		//해당 인덱스 이후 자료는 전부 한 칸씩 뒤로 밀어내개기
		list.add(2,"Network");
		System.out.println(list);
		
		//list 데이터 수정 set(index, 객체)
		//list[3] = "ubuntu"; //일반 인덱싱으로 수정하기 사용 불가
		list.set(5, "ubuntu");
		System.out.println(list);
		
		//list 내부객체 가져오기 get(index)
		String s = list.get(2);
		System.out.println(s);
		
		//list 내부에 저장된 객체의 번호가 몇 번인지 확인하기
		int idx = list.indexOf("docker"); //없는 자료 조회시 -1
		System.out.println(idx);
		
		//list에서 객체 데이터 삭제 remove(index), remove(객체)
		list.remove(5);
		System.out.println(list);
		list.remove(str1);
		System.out.println(list);
		
		//list 내부에 저장된 객체의 유무 확인 contains() -> 있으면 true, 없으면 false
		System.out.println(list.contains(str2));
		
		//list의 반복문 처리
		//인덱스로 조회
		for(int i =0;i<list.size();i++)
		{
			System.out.println("내부요소 : "+list.get(i));
		}
		System.out.println("------------");
		//향상된 for문도 사용 가능 (List<String>으로 선언했으므로 String으로 받기
		for(String str : list) {
			System.out.println("내부 요소 : "+str);
		}
		
		//list내부의 전체 자료 삭제 clear()
		list.clear();
		System.out.println(list); //list변수의 빈 리스트는 남아있음.
		
		//list 내부 데이터가 전부 비어있는지 확인하는 메서드 isEmpty()
		System.out.println(list.isEmpty());
		
	}
}

'LANG.. > JAVA' 카테고리의 다른 글

Set - HashSet  (0) 2024.01.26
Generic, Collection  (1) 2024.01.23
StringBuffer/StringBuilder, BufferedReader/BufferedWriter  (0) 2024.01.19
API  (0) 2024.01.19
예외처리(checked exception / unchecked exception)  (0) 2024.01.18