BACKEND/Data Structure & Algorithm

선형자료구조 - Array / ArrayList

우진하다 2023. 5. 15. 00:09

배열(Array).

  • 많은 수의 데이터를 다룰 때 자료를 순차적으로 관리하는 자료구조
  • 각 데이터를 인덱스와 1:1 대응하도록 구성
  • 데이터가 메모리 상에 연속적으로 저장되어 물리적 위치와 논리적 위치가 동일

 

배열의 선언과 초기화.

  • 배열의 선언
자료형[] 배열 이름 = new 자료형[데이터 개수];
자료형 배열 이름[] = new 자료형[데이터 개수];
int[] numbers = new int[10];
  • 인덱스 연산
    []는 배열 처음 선언 시 사용한 연산자로 배열 이름에 []를 사용하는 것을 인덱스 연산이라고 함
    배열 요소의 저장된 메모리 위치를 찾아 주는 역할로
    numbers[0] 은 numbers 배열의 0번째 인덱스 요소 값에 접근하는 것

  • 배열의 초기화
    배열을 선언하면 그와 동시에 각 요소의 값이 초기화 됨
    정수는 0, 실수는 0.0, 객체 배열은 null로 초기화
        int[] memberIDs = new int[] {101, 102, 103}; // 배열 개수 생략
        int[] nums = {1, 2, 3}; // new int[] 생략 가능
        int[] ids; // 배열 자료형 선언 후
        ids = new int[] {1, 2, 3, 4, 5}; // 배열 할당, new int[] 생략 불가

 

  • 배열의 출력
    배열 객체를 그냥 출력하면 메모리상의 주소값을 반환하기 때문에
    반복문이나 Arrays 클래스 내 메서드를 사용해 출력할 수 있다.
        System.out.println(numbers); // [I@2f92e0f4 [I - 배열 int, @다음부터 주소값
        // 반복문으로 직접 배열 원소 출력
        for(int i = 0 ; i < numbers.length; i++){
            System.out.print(numbers[i] + " ");
        }
        System.out.println();

        // Arrays.toString() 메서드 사용해 출력
        System.out.println(Arrays.toString(numbers)); // [100, 95, 80, 70, 60]
  • 배열의 장점
    인덱스를 이용해 데이터에 빠르게 접근할 수 있음
    마지막 추가 인덱스 추가 및 삭제 시 빠르다.
  • 배열의 단점
    정적 사이즈로 사이즈 불변. 
    가변 길이 배열은 배열의 크기를 변경할 때마다 새로운 배열을 생성
    데이터의 삽입 / 추가 / 삭제 시 새로운 배열을 생성해야하기 때문에 번거롭다

  • 배열의 특징
    Primitive type과 Object 둘다 가능
    Generic 타입은 불가

 

ArrayList.

  • 배열의 불편함을 개선하기 위해 ArrayList 사용
  • Collection <- List <- Vector, ArrayList, LinkedList

ArrayList 주요 메서드

  • 생성자
        ArrayList<Integer> intArrayList = new ArrayList<>(); // 기본 크기가 10인 배열 생성
        System.out.println(intArrayList.size()); // 0
        ArrayList<String> stringArrayList = new ArrayList<>(15); // 기본 크기를 지정, 다 차면 기본 크기만큼 사이즈 증가
        System.out.println(stringArrayList.size()); // 0
  • 주요 메서드
        // add, add(index, value)
        stringArrayList.add("Mike");
        stringArrayList.add(0, "James");
        System.out.println(stringArrayList); // [James, Mike]

        // get 해당 인덱스 값 반환
        String str = stringArrayList.get(0);
        String str1 = stringArrayList.get(1);
        System.out.println(str); // James
        System.out.println(str1); // Mike

        // set 인덱스로 값 변경
        stringArrayList.set(0, "Kiki");
        System.out.println(stringArrayList); // [Kiki, Mike]

        // indexOf 값을 제공하면 해당 값의 첫번째 인덱스를 반환
        stringArrayList.add("AA");
        stringArrayList.add("BB");
        stringArrayList.add("AA");
        System.out.println(stringArrayList); // [Kiki, Mike, AA, BB, AA]
        System.out.println(stringArrayList.indexOf("AA")); // 2

        // lastIndexOf 해당 값의 마지막 인덱스 반환
        System.out.println(stringArrayList.lastIndexOf("Kiki")); // 0
        System.out.println(stringArrayList.lastIndexOf("AA")); // 4

        // remove(index), remove(value) 해당 인덱스 삭제, 해당 데이터 중 첫번째 값 삭제
        stringArrayList.remove(0);
        System.out.println(stringArrayList); // [Mike, AA, BB, AA]
        stringArrayList.remove("AA");
        System.out.println(stringArrayList); // // [Mike, BB, AA]

        // contains(value) 값을 포함하는지 boolean으로 반환
        System.out.println(stringArrayList.contains("BB")); // true
        System.out.println(stringArrayList.contains("CC")); // false

        // clear() 모두 삭제, isEmpty 배열 비었는지 확인
        stringArrayList.clear();
        System.out.println(stringArrayList.isEmpty()); // true

        // size() 요소 개수 반환
        System.out.println(stringArrayList.size()); // 0

 

Array와 ArrayList의 차이

  • Array
    사이즈 정적 / Primitive type, Object type 가능 / Generic 불가 / 초기화 시 메모리 할당 / 편의 기능 없음
  • ArrayList
    사이즈 동적 / Object type / Generic 가능 / 런타임 시 add와 같은 기능은 메모리 재할당으로 배열보다 느림, 접근성 동일 / 
    편의기능이 있음