YunDev

[자료구조와 알고리즘] 배열, 최댓값 본문

자료구조와 알고리즘

[자료구조와 알고리즘] 배열, 최댓값

S준 2025. 1. 15. 14:27

배열은 같은 자료형의 변수로 이루어진 구성 요소가 모인 것입니다. 배열 구성 요소의 자료형은 int, double 어떤 형이든 상관없이 각각의 배열의 원소는 같은 자료형입니다.

int[] array = new int[5];

이러한 방식으로 배열 변수 선언과 참조할 본체 선언을 같이 할 수 있습니다. 배열의 구성 요소는 자동으로 0으로 초기화됩니다.

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

만약 초깃값을 주고 싶은 경우 요솟수를 제외하고 {} 사이의 값을 넣어줄 수도 있습니다.


int[] a = new int[] {1, 2, 3, 4, 5};
int[] b = a.clone();

이 수식은 배열을 복제하고 복제한 배열에 대한 참조를 생성합니다. b 배열의 원소는 a의 복제이기 때문에 전부 같지만 두 배열은 독립된 메모리 공간을 사용하기 때문에 b의 내부 값을 변경한다고 a 배열의 변경이 이루어지지 않습니다. (deep copy)

다음은 입력받을 요소의 갯수를 먼저 입력받고 배열의 값을 순차적으로 입력받은 뒤 최댓값을 구하는 코드입니다.

package org.example;
import java.util.Scanner;
public class Array {

    static int MaxArray(int height[]) {

        int max = height[0];
        for(int i = 0; i < height.length; i++) { //최댓값 구하기
            if(height[i] > max) {
                max = height[i];
            }
        }
        return max;
    }
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.print("입력하고자 할 원소의 수: ");
        int N = sc.nextInt();
        int height[] = new int[N];
        for(int i = 0; i <N; i++) {
            System.out.print((i+1)+":");
            height[i] = sc.nextInt();
        }

        int Max = MaxArray(height); //매개변수로 배열을 전달함


       System.out.println("현재 배열의 최댓값은: "+ Max);
    }
}

Java에서 배열은 객체로 취급되며, 배열을 매개변수로 메서드에 넘길 때 배열의 메모리 주소가 전달됩니다. 이를 통해 메서드 내부에서 배열에 접근하고, 배열의 내용을 변경하면 원래 배열에도 반영됩니다.

static void ModifyArray(int[] arr) {
    arr[0] = 999; // 첫 번째 원소를 999로 변경
}

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

    System.out.println("Before: " + example[0]); // 출력: 1
    ModifyArray(example);
    System.out.println("After: " + example[0]); // 출력: 999
}

배열을 메서드에 넘기면, 메모리 주소(참조)가 전달됩니다. 메서드 내부에서 배열의 내용을 수정하면, 원래 배열에도 반영됩니다. 하지만 새로운 배열을 생성하거나, 참조 자체를 바꾼다고 해서 원래 배열에 영향을 미치지는 않습니다.

static void ChangeReference(int[] arr) {
    arr = new int[] {10, 20, 30}; // 새로운 배열 생성
}

public static void main(String[] args) {
    int[] example = {1, 2, 3, 4, 5};
    ChangeReference(example);
    System.out.println(example[0]); // 여전히 1
}

배열의 참조를 변경하면 메서드 내부에서만 참조가 변경되고, 원본 배열은 영향을 받지 않습니다.

  • 참조를 통해 배열의 요소를 수정하는 것은, 다른 사람이 "집 주소"를 알려줘서 그 집에 가구를 바꾼 것과 같습니다. 집 주소는 같으니, 변경 사항이 반영됩니다.
  • 참조 자체를 변경하는 것은, 다른 사람이 알려준 집 주소를 새로운 집 주소로 바꾼 것과 같습니다. 하지만 본인만 새로운 집 주소를 알고 있고, 다른 사람은 여전히 원래 집 주소를 알고 있으니 원본에는 영향이 없습니다.
    즉 메서드 내부에서 배열 참조를 변경해버리는건 다른 메모리 주소의 새로운 배열을 생성하고 그 메모리 주소에 접근하는 것과 같은 것입니다.