[Java 기초] 5. 배열(Array) (기본편)

Kyung Jae, Cheong·2024년 8월 11일
post-thumbnail
  • 최대한 기초가 거의 없는 분들의 입장에서 정리해본 내용이므로, 어려운 개념들은 가급적 포함시키지 않거나 최대한 간단하게만 표현하였습니다.
  • Java 세팅 및 실습은 Windows 환경에서 IntelliJ를 통해 진행되었습니다.
  • (참고) IntelliJ 코드 실행 단축키
    • Windows, Linux : Shift+F10
    • MacOS : Ctrl+R

5. 배열(Array)

5-1. 배열이란?

  • 자바에서 배열은 동일한 타입의 여러 값을 저장할 수 있는 자료 구조입니다.
    • 배열은 자바에서 가장 기본적인 데이터 구조 중 하나이며, 여러 요소를 한 번에 관리할 수 있어 효율적인 데이터 처리에 유용합니다.

자바 배열의 특징

  • 고정된 크기 : 배열은 생성할 때 배열의 크기(길이)를 지정해야 하며, 한 번 생성된 배열의 크기는 변경할 수 없습니다.
  • 동일한 타입 : 배열은 동일한 데이터 타입의 요소들만 저장할 수 있습니다.
    • 예를 들어, int[] 배열은 정수만 저장할 수 있습니다.
  • 0부터 시작하는 인덱스 : 배열의 위치를 의미하는 인덱스(index)는 배열의 길이를 length라 했을때, 0 부터 length-1 까지의 인덱스를 가집니다.
  • 참조형 변수 타입 : 자바에서 배열은 객체로 취급되고, 선언한 배열 변수는 실제 배열을 가리키는 주소값(참조) 역할을 하게 됩니다.

배열의 장단점

  • 장점
    • 메모리의 연속된 공간에 데이터를 저장하기 때문에 접근 속도가 빠릅니다.
    • 간단한 데이터 구조로, 선언과 사용이 쉽습니다.
  • 단점
    • 크기가 고정되어 있어, 동적인 크기 조정이 어렵습니다. (물론 동적으로 정의하는 메서드가 있긴하지만, 나중에 다루게 될 것입니다.)
    • 단일 타입의 데이터만 저장할 수 있습니다.
    • 배열의 크기를 미리 예측하고 선언해야 해서 메모리 낭비가 발생할 수 있습니다.

5-2. 배열의 선언과 초기화

  • 배열을 선언하는 기본적인 구문은 다음과 같습니다.
    • 타입[] 배열이름;
  • 배열은 선언한 이후에 변수처럼 초기화를 해줘야 사용할 수 있습니다.
    • 이때, 배열을 초기화를 하는 방법은 크게는 2가지정도가 있습니다.
      1. 배열의 크기를 지정하여 초기화 (변수 타입의 기본값이 들어갑니다)
      2. 배열의 값들을 직접 지정하여 초기화 (크기는 알아서 맞추어 집니다)
    • 위 두가지 방법 모두 선언과 초기화를 따로 진행할 수도 있고, 한번에 선언과 초기화를 할수도 있습니다.
  • 예시를 통해 정리해보도록 하겠습니다.

ArrayInit.java

package arrays;

public class ArrayInit {
    public static void main(String[] args) {
        // 1. Array declaration -> initialize with size
        int[] numbers1_1; // 배열 선언
        numbers1_1 = new int[5]; // 배열 초기화 (크기 지정) -> 0, 0, 0, 0, 0

        int[] numbers1_2 = new int[5]; // 배열 선언과 초기화를 동시에

        for (int num : numbers1_2) {
            System.out.print(num + " "); // 0, 0, 0, 0, 0
        }
        System.out.println();
        
        // 2. Array declaration -> initialize with values
        String[] names2_1; // 배열 선언
        names2_1 = new String[]{"Kim", "Lee", "Park"}; // 배열 초기화 (값 지정) -> "Kim", "Lee", "Park"

        String[] names2_2 = new String[]{"Kim", "Lee", "Park"}; // 배열 선언과 초기화를 동시에
        String[] names2_3 = {"Kim", "Lee", "Park"}; // 동시에 하는 경우엔 new String[] 생략 가능

        for (String name : names2_3) {
            System.out.print(name + " "); // Kim Lee Park
        }
    }
}

ArrayInit.class

0 0 0 0 0 
Kim Lee Park 
  • 참고로 배열 값 출력 부분은 반복문을 배우고 나야 이해할 수 있으니 참고로만 봐주시면 됩니다.
  • 위 예시에서 알 수 있듯이, 배열의 선언과 초기화를 값을 지정해서 한번에하는 경우엔 new 타입[]부분을 생략할 수 있습니다.
    • 만약 선언을 따로 하고 초기화를 저렇게 생략해서 하면 오류가 발생합니다.

5-3. 배열의 요소 접근 및 변경

  • 배열의 요소는 데이터 순서 정보인 인덱스(Index)를 사용하여 접근할 수 있으며, 이렇게 접근한 값을 재할당하면 값을 변경할 수 있습니다.
    • Index는 가장 앞쪽(왼쪽) 데이터는 0으로 시작합니다.
    • Index는 가장 뒤쪽(오른쪽) 데이터는 길이가 l일때 l-1로 끝납니다.
    • 예를들어 길이가 5(5개)라면 인덱스는 [0, 1, 2, 3, 4]가 됩니다.
  • 예시를 통해 확인해보겠습니다.

ArrayIndex.java

package arrays;

public class ArrayIndex {
    public static void main(String[] args) {
        // Array declaration -> initialize with size
        int[] numbers = new int[5]; // 배열 선언과 초기화를 동시에

        System.out.println("배열 요소 재할당 전");
        for (int num : numbers) {
            System.out.print(num + " "); // 0, 0, 0, 0, 0
        }
        System.out.println();

        // 배열 요소 접근
        System.out.println("0 번째 요소: " + numbers[0]); // 0
        System.out.println("1 번째 요소: " + numbers[1]); // 0
        System.out.println("2 번째 요소: " + numbers[2]); // 0
        System.out.println("3 번째 요소: " + numbers[3]); // 0
        System.out.println("4 번째 요소: " + numbers[4]); // 0

        // 배열 요소 재할당
        numbers[0] = 11;
        numbers[2] = 22;
        numbers[4] = 33;

        System.out.println("배열 요소 재할당 후");
        for (int num : numbers) {
            System.out.print(num + " "); // 11, 0, 22, 0, 33
        }

        // 배열의 길이
        int length = numbers.length;
        System.out.println("\n배열의 길이: " + length); // 5
    }
}

ArrayIndex.class

배열 요소 재할당 전
0 0 0 0 0 
0 번째 요소: 0
1 번째 요소: 0
2 번째 요소: 0
3 번째 요소: 0
4 번째 요소: 0
배열 요소 재할당 후
11 0 22 0 33 
배열의 길이: 5

배열의 길이 확인

  • 배열의 길이는 length 속성을 통해 얻을 수 있습니다. 이 속성은 배열의 요소 수를 반환합니다.
int length = numbers.length;  // 배열의 길이(요소의 수)를 반환

5-4. 다차원 배열

  • 자바에서는 2차원 이상의 다차원 배열을 사용할 수 있습니다.
    • 예를들어 2차원 배열은 1차원 배열들이 묶인 배열입니다.
      { // 2차원 배열 시작
          {배열1}, // 1차원 배열
          {배열2}, // 1차원 배열
          ...
      } // 2차원 배열 끝
  • 실무에서는 머신러닝이나 3D 분석을 하지 않는한 주로 2차원 배열까지 다루게 됩니다.

2차원 배열의 선언 및 초기화

  • 2차원 배열의 선언과 초기화 방법은 1차원 배열과 크게 다르지 않습니다.
    int[][] matrix = new int[4][3];  // 4x3 크기의 2차원 배열 선언
    • 다만 주의할 점은 new int[4][3]에서 [4]는 행(가로)을 나타내는 것이고, [3]은 열(세로)을 나타낸다는 것입니다. 이러한 규칙은 배열 요소에 접근할 때도 동일하게 적용됩니다.

ArrayDim.java

package arrays;

public class ArrayDim {
    public static void main(String[] args) {
        // 1-1. 2차원 배열 선언 & 초기화 (크기 지정)
        int[][] numbers1_1;
        numbers1_1 = new int[2][3]; // 2행 3열 -> {0, 0, 0}, {0, 0, 0}

        int[][] numbers1_2 = new int[2][3]; // 2행 3열 -> {0, 0, 0}, {0, 0, 0}

        // 1-2. 2차원 배열 선언 & 초기화 (값 지정)
        String[][] names1_1;
        names1_1 = new String[][]{{"Kim", "Lee"}, {"Park", "Choi"}}; // 2행 2열 -> {"Kim", "Lee"}, {"Park", "Choi"}

        String[][] names1_2 = new String[][]{{"Kim", "Lee"}, {"Park", "Choi"}}; // 2행 2열 -> {"Kim", "Lee"}, {"Park", "Choi"}
        String[][] names1_3 = {{"Kim", "Lee"}, {"Park", "Choi"}}; // 2행 2열 -> {"Kim", "Lee"}, {"Park", "Choi"} -> new String[][] 생략 가능

        // 2. 2차원 배열 요소 접근 & 재할당
        System.out.println("재할당 전");
        for (int[] row : numbers1_2) {
            for (int num : row) {
                System.out.print(num + " "); // 0, 0, 0, 0, 0, 0
            }
            System.out.println();
        }

        numbers1_2[0][0] = 15;
        numbers1_2[1][2] = 25;

        System.out.println("재할당 후");
        for (int[] row : numbers1_2) {
            for (int num : row) {
                System.out.print(num + " "); // 0, 0, 0, 0, 0, 10
            }
            System.out.println();
        }
    }
}

ArrayDim.class

재할당 전
0 0 0 
0 0 0 
재할당 후
15 0 0 
0 0 25 

마무리

  • 본 포스팅에서는 배열의 정의, 선언 및 초기화, 접근 및 재할당하는 기본적인 방법에 대해서 다루어 보았고, 조금 더 나아가 다차원 배열을 정의하는 방법까지 알아보았습니다.
  • 이후에는 프로그래밍 기본기 중에서 가장 중요하고 많이 쓰이는 조건문과 반복문에 대해 다루어볼 예정입니다.
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

1개의 댓글

comment-user-thumbnail
2025년 2월 19일

잘 봤습니다.

답글 달기