자바의 자료구조 기초

황인우·2024년 11월 29일

코딩 테스트들을 푸는데 스트림에 대한 논란이 많았다.
과연 스트림은 효과적인가? 가독성이 좋아지는가? 안좋아지는가?
등등 다양한 이야기들이 많은데
정답은 적절한 곳에 스트림과 for문을 써야 한다는 것이다.

마찬가지로 자바를 배우면서 다양한 자료 구조들이 나오는데,
아직 정확하게 다는 모르기도 하고,
실제 프로젝트에서 사용해보지 않은 것들도 많아서
한번 공부 목적으로 챗GPT에게 간단하게 정리해달라고 하였다.

이후 경험과 실력이 많이 쌓이면 자료구조 하나 하나에 대해
실제로 코드들을 보면서 더 자세한 내용들을 적어보고 싶다.


1. Array (배열)

배열의 핵심은 정해진 길이!

특징

  • 고정 크기의 자료구조 (크기를 미리 지정해야 함).
  • 인덱스를 통해 빠르게 접근 가능 (O(1)).
  • 연속된 메모리 공간에 저장.

장점

  • 간단하고 메모리 효율적.
  • 인덱스를 통한 빠른 접근 속도.

단점

  • 크기가 고정되어 동적 크기 변경 불가.
  • 삽입/삭제 시 많은 데이터를 이동해야 함 (O(n)).

사용처

  • 크기가 고정된 데이터 (예: 고정된 길이의 리스트).
  • 빠른 랜덤 접근이 필요한 경우.

2. ArrayList (동적 배열)

동적 배열은 가변적인 크기가 필요할 때!

특징

  • 크기가 가변적인 배열.
  • 내부적으로 배열을 사용하지만, 자동으로 크기를 늘림.

장점

  • 크기가 유연하게 조정됨.
  • 랜덤 접근 가능 (O(1)).
  • 사용이 직관적.

단점

  • 삽입/삭제 시 배열 이동으로 인해 느림 (O(n)).
  • 다량의 삽입/삭제 작업에 비효율적.

사용처

  • 데이터 크기가 유동적이며, 빠른 랜덤 접근이 필요한 경우.

3. LinkedList (연결 리스트)

특징

  • 노드들이 포인터로 연결된 형태.
  • 삽입/삭제가 빠름.

장점

  • 중간 삽입/삭제가 빠름 (O(1)).
  • 크기가 동적으로 조정됨.

단점

  • 랜덤 접근 불가능 (O(n)).
  • 추가적인 메모리 사용 (포인터 공간).

사용처

  • 삽입/삭제 작업이 빈번한 경우 (예: 큐, 스택 구현).

4. HashSet

주머니 같은 HashSet!

특징

  • 중복을 허용하지 않는 데이터 집합.
  • 내부적으로 해시 테이블 사용.

장점

  • 삽입/삭제/탐색이 빠름 (O(1) 평균).
  • 중복 제거에 유용.

단점

  • 데이터 저장 순서를 유지하지 않음.
  • 해시 충돌이 많아지면 성능 저하 가능.

사용처

  • 중복 없는 데이터 저장.
  • 빠른 탐색이 필요한 경우.

5. TreeSet

특징

  • 정렬된 데이터 집합.
  • 내부적으로 이진 탐색 트리 사용.

장점

  • 데이터가 항상 정렬된 상태로 유지됨.
  • 범위 탐색, 정렬된 데이터 필요 시 유용.

단점

  • 삽입/삭제/탐색이 느림 (O(log n)).
  • 중복 데이터 허용 X.

사용처

  • 정렬된 데이터가 필요하거나 범위 검색이 필요한 경우.

6. HashMap

파이썬의 Dictionary와 비슷한 키, 값 쌍

특징

  • Key-Value 형태로 데이터를 저장.
  • 내부적으로 해시 테이블 사용.

장점

  • 빠른 삽입/삭제/탐색 (O(1) 평균).
  • Key를 통해 데이터 접근 가능.

단점

  • 순서 보장되지 않음.
  • 해시 충돌 발생 가능.

사용처

  • Key-Value 관계 데이터를 저장 (예: ID-이름 매핑).

7. TreeMap

특징

  • Key-Value 형태로 데이터를 저장하며 항상 정렬된 상태 유지.
  • 내부적으로 이진 탐색 트리 사용.

장점

  • 정렬된 Key-Value 데이터 제공.
  • 범위 탐색 가능.

단점

  • 삽입/삭제/탐색이 느림 (O(log n)).

사용처

  • Key 기반 정렬 및 범위 탐색이 필요한 경우.

8. Stack (스택)

같은 스택! 하노이의 탑 구현에 사용하기도!

특징

  • LIFO (Last In, First Out) 구조.

장점

  • 삽입/삭제가 빠름 (O(1)).

단점

  • 특정 위치의 데이터 접근이 불편.

사용처

  • 재귀 처리, 백트래킹, Undo 기능 구현.

9. Queue (큐)

작업 대기열 같은 느낌!

특징

  • FIFO (First In, First Out) 구조.

장점

  • 삽입/삭제가 빠름 (O(1)).

단점

  • 랜덤 접근 불가능.

사용처

  • 데이터 순서 처리가 필요한 경우 (예: 작업 대기열).

10. PriorityQueue

특징

  • 우선순위가 높은 요소를 먼저 처리하는 큐.
  • 내부적으로 힙(Heap)을 사용.

장점

  • 우선순위가 높은 데이터를 빠르게 처리.

단점

  • 삽입/삭제/탐색이 느림 (O(log n)).

사용처

  • 우선순위가 중요한 작업 (예: 스케줄링, 다익스트라 알고리즘).


실제로 사용해본 구조와 그렇지 않은 것이 이해의 속도가 차이가 많이 난다!

실제로 많이 사용해보고 배우자!!



(마지막으로 챗GPT 선생님이 알려주시는 유치원생을 위한 자바 자료구조)


자바의 자료구조를 유치원생이 이해할 수 있도록 아주 간단하게 설명해 볼게요!

자료구조는 데이터를 잘 정리해서 쉽게 찾고 사용할 수 있게 도와주는 방법이에요. 예를 들어, 우리가 장난감을 정리할 때 상자에 넣거나, 선반에 놓는 것처럼, 자료구조는 데이터를 어떻게 정리할지 알려주는 거예요.

1. 배열 (Array)
배열은 장난감을 상자에 하나씩 정리하는 것과 같아요. 상자 안에 하나씩 장난감을 넣고, 순서대로 찾을 수 있어요. 예를 들어, 상자 안에 "인형", "자동차", "블록" 순서대로 놓는 거죠. 배열은 순서대로 정리된 장난감들이에요.

2. 리스트 (List)
리스트는 배열과 비슷한데, 나중에 장난감을 더 넣거나 뺄 수 있는 상자 같아요. 만약 상자 안에 장난감이 하나 더 필요하다면, 새로 장난감을 추가할 수 있어요. 목록처럼 늘어날 수도 있고 줄어들 수도 있어요.

3. 큐 (Queue)
큐는 장난감을 줄 서서 기다리는 것과 같아요. 첫 번째 장난감을 제일 먼저 꺼내고, 그다음 장난감을 꺼내는 방식이에요. 예를 들어, 친구들이 줄을 서서 차례대로 차를 타는 것처럼요!

4. 스택 (Stack)
스택은 장난감을 쌓아놓는 것과 같아요. 하나씩 쌓은 후, 맨 위에서 장난감을 꺼낼 수 있어요. 예를 들어, 블록을 하나씩 쌓고, 마지막에 쌓은 블록부터 먼저 꺼내는 거예요.

5. 맵 (Map)
맵은 장난감을 이름과 함께 정리하는 것 같아요. 예를 들어, "인형"은 "침대"에, "자동차"는 "도로"에 놓는 거예요. 그래서 나중에 "인형 어디에 있지?" 하면 바로 "침대"라고 알 수 있죠!

이렇게, 자료구조는 데이터를 잘 정리해서 나중에 쉽게 찾고, 꺼내고, 바꿀 수 있게 도와주는 방법들이에요!

0개의 댓글