hayu's 개발 일지

[TIL]240220 배열(2) 본문

기술/java

[TIL]240220 배열(2)

hayu00 2024. 2. 20. 21:51

2차원 배열이란?

- 단순히 나열되어 있는 배열을 1차원 배열이라 한다. 이 1차원 배열에 하나의 차원이 추가되는데 이것을 2차원 배열이라한다. 2차원 배열은 행과 열로 구성된다.      

2차원 배열

- 2차원 배열은 int [][] arr = new int[2][3] 와 같이 선언하고 생성한다. 그리고 arr[1][2] 와 같이 사용하는데, 먼저 행 번호를 찾고 그 다음에 열 번호를 찾으면 된다.

- 행은 영어로 row(로우), 열은 column(컬럼)이라 한다. 

- 2차원 배열의 사용법은 [] 가 하나 추가되는 것을 제외하고는 앞서본 1차원 배열과 같다.

 

- 위의 그림 배열에 들어있는 데이터는 다음과 같다.

arr[행][열] , arr [row] [column]

 

그림의 2차원 배열 데이터

arr[0][0] : 1

arr[0][1] : 2

arr[0][2] : 3

arr[1][0] : 4

arr[1][1] : 5

arr[1][2] : 6

 

2차원 배열 예시

// 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차원 배열을 만들고, 배열에 값을 1부터 6까지 순서대로 직접 입력한다. 

- 0행에 있는 0, 1, 2열을 출력한다. 그리고 1행에 있는 0, 1, 2열을 출력한다.

 

코드 리펙토링1

리펙토링 코드1

// 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열

for (int row = 0; row < 2; row++) {
	System.out.print(arr[row][0] + " "); //0열 출력
	System.out.print(arr[row][1] + " "); //1열 출력
	System.out.print(arr[row][2] + " "); //2열 출력
	System.out.println(); //한 행이 끝나면 라인을 변경한다.
}

// 출력
1 2 3 
4 5 6

- for 문을 통해 행(row)을 반복해서 접근한다. 각 행안에서 열(column)이 3개이기 때문에 arr[row][0] , arr[row][1] , arr[row][2] 3번 출력한다. 이렇게하면 for 문을 한번 도는 동안 3개의 열을 출력한다.   

 

리펙토링 코드2

// 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열

for (int row = 0; row < 2; row++) {
	for (int column = 0; column < 3; column++) {
		System.out.print(arr[row][column] + " ");
	}
	System.out.println(); //한 행이 끝나면 라인을 변경한다.
}

- for 문을 2번 중첩해서 사용하는데, 첫번째 for 문은 행을 돌고 내부에 있는 두번째 for 문은 열을 돈다. 

- 내부에 있는 for 문은 앞서 작성한 다음 코드와 같다. for 문을 사용해서 열을 효과적으로 출력했다. 

System.out.print(arr[row][0] + " "); //0열 출력
System.out.print(arr[row][1] + " "); //1열 출력
System.out.print(arr[row][2] + " "); //2열 출력

 

코드 리펙토링2

리펙토링 코드1

// 2x3 2차원 배열, 초기화
int[][] arr = {
	{1, 2, 3},
	{4, 5, 6}
};

// 2차원 배열의 길이를 활용
for (int row = 0; row < arr.length; row++) {
	for (int column = 0; column < arr[row].length; column++) {
		System.out.print(arr[row][column] + " ");
	}
	System.out.println();
}

 

1차원 배열은 {1, 2, 3} 처럼 초기화한다. 

2차원 배열은 다음과 같이 초기화한다. 밖이 행이 되고, 안이 열이 된다.

{{1, 2, 3}, {4, 5, 6}}

위의 코드는 행열이 잘 안느껴진다. 다음 코드와 같이 작성하면 행과 열이 명확해진다.

{
	{1, 2, 3},
	{4, 5, 6}
}

 

배열의 길이

- for 문에서 2차원 배열의 길이를 활용했다.

- arr.length 는 행의 길이를 뜻한다. 위의 코드에서 행의 길이는 2이다. 

- arr[row].lenth 는열의 길이를 뜻한다. 위의 코드에서 열의 길이는 3이다.  

 

리펙토링 코드2

// 2x3 2차원 배열, 초기화
int[][] arr = new int[2][3];

int i = 1;
// 순서대로 1씩 증가하는 값을 입력한다.
for (int row = 0; row < arr.length; row++) {
	for (int column = 0; column < arr[row].length; column++) {
		arr[row][column] = i++;
	}
}

// 2차원 배열의 길이를 활용
for (int row = 0; row < arr.length; row++) {
	for (int column = 0; column < arr[row].length; column++) {
		System.out.print(arr[row][column] + " ");
	}
	System.out.println();
}

- 중첩된 for 문을 사용하여 값을 순서대로 입력한다.

- arr[row][column] = i++ 후의 증감 연산자(++)를 사용해서 값을 대입한 후 증가한다.

 

향상된 for 문

- 향상된 for 문은 배열을 사용할 때 기존 for 문 보다 더 편리하게 사용할 수 있다. 향상된 for 문은 각각의 요소를 탐색한다는 의미로 for - each 문이라고도 부른다.     

 

향상된 for 문 형식

for (변수 : 배열 또는 컬렉션) {
// 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}

- 향상된 for 문은 일반 for 문과 동일하게 작동한다. 

- 향상된 for 문은 배열의 인덱스를 사용하지 않고, 종료 조건을 주지 않아도 된다. 단순히 해당 배열을 처음부터 끝까지 탐색한다. 

- : 의 오른쪽에 탐색할 배열을 선택하고, 왼쪽에 반복할 때 마다 찾은 값을 저장할 변수를 선언한다.

- 향상된 for 문은 배열의 인덱스를 사용하지 않고도 배열의 요소를 순회할 수 있기 때문에 코드가 간결하고 가독성이 좋다.

 

향상된 for 문 예시

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

 

향상된 for 문을 사용하지 못하는 경우

- 향상된 for 문을 사용하지 못하는 경우가 있다. 향상된 for 문에는 증가하는 인덱스 값이 감추어져 있다. 따라서 증가하는 인덱스 값을 직접 사용해야 하는 경우에는 향상된 for 문을 사용할 수 없다.

 

회고

-  2차원 배열은 1차원 배열과 다르게 행과 열이 있기 때문에 주의해서 사용해야 겠다고 생각했다. 

-  향상된 for 문의 사용 방법과, 향상된 for 문을 사용하지 못하는 경우를 생각하고 코드를 짜야겠다고 생각했다.

'기술 > java' 카테고리의 다른 글

[TIL]240224 메서드(2)  (1) 2024.02.24
[TIL]240223 메서드(1)  (0) 2024.02.23
[TIL]240219 배열(1)  (0) 2024.02.19
[TIL]240212 반복문(2)  (0) 2024.02.12
[TIL]240210 반복문(1)  (1) 2024.02.10