본문 바로가기
Java

[Java] 가변배열

by seonggu 2023. 3. 30.

1️⃣ 가변배열

2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 유동적인 가변배열을 구성할 수 있다.

 

예를 들어 아래와 같이 '5 X 3' 길이의 2차원 배열 score를 생성하는 코드가 있을 때,

int[][] score = new int[5][3]; //5행 3열의 2차원 배열 생성

위 코드를 다음과 같이 표현할 수 있다.

int[][] score = new int[5][]; //두번째 차원의 길이 지정X
score[0] = new int[3];
score[1] = new int[3];
score[2] = new int[3];
score[3] = new int[3];
score[4] = new int[3];

첫 번째 코드와 같이 배열을 생성하면 직사각형 테이블 형태의 고정적인 배열을 생성하는 것이고,

두 번째 코드와 같이 2차원 배열을 생성하면 아래와 같이 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.

int[][] score = new int[4][]; 
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

위 코드에 의해 생성된 2차원 배열은 그림으로 표현하면 다음과 같다. 

✅ 여기서 중요한 건 score.length의 값은 여전히 5지만,

일반적으로 2차원 배열과 달리 score[0].length의 값은 4이고 score[1].length의 값은 3이 된다.

 

✅ 가변배열도 중괄호를 이용해서 생성과 동시에 초기화가 가능하다.

int[][] score = {
			{100, 100, 100, 100},
	  		{20, 20, 20},
	   		{30, 30},
	   		{40, 40},
	   		{50, 50, 50}
		};

 

2️⃣ 예제 

public class MultiArr1 {
    public static void main(String[] args) {
        final int SIZE = 10;
        int x = 0, y = 0;

        char[][] board = new char[SIZE][SIZE];
        byte[][] shipBoard = {
                //  1  2  3  4  5  6  7  8  9
                { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1
                { 1, 1, 1, 1, 0, 0, 1, 0, 0 }, // 2
                { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 3
                { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 4
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 5
                { 1, 1, 0, 1, 0, 0, 0, 0, 0 }, // 6
                { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // 7
                { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // 8
                { 0, 0, 0, 0, 0, 1, 1, 1, 0 }, // 9
        };

        // 0행에 행번호를, 0열에 열번호를 저장한다.
        for(int i=1;i<SIZE;i++)
            board[0][i] = board[i][0] = (char)(i+'0');

        Scanner scanner = new Scanner(System.in);

        while(true) {
            System.out.printf("좌표를 입력하세요.(종료는 00)>");
            String input = scanner.nextLine(); // 화면입력받은 내용을 tmp에 저장

            if(input.length()==2) {   // 두 글자를 입력한 경우
                x = input.charAt(0) - '0';  // 문자를 숫자로 변환
                y = input.charAt(1) - '0';

                if(x==0 && y==0) // x와 y가 모두 0인 경우 종료
                    break;
            }

            if(input.length()!=2 || x <= 0 || x >= SIZE || y <= 0 || y >= SIZE){
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
                continue;
            }

            // shipBoard[x-1][y-1]의 값이 1이면, 'O'을 board[x][y]에 저장한다.
            board[x][y] = shipBoard[x-1][y-1]==1 ? 'O' : 'X';

            // 배열 board의 내용을 화면에 출력한다.
            for(int i=0;i<SIZE;i++) {
                System.out.println(board[i]); // board[i]는 1차원 배열
            }
            System.out.println();
        }
    } // main의 끝
}

 

 

참고자료 -

더보기

'Java' 카테고리의 다른 글

[Java] 문자형과 유니코드  (0) 2023.04.13
[Java] 자바로 프로그램 작성하기  (0) 2023.04.06
[Java] 2차원 배열  (0) 2023.03.28
[Java] 객체지향언어, 클래스, 객체 정리  (4) 2023.01.05
[Java] JVM 메모리 구조  (0) 2022.12.29