• ABOUT
  • PORTFOLIO
  • POSTS
  • GUESTBOOK

ยฉ 2025-2026 BlueCool12 All rights reserved.

2025.06.25์ž๋ฃŒ๊ตฌ์กฐ

๐Ÿš‚ ๋ฐฐ์—ด ยท ๋™์  ๋ฐฐ์—ด ยท ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ ์ •๋ฆฌ

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

๋ฐฐ์—ด(Array)๊ณผ ๋™์  ๋ฐฐ์—ด(Dynamic Array) ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋Š” ๋Œ€ํ‘œ์ ์ธ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด์ง€๋งŒ, ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ / ์‚ฝ์ž… / ์‚ญ์ œ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ ์„ฑ๋Šฅ์—์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ์ดํ•ดํ•˜๋ฉด ์ƒํ™ฉ์— ๋งž๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•ด ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ(Linear Data Structure)๋ž€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋œปํ•œ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๋Š” ์•ž๋’ค ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


1. ๋ฐฐ์—ด(Array) 

แ„‡แ…ขแ„‹แ…งแ†ฏ.png๋ฐฐ์—ด์€ ๋™์ผํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•œ๋‹ค. ๊ฐ ์š”์†Œ๋Š” ์ธ๋ฑ์Šค(Index)๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„๋˜๋ฉฐ, ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์š”์†Œ์˜ ํฌ๊ธฐ(Byte)๊ฐ€ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์ž‘ ์ฃผ์†Œ + (์š”์†Œ์˜ ํฌ๊ธฐ x ์ธ๋ฑ์Šค)์„ ๊ณ„์‚ฐํ•˜๋ฉด ํŠน์ • ์š”์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ์š”์†Œ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ์ž„์˜ ์ ‘๊ทผ(Random Access)์ด๋ผ๊ณ  ํ•œ๋‹ค.

public class ArrayExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};

// ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์š”์†Œ ์ ‘๊ทผ
System.out.println(numbers[2]); // 30 ์ถœ๋ ฅ
}
}โ€‹


์ •์  ํ• ๋‹น

๋ฐฐ์—ด์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ ์‹œ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ํฌ๊ธฐ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ์„ฑ ์ดํ›„์—๋Š” ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์—†๋‹ค.

public class ArraySizeExample {
public static void main(String[] args) {
int[] arr = new int[3];

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

// ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
// The final field array.length cannot be assigned
arr.length = 5;
}
}

ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

public class ArrayCopyExample {
public static void main(String[] args) {
int[] arr = new int[3];

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

// ์›ํ•˜๋Š” ํฌ๊ธฐ์˜ ๋ฐฐ์—ด ์ƒ์„ฑ
int[] newArr = new int[5];

// ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}

arr = newArr;
}
}โ€‹


์กฐํšŒ / ์‚ฝ์ž… / ์‚ญ์ œ

๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ž„์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ์›ํ•˜๋Š” ์œ„์น˜์˜ ์š”์†Œ๋ฅผ ๋ฐ”๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐํšŒ ์—ฐ์‚ฐ์€ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

public class ArrayAccessExample {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};

// ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ์š”์†Œ์— ์ ‘๊ทผ
int value = arr[2];

System.out.println(value); // 30 ์ถœ๋ ฅ
}
}

๋ฐ˜๋ฉด ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ ค๋ฉด ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์š”์†Œ๋“ค์„ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

import java.util.Arrays;โ€‹

public class ArrayInsertDeleteExample {
public static void main(String[] args) {
int[] arr = new int[6];

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;

// ์‚ฝ์ž…
int insertIndex = 2;
int insertValue = 25;

for (int i = 4; i >= insertIndex; i--) {
arr[i + 1] = arr[i];
}

arr[insertIndex] = insertValue;

// [10, 20, 25, 30, 40, 50]
System.out.println(Arrays.toString(arr));

// ์‚ญ์ œ
int deleteIndex = 2;

for (int i = deleteIndex; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}

// [10, 20, 30, 40, 50, 50]
// ์‚ญ์ œํ•˜๋”๋ผ๋„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ์œ ์ง€๋˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ๋‚จ์•„์žˆ๋‹ค.
System.out.println(Arrays.toString(arr));
}
}

๋ฐฐ์—ด ์ค‘๊ฐ„ ์œ„์น˜์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋ฉฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

๋ฐ˜๋ฉด ๋ฐฐ์—ด์˜ ๋ ์œ„์น˜์—์„œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์š”์†Œ ์ด๋™์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.


2. ๋™์  ๋ฐฐ์—ด(Dynamic Array)

๋™์  ๋ฐฐ์—ด์€ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฐฐ์—ด์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด์ง€๋ฉด ๋” ํฐ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ณผ์ •์„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ฆ‰, ์•ž์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ๋˜ ๋ฐฐ์—ด ๋ณต์‚ฌ ๊ณผ์ •์„ ๋‚ด๋ถ€์— ๊ฐ์ถ˜ ๊ฒƒ์ด ๋™์  ๋ฐฐ์—ด์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Java์˜ ArrayList, C++์˜ vector, Python์˜ list ๋“ฑ์ด ์žˆ๋‹ค.

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

public class DynamicArrayExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();

// ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ณ„์† ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
numbers.add(10);
numbers.add(20);
numbers.add(30);

// ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ
System.out.println(numbers.get(2)); // 30 ์ถœ๋ ฅ
}
}


๋™์  ํ• ๋‹น

๋™์  ๋ฐฐ์—ด์€ ๋‘ ํฌ๊ธฐ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์‹ค์ œ๋กœ ํ™•๋ณดํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์˜๋ฏธํ•˜๋Š” ์šฉ๋Ÿ‰(Capacity)๊ณผ ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์ธ ํฌ๊ธฐ(Size)๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋‹ค๊ฐ€ ํฌ๊ธฐ๊ฐ€ ์šฉ๋Ÿ‰์— ๋‹ค๋‹ค๋ฅด๋ฉด, ๋” ํฐ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฆฌ์‚ฌ์ด์ง•(Resizing)์ด๋ผ๊ณ  ํ•œ๋‹ค.

import java.util.Arrays;

public class SimpleDynamicArray {
private int[] elements;
private int size;

public SimpleDynamicArray() {
this.elements = new int[4]; // ์ž„์˜์˜ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰
this.size = 0;
}

public void add(int value) {
// ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐจ๋ฉด ํ™•์žฅ
if (size == elements.length) {
grow();
}

elements[size] = value;
size++;
}

private void grow() {
// ๊ธฐ์กด ์šฉ๋Ÿ‰์˜ 2๋ฐฐ
int newCapacity = elemtns.length * 2;

// ๋” ํฐ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌ
elements = Arrays.copyOf(elements, newCapacity);
}
}โ€‹

์ผ๋ฐ˜์ ์œผ๋กœ ์šฉ๋Ÿ‰์„ ๋Š˜๋ฆด ๋• ๋ฐฐ์ˆ˜๋กœ ๋Š˜๋ฆฌ๋Š”๋ฐ, ์ด์œ ๋Š” ๋ฆฌ์‚ฌ์ด์ง• ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฐ๋‹ค๋ฉด ์ „์ฒด ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•ด n ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๋ฐ O(nยฒ)์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

๋ฐ˜๋ฉด ๋ฐฐ์ˆ˜๋กœ ๋Š˜๋ฆฌ๋Š” ๊ฒฝ์šฐ ๋ณต์‚ฌ ๋น„์šฉ์„ ์ „์ฒด ์‚ฝ์ž… ํšŸ์ˆ˜์— ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ ์‚ฝ์ž… ํ•œ ๋ฒˆ๋‹น ํ‰๊ท  O(1)์ด ๋œ๋‹ค.


์กฐํšŒ / ์‚ฝ์ž… / ์‚ญ์ œ

๋™์  ๋ฐฐ์—ด์˜ ๋‚ด๋ถ€๋Š” ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ž„์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์กฐํšŒ๋Š” ๋ฐฐ์—ด๊ณผ ๋™์ผํ•˜๊ฒŒ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

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

public class DynamicArrayAccessExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));

// ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ž„์˜ ์ ‘๊ทผ
int value = numbers.get(2);

System.out.println(value); // 30 ์ถœ๋ ฅ
}
}

์‚ฝ์ž… ์—ญ์‹œ ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” ์š”์†Œ ์ด๋™์ด ์—†์œผ๋ฏ€๋กœ O(1)์ด์ง€๋งŒ, ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐจ ๋ฆฌ์‚ฌ์ด์ง•์ด ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„ ์ „์ฒด ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜ O(n)์ด ๋œ๋‹ค.

์ค‘๊ฐ„ ์œ„์น˜์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋’ค์ชฝ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(n)์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

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

public class DynamicArrayInsertDeleteExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(10, 20, 30, 40, 50));

// ๋ ์œ„์น˜ ์‚ฝ์ž…
numbers.add(60);

// [10, 20, 30, 40, 50, 60]
System.out.println(numbers);

// ์ค‘๊ฐ„ ์œ„์น˜ ์‚ฝ์ž…
numbers.add(2, 25);

// [10, 20, 25, 30, 40, 50, 60]
System.out.println(numbers);

// ์ค‘๊ฐ„ ์œ„์น˜ ์‚ญ์ œ
numbers.remove(2);

// [10, 20, 30, 40, 50, 60]
// ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์‚ญ์ œํ•˜๋ฉด ํฌ๊ธฐ(size)๋„ ํ•จ๊ป˜ ์ค„์–ด๋“ ๋‹ค.
System.out.println(numbers);
}
}

๋ฐฐ์—ด์—์„œ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ด๋„ ํฌ๊ธฐ๊ฐ€ ์œ ์ง€๋˜์–ด ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ๋‚จ์ง€๋งŒ, ๋™์  ๋ฐฐ์—ด์€ ํฌ๊ธฐ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์‚ญ์ œํ•œ ๋งŒํผ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ ๋‹ค. ๋‹ค๋งŒ, ์ด๋•Œ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์€ ํฌ๊ธฐ์ผ ๋ฟ ์šฉ๋Ÿ‰์€ ๊ทธ๋Œ€๋กœ์ด๋ฏ€๋กœ, ํ•œ ๋ฒˆ ๋Š˜์–ด๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ๊ณ„์† ์ ์œ ํ•œ๋‹ค.


3. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋…ธ๋“œ(Node)๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค.

๋…ธ๋“œ๋Š” ์ €์žฅํ•  ๊ฐ’๊ณผ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๋‹ค๋ฃจ๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ(head)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋Š” ๋‹ค์Œ์— ์ด์–ด์งˆ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฐธ์กฐ ๊ฐ’์œผ๋กœ null์ด ๋“ค์–ด๊ฐ„๋‹ค.

public class LinkedListExample {
static class Node {
int data;
Node next;

Node(int data) {
this.data = data;
}
}

public static void main(String[] args) {
Node head = new Node(10);
head.next = new Node(20);
head.next.next = new Node(30);

// head๋ถ€ํ„ฐ next๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์กฐํšŒ
for (Node node = head; node != null; node = node.next) {
System.out.println(node.data); // 10, 20, 30 ์ถœ๋ ฅ
}
}
}

์š”์†Œ๊ฐ€ ํฉ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์ด๋‚˜ ๋™์  ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋‹ค.

์„ธ ๋ฒˆ์งธ ๊ฐ’์„ ์ฝ์œผ๋ ค๋ฉด head์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ˆœ์„œ๋Œ€๋กœ ์ฐธ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์ˆœ์ฐจ ์ ‘๊ทผ(Sequential Access)์ด๋ผ๊ณ  ํ•œ๋‹ค.


๋…ธ๋“œ ๋‹จ์œ„ ํ• ๋‹น

๋ฐฐ์—ด์€ ์ƒ์„ฑ ์‹œ์ ์— ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์ง€๋งŒ, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ๊ทธ ๋…ธ๋“œ์— ํ•„์š”ํ•œ ๊ณต๊ฐ„๋งŒ ํ™•๋ณดํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ๋™์  ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐจ ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฆฌ์‚ฌ์ด์ง•๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹  ๋…ธ๋“œ๋งˆ๋‹ค ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜๋ฏ€๋กœ, ๊ฐ™์€ ๊ฐœ์ˆ˜์˜ ๊ฐ’์„ ๋‹ด์•„๋„ ๋ฐฐ์—ด๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.


์กฐํšŒ / ์‚ฝ์ž… / ์‚ญ์ œ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํšŒ๋Š” head๋ถ€ํ„ฐ ์ฐธ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

public class LinkedListAccessExample {
static class Node {
int data;
Node next;

Node(int data) {
this.data = data;
}
}

public static void main(String[] args) {
Node head = new Node(10);
head.next = new Node(20);
head.next.next = new Node(30);

// ์„ธ ๋ฒˆ์งธ ๊ฐ’์„ ์ฝ์œผ๋ ค๋ฉด head๋ถ€ํ„ฐ ๋‘ ๋ฒˆ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
Node current = head;
for (int i = 0; i < 2; i++) {
current = current.next;
}

System.out.println(current.data); // 30 ์ถœ๋ ฅ
}
}

๋ฐ˜๋ฉด ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์ฐธ์กฐ๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๋ฏ€๋กœ ์š”์†Œ๋ฅผ ์ด๋™ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

public class LinkedListInsertDeleteExample {
static class Node {
int data;
Node next;

Node(int data) {
this.data = data;
}
}

public static void main(String[] args) {
Node head = new Node(10);
head.next = new Node(20);
head.next.next = new Node(30);

// ์‚ฝ์ž…
Node prev = head.next;
Node newNode = new Node(25);

newNode.next = prev.next;
prev.next = newNode;

// 10, 20, 25, 30
print(head);

// ์‚ญ์ œ
prev.next = prev.next.next;

// 10, 20, 30
print(head);
}

private static void print(Node head) {
for (Node node = head; node != null; node = node.next) {
System.out.print(node.data + " ");
}

System.out.println();
}
}


๋‹จ์ผ / ์ด์ค‘ / ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์œ„์™€ ๊ฐ™์ด ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ˜•ํƒœ๋ฅผ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Singly Linked List)๋ผ๊ณ  ํ•œ๋‹ค.

์ด์™ธ์—๋„ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Doubly Linked List)๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ํ•˜๋‚˜ ๋” ๊ฐ€์ง„๋‹ค. ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‚ญ์ œํ•  ๋…ธ๋“œ ํ•˜๋‚˜๋งŒ ์•Œ๋ฉด ์•ž๋’ค๋กœ ๋ฐ”๋กœ ์ด์–ด๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. Java์˜ LinkedList๊ฐ€ ์ด ๋ฐฉ์‹์ด๋‹ค.

์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Circular Linked List)๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ null ๋Œ€์‹  head๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋์— ๋„๋‹ฌํ•ด๋„ ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„์˜ค๋ฏ€๋กœ ์ˆœ๋ฒˆ์„ ๋Œ์•„๊ฐ€๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์— ์ ํ•ฉํ•˜๋‹ค.

import java.util.LinkedList;
import java.util.List;

public class JavaLinkedListExample {
public static void main(String[] args) {
LinkedList<Integer>โ€‹ numbers = new LinkedList<>(List.of(10, 20, 30));

// ๋งจ ์•ž ์‚ฝ์ž…๋„ ์š”์†Œ ์ด๋™ ์—†์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.
numbers.addFirst(5);

// [5, 10, 20, 30]
System.out.println(numbers);
}
}
์ด์ „ ๊ธ€
(ยท . ยท ) ์ด์ „ ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค
๋‹ค์Œ ๊ธ€
๐Ÿ‘พ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ณธ ๋ช…๋ น์–ด ์ •๋ฆฌ
์žฅ์‹์šฉ ๋กœ๊ณ