배열
배열이란, 하나의 변수에 공통된 유형의 변수 그룹을 담은 것이다. 값을 저장하기 위해서는 변수를 선언해야 하는데, 100가지 값을 위해 100가지 변수를 선언하는 것은 비효율적이다. 따라서 값들을 하나의 변수로 묶어 쉽게 관리하게 해주는 것이 배열이다. 배열 안의 값들은 요소(Element) 또는 원소라고 부르며, 이를 셀 때 인덱스는 0부터 시작한다.
1차원 배열
1차원 배열 선언 및 초기화 방법:
int [] arr;
int arr[];
// 크기 할당, 초기화 없이 선언하는 경우
위의 코드를 통해 arr이라는 이름의 변수를 선언했지만 아직 배열을 생성한 것이 아니라 참조 변수를 위해 공간을 만든 것이다. 참조 변수는 참조 타입의 값을 저장하고 있는 변수다. 값 자체를 가지고 있는 게 아니라, 그 값이 존재하는 위치의 시작 주소를 저장한다.
👉 왜 참조 변수를 선언하는가?
변수 선언은 메모리 상 값을 위한 공간을 확보하고 이름을 붙이는 것이다. 따라서 변수를 선언할 때는 얼만큼의 공간이 필요한지 컴퓨터에게 알려줘야 하는데, 배열은 데이터 크기가 정해져 있지 않다. 배열에도 여러 타입이 있고, 안에 든 요소의 수도 배열마다 천차만별이다. 따라서 어떤 타입의 값을 요소로 가지는지 알 수 없기 때문에 배열을 선언하는 시점에는 컴퓨터에게 얼만큼의 공간을 확보하라고 정확하게 명령할 수 없다.
배열 생성 및 초기화 방법은 아래와 같다.
int[] arr = new int [3]; // arr라는 배열은 {0, 0, 0} 3개의 요소를 가진다고 선언 및 초기화.
int[] arr;
arr = new int[4]; //arr라는 배열은 {0, 0, 0, 0} 4개의 요소를 가진다고 선언 후 초기화.
int[] arr = {2, 4, 6};
int[] arr = new int[] {2, 4, 6}; // arr라는 배열 선언과 동시에 값을 넣어 초기화.
배열을 생성할 때는 new 데이터타입[배열크기]
를 입력해야 한다. 배열을 생성한 후, 대입 연산자를 통해 할당해주면 참조 변수는 생성된 배열의 메모리 주소값을 저장하여 참조 변수가 생성된 배열을 가리키게 된다.
💁♀️ 배열의 길이와 인덱스
배열의 길이는 인덱스에 1을 더한 것과 같다. 인덱스는 0부터 세기 시작해 5개의 요소가 있다면 마지막 인덱스가 4일 것이다. 배열의 길이는 1부터 세기 때문에 5개의 요소가 있다면 길이를 5라고 센다. 따라서 배열이름.length
와 인덱스를 활용할 때는 이 차이를 유념해서 때에 따라 +1, -1를 해주어야 한다. ( + 배열의 길이는 정수로 최소 0부터 시작할 수 있으며, 0인 경우 어떤 요소도 배열에 넣을 수 없다.)
다차원 배열
배열이 배열의 요소로 들어간 경우 다차원 배열이라고 한다. 하나의 배열에 여러 요소가 들어있는 것이 1차원이라면, 다차원 배열은 논리적인 구조가 1차원 이상이라는 의미이다. 위 사진에서 볼 수 있듯이 2차원 배열인 경우 배열을 테이블 형태로 나타낼 수 있으며 각 0부터 x-1, 0부터 y-1의 길이를 가진 column과 row로 나타낼 수 있다.
int [] [] arr; // 선언 only (크기 할당 X, 초기화 X)
int arr [] []; // 선언 불가
int [] [] [] arr; // 3차원 배열 선언
int [] [] arr = new int [2] [3];
// {
// {0, 0, 0,},
// {0, 0, 0}
// } 위와 같이 배열 초기화 (선언과 동시에 배열 크기 지정)
int [] [] arr = new int[] [] {{1, 3, 5}, {2, 4, 6}};
// {
// {1, 3, 5},
// {2, 4, 6}
// } 위와 같이 배열 초기화 (선언과 동시에 값 넣기)
다차원 배열의 선언과 초기화는 위와 같다. new 키워드와 지정된 크기로 배열을 선언하면, 첫번째 크기만큼 0으로 초기화된 상태의 배열이 만들어진다. 그리고 그 안에 두번째 크기만큼 0으로 초기화된 상태의 배열이 만들어진다. 첫번째 크기로 지정된 배열에는 두번째 크기로 지정된 배열의 참조값을 지니고 있어 두번째 배열에 접근이 가능하게 해준다.
가변 배열
다차원 배열의 장점 중 하나는 배열을 자유로운 형태로 선언하고 공간을 만들 수 있다는 것이다. 그러나 값 중 특정한 값은 제외시키고 싶은 경우 다차원 배열에서는 저장 공간에 0을 가지고 있어도 메모리 공간을 차지하고 있는 것이기 때문에 메모리를 비효율적으로 사용하게 된다. 이러한 점을 해결해주는 게 가변 배열이다.
int [] [] arr = new int[10][];
가변 배열을 선언하면, 위의 경우에 첫번째 경우에 10이라는 크기를 초기화했지만 그 안에 넣을 배열들은 초기화시키지 않고 참조 변수를 담을 공간만 만들어놓을 수 있다. 이 공간에 원하는 크기만큼 값을 저장할 공간을 new 키워드로 만들면 메모리 공간을 필요한 만큼 효율적으로 사용할 수 있다.
문자열 배열
배열은 값들의 묶음이다. 문자열도 글자들이 순서대로 묶여 있는 형태이다. 때문에 배열을 사용해서 저장하는 것이 가능하다.
char[][] letters = new char[2][]; // 3개의 문자열 배열 선언 및 초기화
letters[0] = new char[4];
letters[1] = new char[6];
letters[0][0] = 'C';
letters[0][1] = 'o';
letters[0][2] = 'd';
letters[0][3] = 'e';
letters[1][0] = 's';
letters[1][1] = 't';
letters[1][2] = 'a';
letters[1][3] = 't';
letters[1][4] = 'e';
letters[1][5] = 's';
위 방법은 가변 배열로 2차원 배열을 선언해 값을 하나하나 저장한 방식이다. 이보다 효율적인 방법도 있다.
String[] str = new String [2];
str[0] = "Code";
str[1] = "states";
// 선언 후 배열에 값을 넣어 초기화
String[] str = new String[] {"Code", "states"};
String[] str = {"Code", "states"};
// 선언과 동시에 값을 넣어 초기화
String str = "Code states";
//String Class를 사용하여 초기화