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

์ž๋ฐ” ์ค‘๊ธ‰ 2ํŽธ - ArrayList(3)

by KongJiHoon 2025. 7. 20.

๐Ÿ“Œ ์ œ๋„ค๋ฆญ์ด๋ž€?

  • ์ž๋ฐ”์˜ ์ œ๋„ค๋ฆญ(Generic)์€ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐํ™”ํ•˜์—ฌ, ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ํƒ€์ž…์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ํ˜•๋ณ€ํ™˜์„ ์ค„์ด๋Š” ์žฅ์ ์ด ์žˆ๋‹ค

MyArrayListV3

package com.example.collection.array;

import java.util.Arrays;

public class MyArrayListV3 {


    private static final int DEFAULT_CAPACITY = 5;

    private Object[] elementData;

    private int size = 0;

    public MyArrayListV3() {
        elementData = new Object[DEFAULT_CAPACITY];
    }

    public MyArrayListV3(int initialCapacity) {
        elementData = new Object[initialCapacity];
    }

    public int size() {
        return size;
    }

    public void add(Object e) {

        // ์ฝ”๋“œ ์ถ”๊ฐ€
        if (size == elementData.length) {

            grow();

        }

        elementData[size++] = e;

    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€
    public void add(int index, Object e) {
        if (size == elementData.length) {

            grow();

        }

        // ๋ฐ์ดํ„ฐ ์ด๋™

        shiftRightFrom(index);

        elementData[index] = e;
        size++;
    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€, ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰๋ถ€ํ„ฐ index๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
    private void shiftRightFrom(int index) {

        for (int i = size; i > index ; i--) {
            elementData[i] = elementData[i - 1];
        }


    }



    // ์ฝ”๋“œ ์ถ”๊ฐ€
    private void grow() {
        int oldCapacity = elementData.length;
        int newCapacity =oldCapacity * 2;

        // ๋ฐฐ์—ด์„ ์ƒˆ๋กœ๋งŒ๋“ค๊ณ , ๊ธฐ์กด ๋ฐฐ์—ด์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋ณต์‚ฌ


        elementData = Arrays.copyOf(elementData, newCapacity);
    }


    public Object get(int index) {
        return elementData[index];
    }

    public Object set(int index, Object e) {

        Object oldValue = get(index);

        elementData[index] = e;

        return oldValue;
    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€
    public Object remove(int index) {

        Object oldValue = get(index);

        // ๋ฐ์ดํ„ฐ ์ด๋™
        shiftLeftFrom(index);

        size--;

        elementData[size] = null;
        return oldValue;

    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€ ์š”์†Œ์˜ index๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
    private void shiftLeftFrom(int index) {


        for (int i = index; i < size - 1; i++) {

            elementData[i] = elementData[i + 1];

        }


    }

    public int indexOf(Object o) {

        for (int i = 0; i < size; i++) {
            if (o.equals(elementData[i])) {
                return i;
            }
        }

        return -1;
    }

    public String toString() {

        return Arrays.toString(Arrays.copyOf(elementData, size)) + " size = " + size + ", capacity = " + elementData.length;

    }


}

 

V3์˜ ํ•œ๊ณ„: Object ํƒ€์ž…์˜ ๋ฌธ์ œ

MyArrayListV3 numberList = new MyArrayListV3();
numberList.add(1);
numberList.add(2);
numberList.add("๋ฌธ์ž3"); // ์ž˜๋ชป๋œ ํƒ€์ž… ์ž…๋ ฅ ๊ฐ€๋Šฅ

 

  • Object๋กœ ๋ชจ๋“  ํƒ€์ž… ํ—ˆ์šฉ → ํƒ€์ž… ํ˜ผ๋™ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๋•Œ ํ˜•๋ณ€ํ™˜(๋‹ค์šด์บ์ŠคํŒ…) ํ•„์ˆ˜ → ClassCastException ์œ„ํ—˜

 

 

โœ… V4: ์ œ๋„ค๋ฆญ ์ ์šฉ (MyArrayListV4)

 

package com.example.collection.array;

import java.util.Arrays;

public class MyArrayListV4<E> {


    private static final int DEFAULT_CAPACITY = 5;

    private Object[] elementData;

    private int size = 0;

    public MyArrayListV4() {
        elementData = new Object[DEFAULT_CAPACITY];
    }

    public MyArrayListV4(int initialCapacity) {
        elementData = new Object[initialCapacity];
    }

    public int size() {
        return size;
    }

    public void add(E e) {

        // ์ฝ”๋“œ ์ถ”๊ฐ€
        if (size == elementData.length) {

            grow();

        }

        elementData[size++] = e;

    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€
    public void add(int index, E e) {
        if (size == elementData.length) {

            grow();

        }

        // ๋ฐ์ดํ„ฐ ์ด๋™

        shiftRightFrom(index);

        elementData[index] = e;
        size++;
    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€, ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰๋ถ€ํ„ฐ index๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
    private void shiftRightFrom(int index) {

        for (int i = size; i > index ; i--) {
            elementData[i] = elementData[i - 1];
        }


    }



    // ์ฝ”๋“œ ์ถ”๊ฐ€
    private void grow() {
        int oldCapacity = elementData.length;
        int newCapacity =oldCapacity * 2;

        // ๋ฐฐ์—ด์„ ์ƒˆ๋กœ๋งŒ๋“ค๊ณ , ๊ธฐ์กด ๋ฐฐ์—ด์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋ณต์‚ฌ


        elementData = Arrays.copyOf(elementData, newCapacity);
    }


    @SuppressWarnings("unchecked")
    public E get(int index) {
        return (E) elementData[index];
    }

    public E set(int index, Object e) {

        E oldValue = get(index);

        elementData[index] = e;

        return oldValue;
    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€
    public E remove(int index) {

        E oldValue = get(index);

        // ๋ฐ์ดํ„ฐ ์ด๋™
        shiftLeftFrom(index);

        size--;

        elementData[size] = null;
        return oldValue;

    }

    // ์ฝ”๋“œ ์ถ”๊ฐ€ ์š”์†Œ์˜ index๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
    private void shiftLeftFrom(int index) {


        for (int i = index; i < size - 1; i++) {

            elementData[i] = elementData[i + 1];

        }


    }

    public int indexOf(E o) {

        for (int i = 0; i < size; i++) {
            if (o.equals(elementData[i])) {
                return i;
            }
        }

        return -1;
    }

    public String toString() {

        return Arrays.toString(Arrays.copyOf(elementData, size)) + " size = " + size + ", capacity = " + elementData.length;

    }


}

 

 

  • E๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ (๋ณดํ†ต Element์˜ ์ค„์ž„๋ง)
  • ๋‚ด๋ถ€๋Š” ์—ฌ์ „ํžˆ Object[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ž…๋ ฅ/์ถœ๋ ฅ ์‹œ ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด

 

โš ๏ธ ์™œ Object ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ์“ธ๊นŒ?

// ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ
E[] elementData = new E[DEFAULT_CAPACITY]; // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜

// ์‹ค์ œ ๊ตฌํ˜„
Object[] elementData = new Object[DEFAULT_CAPACITY];

 

 

  • ์ž๋ฐ”์˜ ์ œ๋„ค๋ฆญ์€ ํƒ€์ž… ์†Œ๊ฑฐ(type erasure) ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ
  • ๋”ฐ๋ผ์„œ Object[]๋กœ ์ƒ์„ฑํ•˜๊ณ  get์‹œ ๊ฐ•์ œ ์บ์ŠคํŒ… → ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๋ ค๋ฉด E ํƒ€์ž…๋งŒ ๋„ฃ๋„๋ก ์ œํ•œ

 

๐Ÿงน ์„ฑ๋Šฅ & ๋‹จ์  ์ •๋ฆฌ

์—ฐ์‚ฐ ์‹œ๊ฐ„๋ณต์žก๋„
๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ O(1)
์•ž/์ค‘๊ฐ„์— ์ถ”๊ฐ€ O(n)
๋งˆ์ง€๋ง‰์— ์‚ญ์ œ O(1)
์•ž/์ค‘๊ฐ„์— ์‚ญ์ œ O(n)
์ธ๋ฑ์Šค ์กฐํšŒ O(1)
๊ฐ’ ๊ฒ€์ƒ‰ O(n)

๋‹จ์ 

  1. ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ → ์ดˆ๊ธฐ ํฌ๊ธฐ ์„ค์ • ์–ด๋ ค์›€ (ํฌ๊ธฐ ์ดˆ๊ณผ ์‹œ grow ํ•„์š”)
  2. ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์‹œ ๋ฐ์ดํ„ฐ ์ด๋™ ํ•„์š” → O(n)

 

์ถœ์ฒ˜: ์ธํ”„๋Ÿฐ ์ž๋ฐ” ์ค‘๊ธ‰ 2ํŽธ - ๊น€์˜ํ•œ