티스토리 뷰
조심할 부분
예제) 이런 코드가 있습니다.
int[][][] b= new int[2][2][2];
이 때,
b의 자료형? Int[ ][ ][ ]
b[0]의 자료형? Int[ ][ ]
b[0][0]의 자료형? Int[ ]
b[0][0][0] 자료형? Int
이 때? b =10 가능?
No
why?
주어진 코드에서 b의 자료형은 int[ ][ ][ ]이다. 즉, 3차원 배열이란 소리.
먼저,
b[0]은 배열의 첫 번째 차원에서 첫 요소인 int[ ][ ] 타입의 배열이다. 이 배열은 2차원 배열이다.
b[0][0]은 b[0]에서 첫 번째 요소인 int[ ] 타입의 배열이다.
마지막으로 b[0][0][0]은 b[0]에서 첫 번째 요소인 int 타입의 값이다.
따라서 b=10; 은 잘못된 문법이다.
b는 3차원 배열인데, 10은 int 타입의 값이므로, b에 int 타입 10의 값을 할당할 수는 없다.
올바른 방법은 b 배열의 각 요소에 값을 할당하는 것
ex) b[0][0][0] =10;
(b 배열의 첫 번째 차원에서 첫 번째 요소, 두 번째 차원에서 첫 번째 요소, 세 번째 차원에서 첫 번째 요소에 10을 할당)
가변 배열
: 다차원 배열에서 각 차원의 크기가 서로 다른 배열
[사용하는 상황]
- 각 행마다 열의 개수가 다른 2차원 배열
- 각 페이지마다 행과 열의 개수가 다른 3차원 배열
- 서로 다른 길이의 문자열을 저장하는 1차원 배열
[생성 방법]
* 다차원 배열을 생성할 때, 각 차원의 크기를 지정하지 않음
--> 배열을 생성한 후에 각 차원별로 크기를 지정해준다.
* 가장 먼저 바깥쪽 차원의 크기를 정해야 한다.
* 그 다음에 각 차원별로 배열을 생성하여 저장한다.
ex. 2차원 가변 배열을 생성하는 경우
int[][] d = new int[3][];
d[0] = new int[5];
d[1] = new int[2];
d[2] = new int[3];
이럴 때,
첫 번째 차원의 크기는 3으로 고정되었다.(즉, 행은 3행으로 고정되었다는 말이겠지)
그리고 두 번째 차원의 크기는 지정되지 않았다.
이후
첫 번째 행(d[0])에는 5개의 원소를 가지는 1차원 배열을 생성하고,
두 번째 행(d[1])에는 2개의 원소를 가지는 배열을 생성하며,
세 번째 행(d[2])에는 3개의 원소를 가지는 배열을 생성했다.
대충 위와 같은 모양이 나올 것이다.
공간으로 따지자면
가변 배열을 사용할 때는, 각 차원의 크기를 확인해서 배열에 접근해야 한다.
각 차원의 크기는 배열의 length 속성을 통해 확인할 수 있다.
(선생님이 말씀하시길, 우리가 습관적으로 i<5; 뭐 요렇게 쓰던 것은 가변 배열에서 통하지 않는다는...)
(왜나하면 가변 배열은 고정이 안 되어 있으므로 상수를 사용할 수 없지.)
가변 배열은 다양한 형태로 사용할 수 있으며, 다차원 배열을 더욱 유연하게 다룰 수 있도록 도와준다.
3차원 배열도 방법은 동일하다.
Int [][][] k = new int[5][][];
K[0] = new int[2][2];
이런 식으로...
---------------------------------
수업 예제
MultiArray1
package Day11;
public class MultyArrayTest1 {
public static void main(String[] args) {
int[][] d = new int[3][];
d[0] = new int[5];
d[1] = new int[2];
d[2] = new int[3];
for(int i = 0;i<d.length;i++) {
for(int j=0;j<d[i].length;j++) {
d[i][j] = 9;
System.out.print(d[i][j]+"\t");
}
System.out.println();
}
int [][][] k = new int[5][][];
k[0] = new int[5][3];
}
}
코드의 흐름
* 2차원 배열 d 생성
** d : 3개의 배열 가지며 각 배열은 크기 다름
(첫 번째 5개 / 두 번째 2개 / 세 번째 3개)
* 이중 for문을 돌면서 모든 원소를 9로 초기화여 출력한다.
* 마지막으로 3차원 배열 k생성
** k : 5개의 배열 가지며, 각 배열은 2차원 배열을 가진다.
*** 여기서 첫 번째 배열은 5개의 2차원 배열을 가진다.
실행결과
9 9 9 9 9
9 9
9 9 9
MultiArray2
package Day11;
public class MultyArrayTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][][] b= new int[2][2][2];
int count = 1;
for(int i = 0;i<b.length;i++) {
for(int j = 0;j<b[i].length;j++) {
for(int x = 0;x<b[i][j].length;x++) {
b[i][j][x] = count++;
}
}
}
for(int i = 0;i<b.length;i++) {
for(int j = 0;j<b[i].length;j++) {
for(int x = 0;x<b[i][j].length;x++) {
System.out.print(b[i][j][x]+"\t");
}
System.out.println();
}
System.out.println();
}
}
}
코드의 흐름
* 먼저, 3차원 배열 "b"를 생성. "b"는 크기가 2x2x2인 배열.
* 이중 for 루프와 삼중 for 루프를 사용하여 "b" 배열의 모든 원소를 1부터 8까지의 숫자로 초기화.
* 초기화된 배열을 출력하기 위해 다시 이중 for 루프와 삼중 for 루프를 사용한다.
** 이중 for 루프는 3차원 배열의 앞 두 차원을 순회하고, 삼중 for 루프는 마지막 차원을 순회한다.
* 각 원소를 출력하고 줄바꿈을 하여 3차원 배열의 구조를 보여준다.
실행 결과
(3차원이라 정확하게 보이지는 않음.)
1 2
3 4
5 6
7 8
'[개발] - Java > Mega' 카테고리의 다른 글
[보충] 객체 지향에 대한 이해 - 클래스 (0) | 2023.03.29 |
---|---|
[보충] 객체 지향 프로그래밍에 대한 이해 (0) | 2023.03.29 |
Day11. 메소드 함수 호출 궁금증 해결 (0) | 2023.03.28 |
정방향 / 역방향 배열 배치 방법 두가지 (0) | 2023.03.28 |
배열 출력(숫자야구) i+1을 하는 이유 chat GPT (0) | 2023.03.27 |