일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- greedy
- SQL
- bit manipulation
- Method
- implement
- Class
- Tree
- 코딩테스트
- 자바
- Matrix
- java
- hash table
- 파이썬
- Binary Tree
- dynamic programming
- Counting
- Math
- Binary Search
- two pointers
- array
- geometry
- Stack
- simulation
- Number Theory
- 구현
- string
- sorting
- database
- 코테
- Data Structure
- Today
- Total
코린이의 소소한 공부노트
배열 (4) 2차원 배열 본문
2차원 배열은 테이블(표) 형태의 데이터를 저장하기 위한 배열로, 1차원 배열 여러 개가 합쳐진 모양이라고 생각하면 된다.
1) 왼쪽
- 길이가 3인 1차원 배열(굵은 테두리)들이 보인다.
- 그 1차원 배열이 4줄 쌓여있다.
- 즉, 이 테이블의 데이터는 4행 3열이다.
- 2차원 배열을 생성할 때는 배열 기호 [ ]를 2개 쓴다.
2) 오른쪽
- 테이블이 여러 개 쌓여있다.
- 2차원 배열이 여러 개 모이면 3차원 배열이 된다.
그럼 2차원 배열의 인덱스는 어떻게 봐야 하는 걸까?
1) 행
- 가로로 한 줄이 한 행을 나타낸다. 그래서 행 인덱스는 세로로 쓰게 된다.
- 4행이므로 행 인덱스의 범위는 0 ~ 4-1 -> 0부터 3까지다.
2) 열
- 세로로 한 줄이 한 열을 나타낸다. 그래서 열 인덱스는 가로로 쓰게 된다.
- 3열이므로 열 인덱스의 범위는 0 ~ 3-1 -> 0부터 2까지다.
3) 2차원 배열의 요소 출력
- 배열 이름과 함께 행열 인덱스를 입력하면 해당 요소가 출력된다.
- 인덱스 범위를 넘어가게 되면 에러가 발생한다.
>> 2차원이기 때문에 인덱스가 하나 더 늘어난 것일 뿐, 1차원 배열과 같은 방식으로 인덱스가 정해진다.
2차원 배열의 초기화도 1차원 배열과 마찬가지다. 초기화를 하지 않는다면 해당 타입의 기본값으로 자동 초기화된다.
// 1부터 15까지의 수를 담은 3행 5열 int 2차원 배열 만들기
// 1) new 키워드를 이용한 생성. 거의 안씀
int[][] num = new int[][]{ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
// 2) 기본형처럼 사용
int[][] num = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
// 3) 2차원 배열의 모양이 나오게 2)를 약간 조정. 가장 많이 쓰는 형태
int[][] num = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
3행 5열 int 배열이니까 int를 담을 15개의 공간이 생기는데, 1차원 배열처럼 15개가 다 붙어있을까?
1) num
- 2차원 배열의 참조변수로, (3행이므로) 길이가 3인 배열의 시작주소(0x100)를 담고 있다.
- 배열의 각 요소에는 각 행을 표현하는 배열의 시작주소(0x200, 0x300, 0x400)가 담겨있다.
2) num[0]
- num 배열의 첫 번째 요소로, 1행에 대응되는 1차원 배열의 시작주소(0x200)을 담고 있는 참조변수이다.
- 0x200으로 가면 배열이름이 num[0]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.
- 각 배열의 요소는 1행의 요소인 1, 2, 3, 4, 5이다.
3) num[1]
- num 배열의 두 번째 요소로, 2행에 대응되는 1차원 배열의 시작주소(0x300)을 담고 있는 참조변수이다.
- 0x300으로 가면 배열이름이 num[1]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.
- 각 배열의 요소는 2행의 요소인 6, 7, 8, 9, 10이다.
4) num[2]
- num 배열의 세 번째 요소로, 3행에 대응되는 1차원 배열의 시작주소(0x400)을 담고 있는 참조변수이다.
- 0x400으로 가면 배열이름이 num[2]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.
- 각 배열의 요소는 3행의 요소인 11, 12, 13, 14, 15이다.
5) 저장공간의 연속성
- 2차원 배열의 참조변수 num을 따라가면 각 행의 시작주소가 담긴 1차원 배열이 있고, 공간은 연속적이다.
- num의 각 요소를 따라가면 각 행의 내용을 담고 있는 1차원 배열이 있고, 공간은 연속적이다.
- 그러나 각 행은 불연속적이다. 즉, 2차원 배열이 생성되어도 모든 저장공간이 다 붙어있는 형태는 아니다.
지금까지 예시로 본 2차원 배열들은 각 행의 요소의 개수가 모두 같았는데, 각 행마다 열의 개수가 달라도 상관없다.
int[][] num = new int[][]{
{1,2,3,4,5}, // 1행은 5열
{6,7,8}, // 2행은 3열
{9, 10}, // 3행은 2열
{11,12,13,14} // 4행은 4열
};
for (int i=0 ; i<num.length ; i++) { // 행 인덱스
for (int j=0 ; j<num[i].length ; j++) { // 열 인덱스
System.out.print(num[i][j] + " ");
} // for j 끝
System.out.println(); // 한 행이 모두 출력된 후 줄바꿈
} // for i 끝
// 결과
1 2 3 4 5
6 7 8
9 10
11 12 13 14
1) i
- 행 인덱스를 나타낸다.
- 2차원 배열 num의 경우 행은 총 4개이므로 i = 0, 1, 2, 3
2) j
- 열 인덱스를 나타낸다.
- i가 달라질 때마다 반복 횟수도 달라진다. i = 0, 1, 2, 3일 때 num[i].length = 5, 3, 2, 4
- j의 조건식에 특정 리터럴 아닌 상황마다 변하는 수(num[i].length)를 써놨으므로 열의 개수의 관계없이 출력된다.
'Java' 카테고리의 다른 글
배열 (5) Arrays클래스 (0) | 2022.02.20 |
---|---|
String 클래스 (0) | 2022.02.06 |
배열 (3) 활용 예시 (0) | 2022.01.20 |
배열 (2) 초기화, 출력 (0) | 2022.01.19 |
배열 (1) 선언과 생성, 인덱스 (0) | 2022.01.14 |