반응형
자바 기반 설명이며 개념에 관한 내용을 다룹니다.
📌 핵심내용
데이터 구조는 Object의 특성에 따라 적절하게 선택해야하는데
스택(Stack), 큐(Queue), 해시맵(HashMap), 트리(Tree), 그래프(Graph) 등 다양한 데이터 구조가 존재하며 각각의 특성이 달라
상황에 맞는 데이터 구조 선택이 성능 최적화의 핵심이다.
1. 데이터 구조별 특징
데이터 구조설명사용 사례
배열(Array) | 인덱스를 통한 빠른 접근 가능 | 리스트, 행렬 연산 (예: Java의 ArrayList) |
연결 리스트(Linked List) | 동적 크기 조정 가능, 삽입/삭제 용이 | LRU 캐싱 (예: Java의 LinkedList) |
스택(Stack) | 후입선출(LIFO) | 함수 호출 스택 (예: Java의 Stack 클래스) |
큐(Queue) | 선입선출(FIFO) | 작업 스케줄링 (예: Java의 Queue 인터페이스) |
해시맵(HashMap) | 키-값 쌍 저장, 빠른 검색 | 데이터베이스 인덱싱 (예: Java의 HashMap) |
트리(Tree) | 계층적 데이터 구조 | 파일 시스템, 조직도 (예: Java의 TreeMap, BinaryTree) |
그래프(Graph) | 복잡한 관계 표현 | 소셜 네트워크, 경로 탐색 (예: Apache TinkerPop, Neo4j) |
2. 데이터 구조 사용 예시
스택(Stack)과 큐(Queue)
(1) 스택(Stack) 사용 예제
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop()); // 3
}
}
사용 사례
- Spring 프레임워크: 메소드 실행 시 호출 스택을 활용하여 AOP(Aspect-Oriented Programming) 적용
- JVM 내부 동작: 메서드 호출 시 스택 프레임을 활용하여 호출 흐름 관리
(2) 큐(Queue) 사용 예제
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println(queue.poll()); // 1
}
}
사용 사례
- RabbitMQ, Kafka: 메시지 큐를 활용한 비동기 이벤트 처리
- Spring의 TaskExecutor: 비동기 작업 처리 시 내부적으로 큐 활용
연결 리스트(Linked List)
(1) 단일 연결 리스트 예제
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedListExample {
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
System.out.println(head.next.data); // 2
}
}
사용 사례
- Java의 LinkedList 클래스: List 인터페이스 구현체로 삽입/삭제가 빈번한 경우 사용
- LRU 캐싱 구현: 최근 사용되지 않은 항목을 제거하는 알고리즘
해시맵(HashMap)
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.get("A")); // 1
}
}
사용 사례
- Spring의 ApplicationContext: Bean을 관리하는 내부 구조로 HashMap 사용
- Java의 HashMap 기반 캐싱: 빠른 조회 성능을 위해 사용
트리(Tree)
class TreeNode {
int data;
TreeNode left, right;
TreeNode(int data) {
this.data = data;
this.left = this.right = null;
}
}
사용 사례
- JDK의 TreeMap: Red-Black Tree 기반 정렬된 Map 구현
- 데이터베이스 인덱싱 (B-Tree): MySQL, PostgreSQL에서 검색 최적화
그래프(Graph)
import java.util.*;
class Graph {
private Map<Integer, List<Integer>> adjList = new HashMap<>();
void addEdge(int u, int v) {
adjList.computeIfAbsent(u, k -> new ArrayList<>()).add(v);
adjList.computeIfAbsent(v, k -> new ArrayList<>()).add(u);
}
}
사용 사례
- Neo4j: 그래프 데이터베이스, 소셜 네트워크 분석
- Dijkstra 알고리즘 (Shortest Path): Google Maps, 네트워크 경로 최적화
3. 결론
데이터 구조는 목적과 상황에 맞게 선택해야 합니다.
- 빠른 검색이 필요하다면 해시맵
- 순차적 접근이 필요하다면 배열
- 동적 삽입/삭제가 많다면 연결 리스트
- 계층적 데이터 구조는 트리
- 복잡한 관계 표현은 그래프
이처럼 적절한 데이터 구조를 선택하면 성능과 효율성을 극대화할 수 있습니다.
반응형
'Java > 자료구조' 카테고리의 다른 글
덱(Deque) 보다 큐(Queue)와 스택(Stack)이 더 좋은 경우? (0) | 2025.03.11 |
---|---|
Deque? (1) | 2025.03.11 |
스택? 큐? (0) | 2025.03.11 |
[자료구조] 시프트연산 (1) | 2021.12.19 |
[자료구조] 비트연산 (1) | 2021.12.19 |