같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라 한다. " 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것 "
여기서 중요한 것은 같은 타입이어야 한다는 것이다.
서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다. Ex) int[ ] score = new int[5]; // 5개의 int값을 저장할 수 있는 배열 생성
메모리 상에서 기본형 애들은 Stack( Call Stack )에 만들어지고 참조형( new int[5] )은 Heap영역에 만들어진다. 이때 score( 변수 )는 Stack영역에 만들어지는데 score는 Heap영역에 있는 것을 참조해서 사용한다. 그래서 참조형이라 한다. ---> 참조형은 다른 영역에서 만들어져서 참조되는 것이다.
2. 배열의 생성
배열을 선언하는 방법은 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다.
선언 방법
선언 예
타입[ ] 변수이름
int[ ] score;
String[ ] names;
타입 변수이름[ ]
int score[ ]
String names;
배열의 생성
배열은 선언한 다음에는 배열을 생성해야 한다.
배열을 선언한 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이다. ( Stack 공간에만 만들어짐 ) 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. ( Heap 영역에 만들어져 비로소 참조가 된다. )
타입[ ] 배열이름;
배열을 선언( 배열을 다루기 위한 참조변수 선언 )
배열이름 = new 타입[길이]
배열을 생성( 실제 저장공간을 생성 )
3. 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 배열의 요소( element )라고 하며, 배열이름[인덱스]의 형식으로 요소에 접근한다.
인덱스( index )는 배열의 요소마다 붙여진 일련번호를 각 요소를 구별하는 데 사용한다. * 인덱스의 범위는 0부터 배열의 길이 -1까지
배열의 값을 저장하고 읽어오는 방법은 변수와 같다.
단, 변수 이름 대신 배열이름[인덱스]를 사용한다는 점만 다르다.
배열의 길이
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수이다.
배열의 길이는 양의 정수여야 한다.
4. 배열의 초기화
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화하므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만 원하는 값을 따로 저장할 수 있다.
선언과 초기화 동시에 가능
저장할 값들을 괄호{ } 안에 쉼표로 구분해서 나열하면 되고, 괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 배열의 길이는 안 적어도 된다.
5. 배열의 출력
for문을 이용한 출력 * 배열이름.length : 배열의 길이 반환
향상된 for문 * 배열 arr 처음부터 순서대로 하나씩 ele변수에 저장해서 꺼내온다. * 마지막 인덱스까지 가면 종료
6. 배열의 복사
for문을 이용한 복사
System.arraycopy()를 이용한 배열의 복사 - for문 대신 System클래스의 arraycopy()를 사용하면 보다 간단하게 빠르게 복사할 수 있다.
7. 다차원 배열
- 지금까지 우리가 배운 배열은 1차원 배열인데, 2차원 이상의 배열도 선언해서 사용할 수 있다.
2차원 배열의 선언과 인덱스
선언 방법
선언 예
타입[ ][ ] 변수이름;
int[ ][ ] score;
타입 변수이름[ ][ ];
int score[ ][ ];
타입[ ] 변수이름[ ];
int[ ] score[ ];
2차원 배열은 행과 열로 구성되어 있기 때문에 index로 행과 열에 각각 하나씩 존재한다.
행 index의 범위는 0 ~ ( 행의 길이 - 1 )이고, 열 index의 범위는 0 ~ ( 열 인덱스 - 1 )이다.
각 요소에 접근하는 방법은 배열이름[행 index][열 index]; 이다.
2차원 배열의 초기화
2차원 배열도 괄호를 사용해서 생성과 초기화를 동시에 할 수 있다.
다만, 1차원 배열보다 괄호 { }를 한번 더 써서 행렬로 구분해준다.
메모리 상에서( int[ ][ ] scores = new int[2][3];) Stack영역에 scores라는 변수가 생기고 Heap영역에는 new int[2]만 참조변수에 참조된다. 그 다음에 Heap영역에 있는 int[0], int[1] 에서 new int[0][3], new int[1][3]을 다시 참조하게 된다.