본문 바로가기
Java/Java

2차원 배열) 2차원 배열이란?, 생성 방법

by 박채니 2022. 3. 9.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


2차원 배열이란?

- 가로 및 세로 방향의 2차원으로 데이터를 저장하는 배열

구조와 위치별 인덱스 번호

 

2차원 배열 사용 순서

//1. 배열 선언
	int[][] arr;
//	int arr[][];
		
//2. 할당
	arr = new int[2][3];
		
//3. 값 대입
	arr[0][0] = 10;
	arr[0][1] = 20;
	arr[0][2] = 30;
	arr[1][0] = 40;
	arr[1][1] = 50;
	arr[1][2] = 60;
		
//4. 사용
	for(int i = 0; i < 2; i++) {
		for(int j = 0; j < 3; j++) {
			System.out.print(arr[i][j] + " ");
		}
	}
    
@콘솔출력값
10 20 30 40 50 60

 

2차원 배열 선언하는 데에도 2가지 방법이 있습니다. 

2차원 배열 선언 방법
자료형[][] 변수명; 자료형 변수명[][];

자바에서는 첫 번째 선언 방법을 선호합니다.

 

메모리는 2차원 배열을 바로 저장할 수 없습니다. 그렇다면 어떻게 2차원 배열을 저장할 수 있을까요?

 

위와 같이 배열 선언, 할당, 값 대입을 해주었을 때의 메모리 공간은 아래와 같습니다.

int[]가 int를 저장하는 1차원 배열인 것처럼 int[][]는 int[]를 저장하는 1차원 배열로 볼 수 있습니다.

따라서 몇 차원 배열이든지 최종적으로는 1차원으로 분할할 수 있으므로,

1차원 배열만 저장할 수 있는 메모리에 다차원 배열을 저장할 수 있는 이유입니다.

 

위 코드를 풀어보자면,

2차원 배열의 참조 변수 arr은 2개의 원소(arr[0], arr[1])를 저장하고 있는 공간의 주소값(0x123)을 갖고 있습니다.

이 공간에 가면 (0x123) 서로 다른 주소값을 갖고 있는 두 개의 공간(0x456, 0x789)이 있습니다.

이 위치값(0x456, 0x789)들이 가리키는 또 다른 공간에 가면 객체의 실제 데이터 값들이 들어있는 각 3개의 공간이 나옵니다.

따라서 arr[0][0] ~ arr[1][2] 의 값들이 각각 출력 되게 되는 것입니다.

 

 

다양한 2차원 배열 생성 방법

//방법 1) 배열 객체 생성 후 값 대입
int[][] arr1 = new int[2][3];
arr1[0][0] = 10;
arr1[0][1] = 20;
arr1[0][2] = 30;
arr1[1][0] = 40;
arr1[1][1] = 50;
arr1[1][2] = 60;
		
//방법 2) 배열 객체 생성과 동시에 값 대입 (길이 직접 지정X)
int[][] arr2 = new int[][] {{10, 20, 30}, {40, 50, 60}};
		
//방법 3) 배열 객체 행 생성 후 열 생성
int[][] arr3 = new int[2][];
arr3[0] = new int[] {10, 20, 30};
arr3[1] = new int[] {40, 50, 60};
		
//방법 4) 대입할 값만 입력
int[][] arr4 = {{10, 20, 30}, {40, 50, 60}};

단 방법 4의 경우, 선언과 값의 대입을 분리할 수 없으며, 선언과 동시에 값을 대입할 때만 사용할 수 있습니다.

 

규칙적인 수 대입하기

public void test3() {
	int[][] arr1 = new int[3][3];
		
	int num = 1;
	for(int i = 0; i < arr1.length; i++) {
		for(int j = 0; j < arr1[i].length; j++) {
			arr1[i][j] = num++;
			System.out.print(arr1[i][j] + " ");
		}
		System.out.println();
	}
}

@콘솔출력값
1 2 3 
4 5 6 
7 8 9

이중 for문을 이용하면 쉽게 값 대입, 출력을 할 수 있습니다.

외부 for문에는 행의 개수를 나타내는 arr1.length, 내부 for문에는 열의 개수를 나타내는 arr1[i].length를 사용합니다.

 

불규칙적인 수 대입하기

int[][] bingo = new int[][] {{2, 5, 6}, {3, 1, 4}, {7, 8, 9}};
		
for(int i = 0; i < bingo.length; i++) {
	for(int j = 0; j < bingo[i].length; j++) {
		System.out.print(bingo[i][j] + " ");
	}
	System.out.println();
}

@콘솔출력값
2 5 6 
3 1 4 
7 8 9

 

알파벳배열 만들기
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

public void test4() {
	char[][] alpha = new char[2][26];
		
	char ch = 'A';
		
	for(int i = 0; i < alpha.length; i++) {
		for(int j = 0; j < alpha[i].length; j++) {
			System.out.print(ch++);
		}
		ch = 'a';
		System.out.println();
	}
}

@콘솔출력값
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

 

for-each문 사용하여 출력

public void test5() {
	int[][] arr = new int[][] {{1, 2, 3}, {4, 5, 6}};
		
	for(int[] a : arr) {
		for(int b : a) {
			System.out.print(b + " ");
		}
	}
}

@콘솔출력값
1 2 3 4 5 6

2차원 배열에서 꺼낸 원소가 1차원 배열이기 때문에 이중 for-each문을 사용해야 합니다.

 

 

 

 

 

Do it! 자바 완전 정복을 참고하여 포스팅하였습니다.