[24.10.08] TIL

yy·2024년 10월 8일

개발일지

목록 보기
119/122

java 공부중

배열

  • 순서가 있고 중복을 허용. 크기 정적 고정.

  • 인덱스 검색 : 필요한 인덱스의 값을 빨리 찾을 수 있음. (참조값(주소값)을 계산해서 접근하기때문)

  • 데이터 검색: 배열의 크기만큼의 연산 시간이 걸림

  • 데이터를 추가할 때 위치에 따라 성능 변화가 발생

    • 배열의 첫번째 위치에 추가 : O(n) ( 모든 데이터를 배열의 크기만큼 한 칸씩 이동)
    • 배열의 중간위치에 추가 : O(n) (인덱스 오른쪽에 있는 데이터 모두 한 칸씩 이동)
    • 배열의 마지막 위치에 추가 : O(1) (맨 끝에만 추가하면 되어 기존 배열 이동 X)
  • 배열의 길이가 고정임.

=> 길이가 동적으로 변하고, 데이터 추가하기 편하면 좋겠다 -> 리스트

리스트

  • 순서가 있고 중복을 허용. 크기 동적 변경.

  • 리스트 자료구조를 사용하며, 내부의 데이터는 배열에 보관

package collection.array;

public class MyArrayListV3Main {
    public static void main(String[] args) {
        MyArrayListV3 list = new MyArrayListV3();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);

        System.out.println("addLast");
        list.add(3, "addLast");
        System.out.println(list);

        System.out.println("addFirst");
        list.add(0, "addFirst");
        System.out.println(list);

        Object removed1 = list.remove(4);
        System.out.println("removed(4) = " + removed1);
        System.out.println(list);

        Object removed2 = list.remove(0);
        System.out.println("removed(0) = " + removed2);
        System.out.println(list);
    }
}
package collection.array;

public class MyArrayListV3Main {
    public static void main(String[] args) {
        MyArrayListV3 list = new MyArrayListV3();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);

        System.out.println("addLast");
        list.add(3, "addLast");
        System.out.println(list);

        System.out.println("addFirst");
        list.add(0, "addFirst");
        System.out.println(list);

        Object removed1 = list.remove(4);
        System.out.println("removed(4) = " + removed1);
        System.out.println(list);

        Object removed2 = list.remove(0);
        System.out.println("removed(0) = " + removed2);
        System.out.println(list);
    }
}

=> 위의 코드에서는 타입 안전성일 떨어짐. 제네릭을 이용하면 타입의 안전성을 확보할 수 있음

package collection.array;

public class MyArrayListV4Main {
    public static void main(String[] args) {
        MyArrayListV4<String> stringList = new MyArrayListV4<>();

        stringList.add("a");
        stringList.add("b");
        stringList.add("c");
        String string = stringList.get(0);
        System.out.println("string = " + string);

        MyArrayListV4<Integer> intList = new MyArrayListV4<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);
        Integer integer = intList.get(0);
        System.out.println("integer = " + integer);
    }
}
package 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;
        size++;
    }

    public void add(int index, E e) {
        if (size == elementData.length) {
            grow();
        }
        shiftRigthFrom(index);
        elementData[index] = e;
        size++;
    }

    private void shiftRigthFrom(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 E remove(int index) {
        E oldValue = get(index);
        shiftLeftFrom(index);

        size--;
        elementData[size] = null;
        return oldValue;
    }

    private void shiftLeftFrom(int index) {
        for (int i = index; i < size - 1; i++) {
            elementData[i] = elementData[i + 1];
        }
    }

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

    public E set(int index, E element) {
        E oldValue = get(index);
        elementData[index] = element;
        return oldValue;
    }

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

    @Override
    public String toString() {
        return Arrays.toString(Arrays.copyOf(elementData, size)) + " size=" + size + ", capacity=" + elementData.length;
    }
}

=> 배열 리스트는 순서대로 마지막에 데이터를 추가하거나 삭제할 때는 성능이 좋지만 앞이나 중간에 데이터를 추가하러나 삭제할 때는 성능이 좋지 않음
-> 단점 해결한 링크드 리스트

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글