Java/자료구조

데이터 구조 선택 가이드

크크크크 2025. 3. 11. 22:26
728x90
반응형
자바 기반 설명이며 개념에 관한 내용을 다룹니다.

📌 핵심내용

데이터 구조는 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. 결론

데이터 구조는 목적과 상황에 맞게 선택해야 합니다.

  • 빠른 검색이 필요하다면 해시맵
  • 순차적 접근이 필요하다면 배열
  • 동적 삽입/삭제가 많다면 연결 리스트
  • 계층적 데이터 구조트리
  • 복잡한 관계 표현그래프

이처럼 적절한 데이터 구조를 선택하면 성능과 효율성을 극대화할 수 있습니다.

728x90
반응형