본문 바로가기

자료구조

[자료구조] Array 배열

728x90

배열이란?

배열은 동일한 타입의 여러 값을 하나의 변수에 묶어서 저장하는 자료구조입니다. 각 값을 별도로 저장하는 대신, 하나의 변수로 여러 값을 관리할 수 있습니다.

 

배열의 특징

  1. 크기 조정 불가
    배열은 선언된 순간부터 크기를 변경할 수 없습니다. 크기를 변경하고 싶다면 새로운 배열을 생성한 후, 기존 배열의 요소를 새 배열에 복사해야 합니다.
  2. 요소에 빠른 접근
    배열은 인덱스를 통해 각 요소에 빠르게 접근할 수 있습니다. 요소 접근의 시간 복잡도는 O(1)로 매우 빠릅니다. 배열은 반복문을 사용하여 요소에 쉽게 접근할 수 있는 자료구조입니다.
  3. 인덱스는 0부터 시작
    배열의 인덱스는 0부터 시작합니다. 즉, 배열의 첫 번째 요소는 인덱스 0에 위치하며, 마지막 요소는 배열 크기에서 1을 뺀 인덱스에 위치합니다.
  4. 배열의 마지막 인덱스는 n-1
    배열의 마지막 요소는 배열의 크기 - 1 인덱스에 위치합니다. 예를 들어, 배열의 크기가 5라면 마지막 인덱스는 4입니다.

배열 선언

배열은 대괄호 []를 사용하여 선언합니다. 배열을 초기화할 때는 배열의 크기를 지정해야 하며, 크기를 지정하지 않으면 오류가 발생합니다.

public class Main {
    public static void main(String[] args) {
        int[] arr1 = new int[3];  // 크기가 3인 정수형 배열
        int[] arr2 = {1, 2, 3, 4};  // 크기가 4인 정수형 배열
        String[] arr3 = new String[5];  // 크기가 5인 문자열 배열
        char[] arr5;
        arr5 = new char[10];  // 크기가 10인 문자 배열
        boolean[] arr4 = new boolean[];  // 오류 발생 (크기 미지정)
    }
}

 

배열 요소 접근

배열의 요소에 접근하려면 배열 변수명 뒤에 대괄호 []를 붙이고, 그 안에 인덱스를 넣으면 됩니다. 인덱스는 0부터 시작합니다.

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        
        System.out.println(arr[0]);  // 첫 번째 요소 출력
        System.out.println(arr[2]);  // 세 번째 요소 출력
    }
}

주의: 배열의 크기를 벗어난 인덱스에 접근하면 ArrayIndexOutOfBoundsException 예외가 발생합니다.

 

배열 요소 값 변경

배열의 요소는 인덱스를 통해 접근한 후 값을 변경할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        System.out.println("변경 전");
        System.out.println(arr[0]);

        arr[0] = 10;  // 첫 번째 요소 값을 10으로 변경

        System.out.println("변경 후");
        System.out.println(arr[0]);
    }
}

 

반복문을 사용하여 배열의 모든 요소 접근

반복문을 사용하여 배열의 모든 요소에 접근할 수 있습니다. 배열의 크기는 arr.length로 얻을 수 있습니다.

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

 

반복문을 사용하여 배열의 모든 요소 값 변경

반복문을 사용하여 배열의 각 요소의 값을 변경할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] * 10;  // 각 요소의 값을 10배로 변경
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);  // 변경된 값 출력
        }
    }
}

 

 

 

배열은 왜 0부터 시작일까요?

배열은 참조 자료형입니다. 배열의 변수명(예: arr)은 실제로 메모리의 주소값을 참조하고 있으며, 이 주소값을 통해 배열의 요소들이 저장된 위치를 확인할 수 있습니다. 배열의 요소들은 메모리 상에 순차적으로 저장되며, 각 요소의 위치는 메모리 주소로 관리됩니다.

참조 자료형과 기본 자료형의 차이

기본 자료형은 값 자체를 저장하는 반면, 참조 자료형은 메모리 주소를 저장합니다. 이는 아래 예시에서 확인할 수 있습니다.

기본 자료형 예시

public class Main {
    public static void main(String[] args) {
        int n1 = 10;
        int n2 = n1;
        
        n2 = 100;
        
        System.out.println(n1); // 10
        System.out.println(n2); // 100
    }
}

위 코드에서 n1과 n2는 독립적인 값으로 저장되며, 하나의 값이 변경되어도 다른 값에 영향을 미치지 않습니다.

참조 자료형 예시

public class Main {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4};
        int[] arr2 = arr1;
        
        arr2[0] = 100;
        
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]); // 100, 2, 3, 4
        }
        
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]); // 100, 2, 3, 4
        }
    }
}

위 코드에서는 arr2[0]을 변경하자 arr1[0]의 값도 함께 변경되었습니다. 이는 배열이 메모리 주소를 참조하고 있기 때문에 발생한 현상입니다.

메모리 주소 확인

public class Main {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4};
        int[] arr2 = arr1;
        
        arr2[0] = 100;
        
        // 주소값 확인하기
        System.out.println(arr1); // [I@some_address
        System.out.println(arr2); // [I@some_address
    }
}

실제로 arr1과 arr2가 동일한 메모리 주소를 가지고 있음을 확인할 수 있습니다.

쉽게 생각하기

배열은 참조 자료형으로, 집 주소를 가지고 있다고 생각할 수 있습니다. arr2가 arr1의 집 주소를 복사하여 같은 집 주소를 가지게 되었고, arr2가 집 인테리어를 바꾸면 arr1도 영향을 받는다고 이해하면 됩니다.

값 복사 방법

주소가 아닌 값을 복사하려면 두 가지 방법을 사용할 수 있습니다.

1. 새로운 배열을 생성하고 for문을 사용하여 요소 복사

public class Main {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4};
        int[] arr2 = new int[arr1.length];
        
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        
        arr2[0] = 100;
        
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]); // 1, 2, 3, 4
        }
        
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]); // 100, 2, 3, 4
        }
    }
} 

2. Arrays.copyOf 메소드 사용하여 복사

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4};
        int[] arr2 = Arrays.copyOf(arr1, arr1.length);
        
        arr2[0] = 100;
        
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]); // 1, 2, 3, 4
        }
        
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]); // 100, 2, 3, 4
        }
    }
}

위 방법을 사용하면 배열의 각 요소 값을 복사하여, 원본 배열과는 독립적인 배열을 생성할 수 있습니다.

728x90

'자료구조' 카테고리의 다른 글

[자료구조] 여러가지 배열 종류  (0) 2024.10.31
[자료구조] 큐(Queue)  (0) 2024.10.12
[자료구조] 스택(Stack) Java 예제 포함  (1) 2024.10.11
[자료구조] Linked List  (0) 2024.08.15