[JAVA] 컬렉션 프레임워크 - List

경운·2025년 10월 19일

Data Structure

목록 보기
2/7
post-thumbnail

프로그래머스에서 배열 문제를 풀다가 크기가 고정적이니까 답답한 점이 많았다
한 번 생성할 때 크기를 결정하면 더 이상 수정도 불가능하기 때문에 처음에 생성할 때가 중요하다
크기가 초과되면 데이터 저장 불가, 데이터를 삭제하면 해당 인덱스는 비어있어서 메모리 낭비

이러한 문제점을 해결하기 위해, 객체나 데이터를 효율적으로 관리 할 수 있는 자료구조들을 만들어놓았다 자바가!!!

자료구조들이 있는 라이버러리를 컬렉션 프레임워크라고 한다.
이 포스팅에서는 List에서 배워보도록 하자


List

  • List 컬렉션순서가 있고 중복을 허용하는 데이터의 묶음을 다루는 인터페이스
  • 배열과 비슷하며 크기가 자동으로 조절되는 더 편리한 기능들을 제공

1. List의 핵심 특징

  • 순서가 있다
    • 데이터를 추가한 순서대로 저장
  • 중복이 가능
    • 같은 값을 여러 번 저장 가능 → 또 다른 컬렉션 프레임워크의 Set과의 가장 큰 차이점
  • 인덱스로 접근
    • 배열 처럼 0부터 시작하는 숫자(인덱스)로 특정 위치의 데이터에 get(index) 메서드를 통해 바로 접근 가능

2. List의 종류(구현 클래스)

ArrayList

  • 내부 구조 - 동적 배열(Array)

  • 특징

    • 내부적으로 배열을 사용하여 데이터를 관리
    • 조회(get) 속도가 매우 빠름 → 인덱스를 알면 O(1)의 속도로 한 번에 데이터를 찾아감
    • 데이터 추가/삭제가 느림 (특히 중간에 삽입 / 삭제할 때)
      • 중간에 데이터가 삽입되거나 삭제되면, 그 뒤의 모든 데이터를 한 칸씩 밀거나 당기는 작업(복사)가 필요 (O(n))
  • 사용 시기 - 데이터 조회가 빈번하게 일어나거나 추가 / 삭제는 리스트의 맨 뒤에서 주로 일어날 때 Best

LinkedList

  • 내부 구조 - 이중 연결 리스트

  • 특징

    • 데이터 조각(Node)들이 앞뒤 주소(링크)를 통해 기차 처럼 연결되어 있음
    • 데이터 추가 / 삭제 속도가 매우 빠름
      • 중간에 데이터를 삽입 / 삭제할 때, 앞 뒤 노드의 연결 주소만 바꿔주면 됨 (O(1))
    • 조회(get) 속도가 느림
      • 특정 인덱스의 데이터를 찾으려면 첫 번째(또는 마지막) 노드 부터 순서대로 하나씩 링크를 따라가며 찾아야 함 (O(n))
  • 사용 시기 - 데이터 추가 / 삭제가 리스트의 중간에서 빈번하게 일어날 때 Best

Vector

  • 내부 구조 - 동적 배열(ArrayList와 거의 동일)
  • 특징
    • ArrayList와 모든 기능이 거의 같지만, 큰 차이점으로는 동기화를 지원
    • Thread-safe - 여러 스레드가 동시에 접근해도 데이터 일관성을 보장
    • 동기화 처리 때문에 ArrayList보다 성능이 느림
  • 사용 시기 - 잘 사용하지 않음
  • 참고 - Stack 클래스가 Vector를 상속 받아서 만들어짐

List 컬렉션 선언 방법

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

// List<타입> 변수명 = new ArrayList<>();  //Arraylist 선언 방법
// List<타입> 변수명 = new LinkedList<>();  //LinkedList 선언 방법

List<String> fruits = new ArrayList<>();
fruits.add("사과");
fruits.add("바나나");
fruits.add("딸기");

String secondFruit = fruits.get(1);

System.out.println(fruits); // [사과, 바나나, 딸기]
System.out.println(secondFruit); // 바나나

언제 어떤 걸 써야할 까?

  • 특별한 이유가 없다면? → ArrayList
  • 데이터 조회가 압도적으로 많다? → ArrayList
  • 리스트 중간에 데이터를 추가 / 삭제 하는 일이 아주 많다? → LinkedList

프로그래머스 lv0 - 배열의 원소 삭제하기

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[] delete_list) {
       
        List<Integer> answerList = new ArrayList<>();
        
        for(int i = 0; i < arr.length; i++) {
            answerList.add(arr[i]);
        }
        
        for(int i = 0; i < delete_list.length; i++) {
            answerList.remove(Integer.valueOf(delete_list[i]));
        }
        
        int[] answer = new int[answerList.size()];
        for(int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
}

0개의 댓글