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을 선택해 보세요!
마지막으로, 꼭 기억하세요: "프로그래밍에서 정답은 없어요. 가장 적합한 걸 고르는 게 중요하답니다!"
'개발 > Java' 카테고리의 다른 글
[Java] Iterator 란? Iterator의 기본사용법과 응용법을 알아보자!! (2) | 2024.11.28 |
---|---|
[Java&Javascript] 문자를 byte 로 계산하는 함수는 이렇게 만들어요. (1) | 2024.11.27 |
[Java] static, final 에 대해 차근차근 알아보자! (1) | 2024.11.25 |
[Java] Java 에서 Field 클래스에 대해 알아보자. (3) | 2024.11.25 |
[Java] Java 에서 HashMap이란 무엇인가? 사용법도 알아보자! (2) | 2023.05.10 |
댓글