추가예정: 배열의 길이 변경(복사) / String 배열 / + 예제 연습
배열
배열 (Array)은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이라 정의할 수 있다.
예를 들어 100개의 값을 담기 위해 100개의 변수를 하나하나 int a = 1; int b = 2;, int c = 3;..... int qq = 99; , int ww = 100; 이런 식으로 정의하는 것은 가능은 할 것이나 매우 비 효율적이다. 이럴 때 배열이 매우 유용하게 사용된다.
배열은 1차원 배열과 다차원 배열로 나뉠 수 있으며 배열이 가진 각각의 값을 배열의 요소 또는 배열의 원소 라고 한다. 그리고 배열의 모든 요소는 순서에 따라 번호표를 갖고 있는데 이걸 인덱스(index)라고 한다. 배열에 접근할 때는
배열 이름 [인덱스]라는 형식으로 해당 인덱스의 배열 값에 접근한다.
1차원 배열
1차원 배열의 생성 방법은 아래와 같다.
// 배열의 전체 크기 할당과 초기화 없이 선언만 하는 경우
int[] arr;
int arr[]; //이렇게도 가능 C스타일
여기서 정말 중요한 포인트는 여기서 변수 arr은 기본 타입이 아닌 참조 타입 즉 참조 변수이다. 따라서 실제 값이 아니라 배열의 주소 값이 저장된다. 배열의 변수가 참조 타입인 이유는 배열이 선언되는 시점에 얼마 큼의 메모리 공간이 필요한지의 크기를 알 수 없기 때문이다.
//배열의 선언과 동시에 초기화
int[] arr = new int[5];
// new 키워드를 사용해야 실제 배열이 생성된다.
// 길이가 5인 배열을 만들었지만 값은 초기화 하지 않았다.
// 이렇게 되면 각 인덱스 값은 자료타입의 기본값 (int -> 0) 으로 자동으로 초기화가 된다.
//배열의 선언과 동시에 값을 넣어 초기화
int[] arr = new int[] {1, 2, 3, 4, 5};
or
int[] arr = {1, 2, 3, 4, 5};
처음에 많이 헷갈렸던 부분이 배열의 길이와 인덱스의 범위였다.
인덱스의 마지막은 는 항상 배열의 길이 - 1 이다. 예를 들어 int [] arr = new int [] {1,2,3,4,5}라고 했을 때 arr 배열의 길이는 5이고, 인덱스의 끝은 4이다. 인덱스는 항상 0부터 시작하므로 길이가 5인 배열에서는 0,1,2,3,4 인덱스로 표현이 가능하다. arr [4] -> arr배열의 4번째 인덱스 -> '5'
즉 index의 범위는 0부터 배열길이(배열이름.length) - 1까지이다.
배열은 반복문과 정말 많이 쓰이는데 배열의 초기와, 배열의 요소 수정 등 많을 것들을 할 수 있다.
2차원 배열 / 다차원 배열
1차원 배열이 [1][2][3][4][5] 이런 식으로 표현이 되었으면, 2차원 배열은 다음처럼 표현이 된다
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
[3][0] [3][1] [3][2] [3][3] [3][4]
[4][0] [4][1] [4][2] [4][3] [4][4]
2차원 배열의 선언은 아래와 같다.
//2차원
int[][] arr;
//3차원
int[][][] arr;
낲은 차원의 배열을 만들고 싶으면 []를 추가하면 된다.
이것만으로는 배열 자체가 생성된 것이 아닌, 참조변수 arr을 할당할 공간을 확보만 한 상태이다.
따라서 배열을 선언할 때 new키워드를 사용해 배열의 크기를 지정하고 배열을 생성한다. 초기화를 하지 않는다면 해당 타입의 기본값으로 초기화가 될 것이다.
// 선언과 동시에 배열의 크기 지정
int[][] arr = new int[2][3]; //초기화를 따로 안 했으므로 모든 인덱스의 값은 int의 기본값 0
// 배열의 선언을 먼저 하고 다음에 크기를 지정
int[][] arr;
arr = new int[2][3]; // 선언 후 초기화 시에는 new int[][]생략 불가
// 선언과 동시에 값을 넣어 초기화
int[][] arr = {{1,2,3}, {4,5,6}}; // new int[][]를 생략가능
or
int[][] arr = new int[][] {{1,2,3}, {4,5,6}};
//
{
{1, 2, 3},
{4, 5, 6}
}
2차원 배열 구조가 헷갈리지만 행과 열로 생각하면 된다.
예를 들면,
int[][] arr = new int[4][5];
첫 번째 [4]는 4행(row, 위에서 아래로), 두 번째 [5]는 5열(column, 왼쪽에서 오른쪽으로)이다. 4행 5열, 총 20개의 int타입을 저장할 공간이 생기는 것이다. [0][0] [0][1] [0][2]... [1][0] [1][1] [1][2]... 이런 식으로 열이 먼저 진행된다.
가변 배열
자바에서는 2차원 이상의 다차원 배열을 '배열의 배열' 형태로 처리한다 라는 사실을 이용해 더 엄청난 형태의 배열을 만들 수 있다.
그중 하나로 다차원 배열의 가변 배열을 들 수 있겠는데, 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고 나중에 다른 길이의 배열을 생성함으로써 유동적인 배열을 만들 수 있다.
int[][] arr = new int[4][5];
이 2차원 배열은 4행 5열의 구조이다 (초기화는 안했으니 인덱스의 각각의 값은 0일 것이다)
하지만 아래와 같은 코드라면???
int[][] arr = new int[4][]; //두 번째 차원의 길이는 지정하지 않는다.
행은 4행으로 고정이 되었지만 열 부분에 해당하는 두번째 차원의 길이는 유동적으로 변경을 할 수 있다.
int[][] arr = new int[4][];
arr[0] = new int[4];
arr[1] = new int[1];
arr[2] = new int[2];
arr[3] = new int[3];
---------
[0][0] [0][1] [0][2] [0][3]
[1][0]
[2][0] [2][1]
[3][0] [3][1] [3][2]
위와 같은 모습이 될 것이다. 여기서 .length로 길이를 확인해보면 arr [0] = 4, arr [1] = 1처럼 행에 따라 배열의 길이가 달라짐을 확인 가능하다.
'programming > JAVA' 카테고리의 다른 글
[TBC]Java - 컬렉션 프레임워크 (Collections Framework) (0) | 2022.05.17 |
---|---|
Java - 지네릭 (generic) (0) | 2022.05.16 |
[TBC]Java - 객체지향언어 (OOP - Object-oriented Programming) (0) | 2022.05.15 |
Java - 추상화 / 인터페이스 (0) | 2022.05.15 |
Java - 다형성 (0) | 2022.05.13 |