인프런/김영한 자바

[김영한의 자바 입문] - 7. 배열

sson-coding 2025. 9. 1. 17:09

본 글에 사용된 코드와 이미지의 일부는 김영한 님의 『김영한의 자바 입문』 강의를 참조하여 발췌·활용하였습니다.


배열

배열은 같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하기 위해 등장했다. 즉, 배열은 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것이다.

배열 변수 선언과 생성

int[] students;
students = new int[5]

배열 변수 선언

int[] students;
  • 배열을 사용하려면 위와 같이 배열 변수를 선언해야 한다.
  • 일반적인 변수와 차이점은 [ ] 대괄호가 들어간다는 점이다.
  • 배열 변수를 선언한다고 해서 아직 사용할 수 있는 배열이 만들어진 것은 아니다.

배열 생성

students = new int[5]
  • 배열을 사용하려면 배열을 생성해야 한다.
  • new int[5] 라고 입력하면 총 5개의 int 형 변수가 만들어진다.
  • new : 새로 생성
  • int[5] : int 형 변수가 5개

배열 초기화

  • new int[5] 라고 하면 총 5개의 int 형 변수가 만들어진다.
  • 자바는 배열을 생성할 때 그 내부값을 자동으로 초기화 한다.
  • 숫자는 0 , boolean 은 false, String은 null 로 초기화 된다.

배열 참조값 보관

  1. new int[5] 로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다.
    • int 형을 5개 사용하면 4byte * 5 = 20byte 를 확보한다.
  2. 배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소) 를 반환한다.
  3. 앞서 선언한 배열 변수인 int[] students 에 생성된 배열의 참조값을 보관한다.

즉, int[] students 변수는 new int[5] 로 생성한 배열의 참조값을 가지고 있다. 참조값을 통해 메모리에 있는 실제 배열에 접근하고 사용할 수 있는 것이다.


배열 사용

인덱스

배열은 변수와 사용법이 비슷한데, 차이점이 있다면 [ ] 사이에 숫자 번호를 넣어주면 된다.

숫자 번호, 배열의 위치를 나타내는 숫자를 인덱스라고 한다.

students[0] = 90;
students[1] = 80;

코드에서 보이는 것 처럼, 배열은 0 부터 시작한다.

new int[5] 와 같이 5개의 요소를 가지는 int 형 배열을 만들었다면, 인덱스는 0

4 가 존재한다. 즉, 배열의 요소를 n 개 생성했다면, 인덱스는 0

n-1 이 된다.

만약 인덱스의 범위를 넘어간다면 java.lang.ArrayIndexOutOfBoundsException 오류가 발생한다.

배열에 값 대입

students[0] = 90; //1. 배열에 값을 대입
x001[0] = 90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에
접근, 값 대입

배열에 값을 대입하든, 배열의 값을 사용하든 간에 일반적인 변수와 사용법은 같다. [ ] 를 통해 인덱스만 넣어주면 된다.


기본형 vs 참조형

자바의 변수 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다.

  1. 기본형
    • int, long, double, boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
  2. 참조형
    • 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입
    • 동적 메모리 할당 : 사용자 입력에 따라 변수의 값이 변하고, 생성되는 배열의 크기가 달라짐

그럼 배열을 왜 복잡하게 참조형을 사용할까?

기본형은 선언과 동시에 크기가 정해져 크기를 동적으로 바꿀 수 없다. 하지만 배열과 같은 참조형은 크기를 동적으로 할당할 수 있다.

또한 기본형은 사용할 값을 직접 저장하는 반면, 참조형은 메모리에 저장된 배열이나 객체의 참조를 저장한다. 이로 인해 참조형은 더 복잡한 데이터 구조를 만들고 관리할 수 있다.


배열 초기화

우리는 위에서 배열 초기화에 대해 학습했는데, 다른 초기화 방법을 알아보자.

배열은 { } 를 사용해서 생성과 동시에 편리하게 초기화 하는 기능을 제공한다.

int[] students;
students = new int[]{90,80,70,60,50}

이렇게 배열 변수의 선언과 배열의 생성 및 초기화를 두 줄로 나눴지만 한 줄도 가능하다.

int[] students = new int[]{90,80,70,60,50}

단, 이때는 배열 변수의 선언을 한 줄에 함게 사용할 때만 가능하다.


2차원 배열

지금까지 학습한 배열은 순서대로 나열되어 있는 1차원 배열이였다. 이번에는 2차원 배열을 학습해보자.

2차원 배열을 행과 열 로 구성된다.

int[][] arr = new int[2][3]

2차원 배열은 위 코드와 같이 선언하고 생성하는데, 먼저 행 번호를 선언하고, 열 번호를 선언한다.

즉, arr[행][열] 이라고 할 수 있다.

public class ArrayDi0 {
 public static void main(String[] args) {
     // 2x3 2차원 배열을 만든다.
     int[][] arr = new int[2][3]; //행(row), 열(column)
     arr[0][0] = 1; //0행, 0열
     arr[0][1] = 2; //0행, 1열
     arr[0][2] = 3; //0행, 2열
     arr[1][0] = 4; //1행, 0열
     arr[1][1] = 5; //1행, 1열
     arr[1][2] = 6; //1행, 2열
     //0행 출력
     System.out.print(arr[0][0] + " "); //0열 출력
     System.out.print(arr[0][1] + " "); //1열 출력
     System.out.print(arr[0][2] + " "); //2열 출력
     System.out.println(); //한 행이 끝나면 라인을 변경한다.
     //1행 출력
     System.out.print(arr[1][0] + " "); //0열 출력
     System.out.print(arr[1][1] + " "); //1열 출력
     System.out.print(arr[1][2] + " "); //2열 출력
     System.out.println(); //한 행이 끝나면 라인을 변경한다.
 }
}
--- 실행 결과 --- 
1 2 3 //[0][0], [0][1], [0][2]
4 5 6 //[1][0], [1][1], [1][2]

2차원 배열 초기화

2차원 배열도 1차원 배열처럼 초기화를 쉽게 할 수 있다.

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

이렇게 라인을 적절하게 넘겨주면 행과 열이 명확해져 코드를 쉽게 이해할 수 있다.

배열의 길이

그렇다면 2차원 배열의 길이는 어떻게 될까? arr.length 는 행의 길이를 뜻한다. 위 코드에서는 2가 출력된다.

arr[row].length 는 열의 길이를 뜻한다. 위 코드에서는 3이 출력된다.


for-each 문

https://sson-coding.tistory.com/19

이 글에서 for문에 대해서 학습했다.

하지만 배열을 알고 for-each 문을 학습해야 하기 때문에 여기서 설명한다.

for-each 문 정의

for(변수 : 배열 또는 컬렉션){
    //작업
}

코드로 확인해보자.

public class EnhancedFor1 {
 public static void main(String[] args) {
     int[] numbers = {1, 2, 3, 4, 5};
     //일반 for문
     for(int i = 0; i < numbers.length; ++i) {
         int number = numbers[i];
         System.out.println(number);
     }

     //향상된 for문, for-each문
     for (int number : numbers) {
         System.out.println(number);
     }

     //for-each문을 사용할 수 없는 경우, 증가하는 index 값 필요
     for(int i = 0; i < numbers.length; ++i) {
         System.out.println("number" + i + "번의 결과는: " + numbers[i]);
     }
 }
}

개발자 입장에서는 그냥 배열을 순서대로 처음부터 끝까지 탐색하고 싶은데, 일반 for문의 경우 int i 와 같은 인덱스를 탐색할 수 있는 변수를 선언해야 하는 번잡한 일을 해주어야 한다.

그래서 향상된 for문인 for-each 가 등장했다.

특징

for-each 문의 특징은 다음과 같다.

  • 배열의 인덱스를 사용하지 않고, 종료 조건을 주지 않아도 되고, 단순히 해당 배열을 처음부터 끝까지 탐색한다.
  • : 의 오른쪽에 탐색할 배열을 선택하고, 왼쪽에 반복할 때 마다 찾은 값을 저장할 변수를 선언한다.
  • 배열의 인덱스를 사용하지 않고도 배열의 요소를 순회할 수 있기 때문에 코드가 간결하고 가독성이 좋다.

for-each 사용하지 못하는 경우

하지만 for-each 를 사용하지 못하는 경우가 있다. for-each 문에는 증가하는 인덱스 값이 감추어져 있는데, 증가하는 인덱스 값을 직접 사용해야 하는 경우에 사용하지 못한다.