본문 바로가기
Programming/Java

[Java] 6. 배열 (Part 1)

by Rayched 2022. 10. 19.

1. 개요

변수에서 반복문까지 설명하면서 변수를 여러 개를 선언한 경우는 많이 없었고

많이 선언해봤자 2~3개 정도였었다.

하지만 실제로 프로그램을 만들면 변수 선언을 할 일이 아주 많을 것이다.

이번에 정리한 것은 하나의 변수 이름으로 여러 개의 변수를 사용할 수 있는 방법인 '배열'에 대한 것을 정리해봤다.


2. 배열의 정의

① 배열 Array

앞에서 설명한 것처럼 배열은 "하나의 변수 이름으로 여러 개의 변수를 사용할 수 있게 해 주는 방법"이다.

이를 간단하게 요약하자면 "변수 혹은 상수의 모음"으로 볼 수 있으며

기술적인 정의를 내리자면 "같은 데이터 타입을 가진 연속된 메모리 공간으로 이루어진 자료 구조"를 말한다.

배열의 정의를 알았으니 이제 프로그래밍에서 배열을 어떻게 선언하는 지를 확인해보자.

//배열 선언 및 명령문 해설

public class Main {
	public static void main(String[] args){
    	int[] arr = new int[3];
        // 정수를 3개 저장 가능한 1차원 배열 'arr' 선언
        // int에 붙어있는 '[*]'은 해당 변수가 배열형 변수라는 의미를 가진다.
        // new -> 변수에 메모리 공간을 할당할 때 사용하는 단어
        // 참조형 자료형에 메모리 공간을 할당할 때 사용함
        
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;
        // 배열 arr의 인덱스 0~2번까지 정수 10, 20, 30을 저장한다.
        // 자바에서 배열은 0번부터 사용한다.
        // 3개 짜리 배열을 선언하면 0~2의 번호를 가진 메모리 공간 3개를 할당받는다.
        
        System.out.println(arr[0]);
        //배열 arr 인덱스 0번에 저장된 값, 10을 출력한다.
    }
}

1차원 배열을 생성 과정을 요약한 그림


② new 연산자

new 연산자란 "클래스 타입의 인스턴스(객체)를 생성해주는 역할을 하는 연산자."이다.

여기서 클래스에 대해 간단하게 말하자면 '사용자 정의의 데이터 타입'이다.

변수 하나에 각기 다른 데이터 타입을 가진 값을 넣고 싶을 때 주로 사용한다.

public class Main {
	public static void main(String[] args){
    	int[] arr = new int[3];
        Custom a = new Custom();
        //'클래스''객체 변수' = 'new''클래스();'
        /* (1). 클래스
         *  -자료형 (Data Type)
         * (2). 객체 변수
         *  -참조 값을 저장, 인스턴스(객체)를 조종하는 리모컨
         *  -참조 변수
         * (3). new
         *  -메모리 공간 할당
         *  -인스턴스(객체) 생성, 참조 값 반환(→객체)
         * (4). 클래스();
         *  -생성자 호출
         */
         //new 연산자를 통해서 메모리에 데이터를 저장할 공간을 할당받고
         //해당 공간의 참조 값을 객체에게 반환(return)
         //이어서 생성자를 호출한다.
    }
}

class Custom {}

인스턴스(instance), 객체를 조종하려면 참조 값을 저장한 객체로만 접근할 수 있으며

new 연산자를 통해서 생성되는 객체는 같은 값을 가진 객체가 있어도

서로 다른 메모리 공간을 할당받기 때문에, 시스템 상에서 서로 다른 객체로 분류가 된다.


 ③ 배열 예제

//배열 예제 1번

public class Main {
	public static void main(String[] args){
    	int[] arr = new int[3]; //정수 3개를 저장할 수 있는 배열형 변수 arr 선언
        arr[0] = 10;
        arr[1] = 15;
        arr[2] = 20;
        
        System.out.println("=== 배열 출력 시작 ===");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println("=== 배열 출력 종료 ===");
    }
}

위와 같이 코드를 작성하고, 실행하면 배열 arr의 0~2번 인덱스 공간에 값이 제대로 입력됐다는 것을 확인할 수 있다.

코드 실행 결과

이번에는 소스 코드를 조금 수정한 다음, 다시 프로그램을 실행시켜보자.

//배열 예제 2번

public class Main {
	public static void main(String[] args){
    	int[] arr = new int[3]; //정수 3개를 저장할 수 있는 배열형 변수 arr 선언
        arr[0] = 10;
        arr[1] = 15;
        arr[2] = 20;
        
        arr[3] = 30; //3번 인덱스 공간에 정수 값 30을 저장
        
        System.out.println("=== 배열 출력 시작 ===");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        
        System.out.println(arr[3]); //3번 공간에 저장된 값, 30을 출력
        
        System.out.println("=== 배열 출력 종료 ===");
    }
}

앞에서 작성한 코드에서 3번 메모리 공간에 값을 저장하고, 저장한 값을 출력하게 하는 명령을 추가한 버전이다.

프로그램을 실행하려고 하면 컴파일 과정에서 에러가 발생한다.에러 메시지를 확인해보자.

배열 변수를 선언할 때 지정한 범위를 벗어난 곳에 값을 저장하려고 하면 발생하는 에러 메시지

Console 창에 위와 같거나 혹은 비슷한 에러 메시지가 나온 것을 확인할 수 있을 것이다.

해당 에러 메시지는 이러한 의미를 내포하고 있다.

"앞에서 배열 변수를 선언할 때, 0번부터 2번까지 3개의 메모리 공간을 할당해줬는데 3번 메모리 공간에 값을 저장하려고 하냐?"

즉,  시스템이 작성한 코드에 오류가 있다고 말해주는 것이다.그러면 이제 작성했던 명령을 하나씩 분석을 해보자.


① int[] arr = new int [3];

- 배열은 0번부터 시작한다.

- arr이라는 이름을 가진 정수형 배열 변수를 선언하고, 0~2번의 번호를 가진 메모리 공간 3개를 할당 받음

- '0', '1', '2'번 칸을 배정받았으므로, 값의 저장도 상기의 칸에만 저장 가능하다.

 

② arr [3] = 30;

- 변수를 선언할 때 0~2번, 총 3개의 공간을 배정받은 상태이다.   

- 3번, 즉 4번째 공간에 정수 30을 저장하려는 명령을 입력해도, 저장할 수 있는 공간이 존재하지 않으므로   

  컴파일하는 과정에서 에러가 발생하게 된다.

- 배열 변수 선언 시 범위를 3에서 4로 수정하면 0 ~ 3번의 번호를 가진 메모리 공간 4개를 할당받는다.


이를 통해서 배열에 값을 저장할 때는 선언한 범위 내에서 값을 저장해야 하는 이유를 알았다.

이번에는 배열 변수의 범위를 4로 수정한 다음, 프로그램을 다시 실행해보자.

이렇게 하면 컴파일 오류가 발생하지 않을 것이다.

//배열 예제 3번

public class Main {
	public static void main(String[] args){
    	int[] arr = new int[4];
        arr[0] = 10;
        arr[1] = 15;
        arr[2] = 20;
        arr[3] = 30;
        
        System.out.println("=== 배열 출력 시작 ===");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        System.out.println("=== 배열 출력 종료 ===");
    }
}

배열 예제 3번 실행 결과


3. 2차원 배열

① 2차원 배열의 정의

지금까지 앞에서 설명한 것은 1차원 배열이다.

이번에 설명할 것은 2차원 배열에 대한 것이다.

기본적인 개념 자체는 1차원과 크게 다르지 않기 때문에

바로 2차원 배열을 선언하고 값을 저장하는 방법에 대해 알아보겠다.

//2차원 배열 선언 및 값을 저장하기

public class Main {
	public static void main(String[] args){
    	int[][] arr = new int[3][4];
        //정수를 4개 씩 담을 수 있는 배열을 3개 생성한다.
        
        arr[0][0] = 100;
        //2차원 배열 변수 arr의 0,0번째 공간에 정수 100을 저장한다.
        //'arr[0] = 100;'으로 입력하면 에러가 발생한다.
        //해당 명령은 1차원 배열의 형식이기 때문이다.
    }
}

2차원 배열 선언, 메모리 공간을 할당 받는다.

 


② 2차원 배열 예제

//2차원 배열 예제

public class Main {
  public static void main(String[] args){
    int[][] arr = new int[3][4];
    
    arr[0][0] = 50;
    arr[0][1] = 57;
    arr[1][1] = 35;
    arr[1][2] = 10;
    arr[2][0] = 78;
    arr[2][3] = 67;
    
    System.out.println("=== 2차원 배열 시작 ===");
    System.out.println(arr[0][0]);
    System.out.println(arr[0][1]);
    System.out.println(arr[1][1]);
    System.out.println(arr[1][2]);
    System.out.println(arr[2][0]);
    System.out.println(arr[2][3]);
    System.out.println("=== 2차원 배열 종료 ===");
  }
}

상단의 코드는 2차원 배열을 선언하고, 할당받은 데이터 공간에 임의의 정수 값을 저장하고 그걸 출력하는 코드이다.

2차원 배열 생성 및 임의의 정수 값을 할당받은 공간에 저장한다.

2차원 배열 변수 arr을 선언하면서 4칸 짜리 배열 3개를 할당받는다.

이후 임의의 공간에 정수를 저장하고, Console 창에 저장한 값을 출력시킨다.

프로그램을 실행하면 아래와 같은 출력 결과가 나오는 것을 확인할 수 있다.


3. 마치며

배열에 대한 기본적인 개념과 이를 활용한 예제를 실행하고, 그걸 설명하는 것으로 해당 글을 마쳤다.

배열에 관한 것을 정리하다보니 분량이 예상했던 것보다 길어져서 Part 1, 2의 형식으로 나누게 됐다.

다음에 작성할 글은 배열을 활용한 문제 3개를 풀고, 해설하는 것 위주로 작성하게 될 것 같다.

 

'Programming > Java' 카테고리의 다른 글

[Java] 7. 클래스와 객체 (Part 1)  (0) 2022.10.28
[Java] 6. 배열 (Part 2)  (0) 2022.10.19
[Java] 5. 반복문  (0) 2022.10.11
[Java] 4. 조건문  (1) 2022.10.05
[Java] 3. 연산자  (0) 2022.09.23