본문 바로가기
Java

간단히 보는 JAVA의 자료구조

by titlejjk 2023. 6. 13.

자바의 자료구조(Data Structures)는 데이터를 저장하고 조작하는 방법을 정의하는 방법론이며, 효율적인 데이터처리를 위해 사용된다.

아래 설명은 간단하게 자바에서 제공하는 다양한 자료구조의 설명과 예제가 있다.

 

1. 배열(Array)
배열은 동일한 유형의 데이터를 연속적으로 저장하는 선형 자료구이다. 각 요소는 인덱스를 사용하여 접근하며, 인덱스로 요소를 삽입, 삭제하거나 조회할 수 있다.

자바에서 배열은 정적으로 크기가 결정되고 한 번 생성되면 크기를 변경할 수 없다.

배열의 장점은 인덱스를 사용하여 빠른접근이 가능하며, 단점으로는 크기가 고정되어 있어 요소의 추가, 삭제가 어렵다.

int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

 

2. 리스트(List)

리스트는 순서가 있는 데이터의 모음으로, 크기를 동적으로 저장할 수 있는 자료구조이다. 자바에서는 ArrayList, LinkedList 등의 리스트 구현체를 제공하며, ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하며, 크기 조정에 비용이 크다. LinkedList는 각 요소가 이전 요소와 다음 요소의 링크로 연결되어 있어 삽입, 삭제가 유리하다.

리스트는 인덱스를 사용하여 요소에 접근하기 용이하며, 중복된 요소를 저장할 수 있다.

import java.util.ArrayList;
import java.util.List;

List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");

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

fruits.remove("Banana");
System.out.println("After removing Banana:");
for (String fruit : fruits) {
    System.out.println(fruit);
}

 

3. 스택 (Stack)

스택은 후입선출(LIFO)구조를 가지고 있는 자료구조이다. 데이터를 삽입하는 연산을 push, 데이터를 제거하는 연산을 pop이라고 한다. push연산은 스택의 가장 위에 데이터를 추가하고, pop연산은 가장 위의 데이터를 제거한다.

스택은 재귀 알고리즘, 괄호 검사, 웹 브라우저의 뒤로 가기 등에 사용된다.

import java.util.Stack;

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

while (!stack.isEmpty()) {
    int item = stack.pop();
    System.out.println(item);
}

위의 예제에서는 Stack을 사용하여 숫자를 저장하고, while 루프를 통해 스택의 요소들을 pop() 메소드를 사용해 꺼내고 출력한다.

 

4.큐(Queue)

큐는 선입선출(FIFO)구조를 가지고 있는 자료구조이다. 데이터를 삽입하는 연산을 enqueue, 데이터를 제거하는 연산을 dequeue라고 한다.

enqueue연산은 큐의 뒤쪽에 데이터를 추가하고, dequeue연산은 큐의 앞쪽에서 데이터를 제거한다.

큐는 작업 대기열, 너비 우선 탐색(BFS)등에 사용된다.

import java.util.LinkedList;
import java.util.Queue;

Queue<String> queue = new LinkedList<>();
queue.add("John");
queue.add("Alice");
queue.add("Bob");

while (!queue.isEmpty()) {
    String person = queue.poll();
    System.out.println(person);
}

위의 예제에서는 LinkedList를 사용하여 사람들의 이름을 저장하고, while루프를 통해 큐의 요소들을 poll()메소드를 사용하여 꺼내고 출력한다.

 

5. 해쉬맵(HashMap)

해시 맵은 키 -값 쌍으로 데이터를 저장하는 자료구조이다. 해시 함수를 사용하여 키를 해시코드로 변환하고, 해당 해시코드를 인덱스로 사용하여 데이터를 저장하고 검색한다.

자바에서 HashMap 클래스는 해시 맵을 구현한 구조이다. 해시 맵은 빠른 검색 성능을 제공하며, 키를 기준으로 중복된 값은 허용하지 않는다.

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> scores = new HashMap<>();
scores.put("John", 80);
scores.put("Alice", 90);
scores.put("Bob", 75);

System.out.println("John's score: " + scores.get("John"));

for (Map.Entry<String, Integer> entry : scores.entrySet()) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}

위의 예제에서 HashMap을 사용하여 이름과 점수를 저장하고, get()메소드를 사용하여 "John"의 점수를 출력한다. 그리고 for-each루프를 통해 해시 맵의 모든 요소들을 출력한다.

 

6. 트리(Tree)

트리는 계층적인 구조를 가지며, 부모와 자식 관계로 이루어진 자료구조이다. 이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리이며 이진 검색 트리(Binary Search Tree)는 이진 트리에서 각 노드의 왼쪽 자식은 현재 노드보다 작은 값, 오른쪽 자식은 큰 값이 되도록 정렬된 트리이다.

AVL트리, B-트리 등의 트리 구조도 자주 사용된다.

트리는 정렬된 데이터 유지, 효율적인 탐색, 계층적 데이터 구조 등에 사용된다.

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> scores = new HashMap<>();
scores.put("John", 80);
scores.put("Alice", 90);
scores.put("Bob", 75);

System.out.println("John's score: " + scores.get("John"));

for (Map.Entry<String, Integer> entry : scores.entrySet()) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}
위의 예제에서는 HashMap을 사용하여 이름과 점수를 저장하고, get() 메서드를 사용하여 "John"의 점수를 출력합니다. 또한, for-each 루프를 통해 해시 맵의 모든 요소들을 출력합니다.

트리 (Tree) 예제:
java
Copy code
class Node {
    int value;
    Node left;
    Node right;

    public Node(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

// 이진 탐색 트리에 요소 추가하는 메서드
public Node insert(Node root, int value) {
    if (root == null) {
        return new Node(value);
    }

    if (value < root.value) {
        root.left = insert(root.left, value);
    } else if (value > root.value) {
        root.right = insert(root.right, value);
    }

    return root;
}

// 이진 탐색 트리의 요소들을 중위 순회로 출력하는 메서드
public void inorderTraversal(Node root) {
    if (root != null) {
        inorderTraversal(root.left);
        System.out.println(root.value);
        inorderTraversal(root.right);
    }
}

// 예제 실행
Node root = null;
root = insert(root, 50);
root = insert(root, 30);
root = insert(root, 70);
root = insert(root, 20);
root = insert(root, 40);
root = insert(root, 60);
root = insert(root, 80);

System.out.println("Inorder Traversal:");
inorderTraversal(root);

위의 예제에서는 이진 탐색 트리에 요소를 추가하는 insert() 메소드와 중위 순회로 트리의 요소들을 출력하는 inorder Traversal() 메소드를 구현하고 실행한다. 이를 통해 이진 탐색 트리의 동작을 확인할 수 있다.

'Java' 카테고리의 다른 글

JAVA try-cath-finally 🧏‍♂️try-with-resources  (0) 2023.06.14
JAVA Cookie  (0) 2023.06.13
EL (Expression Language)  (0) 2023.06.13
JAVA Filter  (0) 2023.05.31
JAVA Session scope  (0) 2023.05.31

댓글