본문 바로가기
개발/Java

[Java] List 에 대해 모든 것을 알아보고 비교해보자!!

by 쓸있쏜 2024. 11. 26.

Java의 List, 우리의 데이터 친구들!

안녕하세요! 오늘은 Java에서 데이터를 다룰 때 자주 만나는 **List**라는 친구들에 대해 이야기해 볼까 해요. List는 개발자라면 한 번쯤 반드시 마주치는 아주 기본적이지만 중요한 존재랍니다. 그런데요, List에도 다양한 친구들이 있다는 거 알고 계셨나요? 오늘은 그 친구들을 하나씩 소개하면서, 언제 어떤 걸 써야 하는지 알아볼게요. 준비되셨나요? 😊


1. List란 무엇일까요?

간단하게 말해서, List는 데이터를 순서대로 정리해 주는 마법 같은 상자예요. 마치 우리가 책꽂이에 책을 순서대로 꽂아 두듯이, List는 데이터를 저장하고 필요할 때 꺼내 쓸 수 있도록 해준답니다.

아래처럼 쓰면 정말 간단해요:

List<String> myList = new ArrayList<>();
myList.add("사과");
myList.add("바나나");
myList.add("체리");

for (String fruit : myList) {
    System.out.println(fruit);
}

출력:

사과
바나나
체리

이처럼, List는 데이터를 순서대로 정리해 두는 데 정말 유용해요. 그런데, List를 구현하는 방식에 따라 속도와 성능이 꽤 달라지기도 해요. 그래서 ArrayList, LinkedList, Vector, Stack 같은 친구들이 존재한답니다. 이 친구들, 알고 보면 정말 개성 넘치는 캐릭터들인데요. 이제부터 하나씩 소개할게요!


2. ArrayList – 빠르고 똑똑한 정리왕

ArrayList는 **제일 많이 쓰이는 List**라고 해도 과언이 아니에요. 데이터를 배열에 저장하는데, 배열 크기가 모자라면 자동으로 늘려 주는 똑똑한 친구랍니다.

  • 장점: 데이터를 찾을 때 빠릅니다! 배열처럼 인덱스를 통해 바로 찾아가기 때문이에요.
  • 단점: 중간에 데이터를 끼워 넣거나 삭제하면 나머지 데이터를 밀고 당겨야 해서 느릴 수 있어요.

예시:

ArrayList<String> movies = new ArrayList<>();
movies.add("인셉션");
movies.add("인터스텔라");
movies.add(1, "라라랜드"); // 1번 인덱스에 삽입

System.out.println(movies);

출력:

[인셉션, 라라랜드, 인터스텔라]

책꽂이에 책을 하나씩 꽂는 것처럼, 순서대로 넣고 꺼내기가 쉬워요. 단, 책 중간에 갑자기 큰 백과사전을 끼워 넣으려면 좀 힘들겠죠? 😅


3. LinkedList – 느긋한 연결의 달인

LinkedList는 ArrayList와는 완전히 다른 방식으로 데이터를 관리해요. 데이터를 노드라는 조각들로 저장하고, 이 조각들이 연결되어 있어요. 그래서 데이터를 중간에 넣거나 빼는 게 아주 쉬워요.

  • 장점: 삽입과 삭제가 빠릅니다. 노드의 연결만 바꿔 주면 되니까요!
  • 단점: 데이터를 찾으려면 처음부터 끝까지 쭉 훑어야 해서 시간이 좀 걸려요.

예시:

LinkedList<String> tasks = new LinkedList<>();
tasks.add("코딩");
tasks.add("운동");
tasks.addFirst("커피 마시기"); // 맨 앞에 삽입

System.out.println(tasks);

출력:

[커피 마시기, 코딩, 운동]

마치 사람 손을 잡고 줄을 서 있는 것 같죠? 누군가 새치기를 해도 손만 살짝 바꾸면 되니까 편리해요. 하지만, 줄 끝에 있는 사람을 찾으려면 처음부터 쭉 봐야 하니 조금 느릴 수도 있어요. 😄


4. Vector – 고전의 품격

Vector는 ArrayList와 비슷하지만, 멀티스레드 환경에서 안전하게 데이터를 다룰 수 있어요. 하지만 기본 동기화 때문에 요즘은 잘 쓰이지 않아요.

예시:

Vector<String> vector = new Vector<>();
vector.add("Java");
vector.add("Python");
vector.add("JavaScript");

System.out.println(vector);

출력:

[Java, Python, JavaScript]

옛날 클래식한 매력이 있는 친구지만, 요즘은 다른 친구들에 비해 느리다는 평가를 받곤 해요. 그래도 가끔 꼭 필요한 상황이 있답니다. 😌


5. Stack – 차곡차곡 쌓아 올리기

Stack은 데이터를 LIFO(Last In, First Out) 방식으로 관리해요. 말 그대로, 나중에 들어간 데이터가 먼저 나오는 구조죠. 되돌리기(Undo) 기능처럼 마지막에 한 일을 먼저 처리해야 할 때 유용해요.

예시:

Stack<String> stack = new Stack<>();
stack.push("첫 번째 작업");
stack.push("두 번째 작업");
stack.push("세 번째 작업");

System.out.println(stack.pop()); // 마지막 데이터를 꺼냄

출력:

세 번째 작업

마치 책을 차곡차곡 쌓아 올리고, 맨 위에서부터 하나씩 꺼내는 것 같아요. 😊


6. 어떤 친구를 선택해야 할까요?

여기 간단한 비교표를 준비했어요! 😄

특징 ArrayList LinkedList Vector Stack

저장 방식 동적 배열 연결 리스트 동적 배열 동적 배열
읽기 속도 빠름 느림 빠름 느림
삽입/삭제 속도 느림 빠름 느림 LIFO 전용
동기화 비동기화 비동기화 동기화 동기화

7. 결론: 각자 개성에 맞는 선택!

List 친구들은 모두 각자 장단점이 있어요. 그러니 작업의 성격에 따라 적합한 친구를 선택하면 된답니다. 데이터를 자주 읽어야 한다면 ArrayList, 삽입/삭제가 많다면 LinkedList, 멀티스레드 환경이라면 Vector, 되돌리기가 필요하다면 Stack을 선택해 보세요!

마지막으로, 꼭 기억하세요: "프로그래밍에서 정답은 없어요. 가장 적합한 걸 고르는 게 중요하답니다!"

 

댓글