[Java] 자료구조 - List

JUNBEOM PARK·2022년 2월 22일
0

🧨 Java

목록 보기
28/33
post-thumbnail

🤔 List ?

  • 선형 자료구조
  • 순서를 가진 항목들의 모임
  • 배열이 가지고 있는 인덱스라는 장점을 버리고 빈틈 없는 데이터 적재라는 새로운 장점을 취한 자료구조
  • ArrayList, LinkedList등 여러 인터페이스를 구현한 자료형이 있다.
  • List에서는 인덱스가 중요하지 않다.
  • List의 핵심은 각 요소(element)간의 순서


List의 기능(operation)

  1. 처음, 끝에 데이터 삽입이 가능하다.
  2. List에 데이터가 있는지를 체크 할 수 있다.
  3. List의 모든 데이터에 접근 할 수 있다.

위와 같은 기능을 가지고 있고 순서가 있으면서 중복이 허용되는 자료구조를 List라고 한다.




😉 ArrayList

ArrayList는 배열을 조금 더 편하게 쓸 수 있도록 Java에서 제공해주는 Class 이다.
일반 배열과는 다르게 메모리가 가능한한 추가할 수 있고 삭제에 대해서도 해당 index를 비워 두기만 하는게 아니라 재정렬 해주는 기능을 기본으로 제공해주고 있다.

  • 배열을 이용해서 리스트를 구현한 것을 의미
  • 내부적으로 데이터를 배열에 저장 하므로 배열의 특성상 데이터를 List의 처음이나 중간에 저장하면 이후의 데이터들이 한칸씩 뒤로 밀림
  • 데이터를 삭제해 빈자리가 생기면 빈자리를 채우기 위해 순차적으로 한 칸씩 이동
  • 인덱스를 이용하기 때문에 데이터를 가져올때 메모리상의 주소를 정확하게 참조 하므로 속도가 매우 빠르다.
  • 장점 : 내부적으로 배열을 이용하기 때문에 인덱스를 이용하여 접근 하는 것이 빠르다.
  • 단점 : 데이터의 추가or삭제가 느리다.



선언

List<> list = new ArrayList<>();

< > 제네릭 타입으로 선언한다면 해당 타입만 ArrayList에 담을 수 있다.



추가

List<String> list = new ArrayList<String>();
		
	list.add("포도"); 
	list.add("사과"); 
	list.add("수박"); 

add() 메소드를 활용해 List에 데이터를 적재 할 수 있다.



삭제

List<String> list = new ArrayList<String>();
		
	list.add("포도"); //get(0)
	list.add("사과"); //get(1)
	list.add("수박"); //get(2)
  
  	list.remove(1); // 해당 인덱스 삭제 (사과 삭제)

remove(int index) 메소드는 list의 index번째 데이터를 삭제 하는 것이다



get();

List<String> list = new ArrayList<String>();
		
	list.add("포도"); //get(0)
	list.add("사과"); //get(1)
	list.add("수박"); //get(2)
   
   	list.remove(1); 
       
   for(int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}

get() 메소드는 해당 인덱스의 데이터를 가져오는 것이다.



반복


List<String> list = new ArrayList<String>();
		
	list.add("포도"); //get(0)
	list.add("사과"); //get(1)
	list.add("수박"); //get(2)
		
		
	Iterator<String> iter = list.iterator();
	while(iter.hasNext()) {
		System.out.println(iter.next());
	}

Iterator<> 는 자료구조(List, Map, Set)을 탐색하기 위한 방법이다.
따라서 List에 담긴 데이터를 출력할 때 for문으로 하는 방법과 위 와 같은 방법이 있다.




😃 LinkedList

연결 리스트(LinkedList)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조 이다.
데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드와 다음 노드와의 연결을 담당한다.
Node는 LinkedList에 객체를 추가하거나 삭제하면 앞뒤 링크만 변경되고 나머지 링크는 변경 되지 않는다.

  • element간 연결(link)을 통해 리스트를 구현한 것
  • Node가 사용됨
  • Head(첫번째 Node) 와 Tail(마지막 Node)
  • 메모리 제한이 없다
  • 장점 : 데이터의 추가 or 삭제가 빠르다
  • 단점 : 인덱스가 없어 특정 요소에 접근하기 위해서 순차 탐색이 필요해 탐색 속도가 느리다.



선언

List<> list = new LinkedList<>();

ArrayList 처럼 제네릭 타입으로 선언 한다면 해당 타입만 사용 가능 하다.



추가

LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(2);//가장 뒤에 데이터 추가
list.add(3);//데이터 추가
list.add(1, 10);//index 1에 데이터 10 추가

ArrayList와 다른 점은 가장 앞,뒤에 데이터를 추가 할 수 있다.



삭제

LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3,4,5));
list.removeFirst(); //가장 앞의 데이터 제거
list.removeLast(); //가장 뒤의 데이터 제거
list.remove(); //생략시 0번째 index제거
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거

ArrayList와 다른 점은 가장 앞,뒤에 데이터를 삭제 할 수 있다.

이 외 반복, 출력, 크기 등은 ArrayList와 동일 하다.


참고자료
https://power-overwhelming.tistory.com/23
https://dev-whoan.xyz/5
https://www.nextree.co.kr/p6506/

profile
DB 엔지니어👍

0개의 댓글