๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ธฐ์ˆ ์Šคํƒ/CS

[์ž๋ฃŒ๊ตฌ์กฐ] ๋ฐฐ์—ด(Array)๊ณผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)

๐Ÿ“Œ ๋ฐฐ์—ด


๐Ÿ” ๋ฐฐ์—ด(Array)์ด๋ž€?

๋ฐฐ์—ด์€ CRUD๋ฅผ ํ•  ๋•Œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ƒ์„ฑํ•  ๋•Œ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ณ  ๊ฐ ์ž๋ฆฌ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค. ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์— ์žˆ๋Š” ์š”์†Œ๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋ฐฐ์—ด์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ๋ฑ์Šค(index)์™€ ์š”์†Œ(elements)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๋ฐฐ์—ด์˜ ์žฅ์ 

๋ฐฐ์—ด์€ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ”๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

int[] numArr = { 1, 2, 3, 4, 5 };

์™€ ๊ฐ™์ด ๋ฐฐ์—ด์€ ๋ฐ”๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒŒ ์ตœ๊ณ  ์žฅ์ ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์ด ์‘์šฉ๋˜์–ด ์Šคํƒ์ด๋‚˜ ํ ๊ฐ™์€๊ฒƒ๋“ค์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์€ ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด CRUD๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ •๋ ฌํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๋Š”๋‹ค.

๋ฐฐ์—ด์˜ ๋‹จ์ 

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

๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์†Œ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ์‚ฌ์ง„์˜ ๋ฐฐ์—ด์—์„œ 1๋ฒˆ์งธ์™€ 2๋ฒˆ์งธ ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋ฐฐ์—ด์€ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๊ณ  ์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์žฌ์ง€์ •ํ•ด์ฃผ๊ณ  ๋งจ ๋’ค๋กœ ๋“ค์–ด๊ฐ„ ์ƒˆ๋กœ ์ž…๋ ฅ๋ฐ›์€ ์š”์†Œ๋ฅผ 1๋ฒˆ์งธ์™€ 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ์‚ฌ์ด๊นŒ์ง€ ๋‹น๊ฒจ์™€์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

๋ฐฐ์—ด ์‚ฌ์šฉ ์˜ˆ์‹œ

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        int[] numArr = new int [5];
        // ์ธ๋ฑ์Šค์— ์ง์ ‘ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•
        numArr[0] = 1;
        numArr[1] = 2;
        numArr[2] = 3;
        numArr[3] = 4;
        numArr[4] = 5;

        System.out.println(Arrays.toString(numArr));

        // for loop๋กœ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•
        String[] strArr = new String [5];
        for (int i = 0; i < strArr.length; i++) {
            strArr[i] = Integer.toString(i+1);
        }

        System.out.println(Arrays.toString(strArr));

        // ๊ฐ’ ์‚ญ์ œ
        numArr[0] = 0;      // 0์œผ๋กœ ์ดˆ๊ธฐํ™”

        // ๋˜๋Š”
        for (int i = 0; i < numArr.length; i++) {
            numArr[i] = 0;
        }

        // fill ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
        Arrays.fill(numArr, 0);

        // Null ์ฐธ์กฐ ์„ค์ •
        numArr = null;

    }
}

๐Ÿ“Œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)


๐Ÿ” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ž€?

์•ž์„œ ์†Œ๊ฐœํ•œ ๋ฐฐ์—ด๊ณผ ์Šคํƒ, ํ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ๋ฐฐ์น˜์— ์˜์กดํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ Linked List๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ๋ฐฐ์น˜์— ์˜์กด์ ์ด์ง€ ์•Š๋‹ค(์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค).

๋ฐฐ์—ด์˜ index๋‚˜ ํ/์Šคํƒ์˜ ์œ„์น˜ ๊ฐœ๋…๋ณด๋‹ค ์ฐธ์กฐ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ ์š”์†Œ๋“ค์€ Node๋ผ๋Š” ๊ฒƒ์— ์ €์žฅ๋œ๋‹ค.

์ด๋Š” ๋‹ค์Œ Node ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ๋˜๋Š” ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋œ ๋˜ ๋‹ค๋ฅธ Node์— ์ €์žฅ๋œ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ณต๊ฐ„์ธ Data Field(๋ฐ์ดํ„ฐ ํ•„๋“œ)์™€ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” Link Field(๋งํฌ ํ•„๋“œ)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ด ์ „์ฒด๋ฅผ Node๋กœ ๋ณธ๋‹ค.

Node๋Š” ์ตœ์†Œ ๋‘ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ์ „์ œ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” Node์˜ ๊ฐ’๊ณผ ๋‹ค์Œ Node์˜ ๊ฐ’์ด๋‹ค. ๊ฐ๊ฐ์˜ Node๊ฐ€ ๋‹ค์Œ Node๋ฅผ ์•Œ๊ณ  ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋ชจ์ž„์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋น„์Šทํ•œ ์ด๋ฆ„์˜ ArrayList๋Š” Node๋ผ๋Š” ์ฒด๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๊ธฐ ๋ณด๋‹ค ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ์‹œ ์žฌ๊ตฌ์„ฑ์„ ํ•˜์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ Node๋ผ๋ฆฌ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ์œจ์ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์žฅ์ 

์šฐ์„  ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ Node๊ฐ€ ์•Œ์•„์„œ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด๋‹ค.
๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ์œ„์น˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ CRUD๊ฐ„ ๊ตฌ์กฐ์˜ ์žฌ๊ตฌ์„ฑ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
๋ฐฐ์—ด์ฒ˜๋Ÿผ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์œ ์—ฐํ•˜๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋‹จ์ 

๋ฐฐ์—ด๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๊ฒ€์ƒ‰ ์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.
์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ Node๋ฅผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ

import java.util.LinkedList;

public class Main {

    public static void main(String[] args) {

        // ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”
        LinkedList<Integer> list = new LinkedList<>();

        // ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        // ์กฐํšŒ
        System.out.println(list);

        // ๊ฐ’ ์‚ญ์ œํ•˜๊ธฐ
        list.remove(0);     // 0๋ฒˆ์งธ ๊ฐ’ ์‚ญ์ œ
        System.out.println(list);   // 2, 3, 4, 5

        // ๊ฐ’ ์กฐํšŒ
        System.out.println(list.get(1));    // 1๋ฒˆ์งธ ๊ฐ’ ์ถœ๋ ฅ : 3

    }
}