Ryuzy 2025. 5. 14. 16:01
728x90
반응형

1. 배열

자바에서 배열(Array)은 같은 자료형의 값들을 여러 개 저장할 수 있는 연속된 공간입니다. 배열은 한 번 생성되면 크기가 고정되며, 각 요소는 인덱스(순번)를 통해 접근할 수 있습니다. 인덱스는 0부터 시작하고, 배열의 크기보다 큰 인덱스를 참조하면 오류가 발생합니다. 배열을 사용하면 반복문과 함께 데이터를 효율적으로 처리할 수 있으며, int[], String[]처럼 자료형 뒤에 대괄호([])를 붙여 선언합니다.

 

1. 배열의 특징

  • 같은 자료형만 저장 가능 (int[], String[], double[] 등)
  • 크기(길이)를 미리 정해야 함 → 한 번 정해지면 변경 불가
  • 인덱스는 0부터 시작 (arr[0], arr[1], …)
  • 반복문과 함께 사용하면 효율적으로 데이터 처리 가능

 

2. 배열 선언과 생성

자료형[] 배열이름 = new 자료형[크기];

 

int[] scores = new int[5]; // 정수형 5개를 저장할 수 있는 배열 생성
또는
int[] scores = {90, 80, 100, 70, 40};	// 배열 생성과 동시에 값을 저장
  • new int[5] → 실제 정수 5개를 저장할 메모리 공간(배열 객체)을 생성
  • scores → 그 메모리 공간의 주소를 저장한 참조 변수

즉, scores  자체는 배열을 직접 저장하는 게 아니라, 배열이 저장된 메모리의 위치(주소)를 참조하는 것입니다.

 

int[] a = {1, 2, 3};
int[] b = a;           // 배열 a의 참조값을 b에 복사

b[0] = 99;             // b 배열의 첫 번째 값을 변경

System.out.println(a[0]);  // 출력: 99

 

import java.util.Scanner;

public class ArrayInputEx {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);    // Scanner 생성
        int[] scores = new int[3];              // 정수 3개 저장할 배열 생성

        // 각 점수를 개별적으로 입력받기
        System.out.print("1번째 점수를 입력하세요: ");
        scores[0] = sc.nextInt();

        System.out.print("2번째 점수를 입력하세요: ");
        scores[1] = sc.nextInt();

        System.out.print("3번째 점수를 입력하세요: ");
        scores[2] = sc.nextInt();

        // 입력한 점수 출력
        System.out.println("1번째 점수: " + scores[0]);
        System.out.println("2번째 점수: " + scores[1]);
        System.out.println("3번째 점수: " + scores[2]);

        sc.close();  // Scanner 닫기
    }
}

 

 

2. 2차원 배열

배열 안에 또 다른 배열이 있는 구조입니다. 자바의 2차원 배열은 사실 1차원 배열을 요소로 가지는 배열입니다. 즉, 행(row)마다 각각의 1차원 배열이 따로 존재합니다.

 

  • 1차원 배열: int[]
  • 2차원 배열: int[][] ← 배열의 배열
int[][] matrix = new int[2][3]; // 2행 3열 배열

 

 

int[][] arr = {
    {1, 2, 3},
    {4, 5, 6}
};

 

  • arr는 2개의 배열(행)을 참조하는 배열
  • arr[0]은 {1, 2, 3}, arr[1]은 {4, 5, 6}을 참조
  • 각각은 독립된 1차원 배열이고, arr[0][1] 같은 식으로 접근

 

public class JaggedArrayExample {
    public static void main(String[] args) {
        // 3행짜리 배열 만들기 (열 크기는 아직 정하지 않음)
        int[][] jagged = new int[3][];  

        // 각 행에 다른 크기의 배열을 할당 (가변 배열)
        jagged[0] = new int[] {1, 2};          // 2열
        jagged[1] = new int[] {3, 4, 5};       // 3열
        jagged[2] = new int[] {6};             // 1열

        System.out.println("jagged[0][0] = " + jagged[0][0]);
        System.out.println("jagged[0][1] = " + jagged[0][1]);

        System.out.println("jagged[1][0] = " + jagged[1][0]);
        System.out.println("jagged[1][1] = " + jagged[1][1]);
        System.out.println("jagged[1][2] = " + jagged[1][2]);

        System.out.println("jagged[2][0] = " + jagged[2][0]);
    }
}

 

 

3. 얕은 복사와 깊은 복사

자바에서 얕은 복사(Shallow Copy)는 객체나 배열의 참조값(주소)만 복사하여 원본과 복사본이 같은 데이터를 공유하는 방식이며, 한쪽을 변경하면 다른 쪽에도 영향을 줍니다. 반면, 깊은 복사(Deep Copy)는 새로운 메모리 공간을 만들고 원본의 값을 하나하나 복사하여 원본과 복사본이 서로 독립적으로 동작하게 만드는 방식입니다. 따라서 깊은 복사는 값을 변경해도 서로 영향을 주지 않습니다.

 

1. 얕은 복사(Shallow Copy)

얕은 복사는 값 자체를 복사하는 게 아니라 주소(참조값)를 복사하는 것입니다. 즉, 두 변수가 같은 객체(또는 배열)를 가리키게 됩니다.

int[] a = {1, 2, 3};
int[] b = a;  // 얕은 복사

b[0] = 99;

System.out.println("a[0] = " + a[0]);  // 99
System.out.println("b[0] = " + b[0]);  // 99

 

2. 깊은 복사(Deep Copy)란?

깊은 복사는 내용을 완전히 새로 복사하는 것입니다. 즉, 새로운 공간을 만들고 값만 복사하므로 서로 완전히 독립적입니다.

// 원본 배열
int[] a = {1, 2, 3};

// 새로운 배열(깊은 복사용)
int[] b = new int[3];

b[0] = a[0];
b[1] = a[1];
b[2] = a[2];

// b 배열 값 변경
b[0] = 99;

// 결과 출력
System.out.println("a[0] = " + a[0]);  // 1 (원본 그대로)
System.out.println("b[0] = " + b[0]);  // 99 (복사본 변경)

 

 

728x90
반응형