[ch05 참조타입] 배열
📆 2022년 07월 10일
⏰ 23시 00분 ~ 22시 00분
✍ 혼자 공부하는 자바(신용권)
1. 배열이란?
1) 배열
- 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여해놓은 자료구조
2) 인덱스
- 각 항목의 데이터를 읽거나 저장하는데 사용
- 대괄호 []에 기입, 0부터 시작
2. 배열 선언
1) 선언
- 배열을 사용하기 위해서는 우선 배열 변수를 선언해야 함
- 두 가지 형식으로 작성할 수 있음
형식 1 | 형식 2 |
타입[] 변수; | 타입 변수 []; |
- 대괄호[]는 배열 변수를 선언하는 기호로 사용
- 타입 뒤 or 변수 뒤
2) 배열 변수 = 참조 변수
- 배열도 객체이므로 힙 영역에 생성, 배열 변수는 힙 영역의 배열 객체를 참조
- 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화될 수 있음
3. 배열 생성
- 배열 객체를 생성하려면 값 목록을 이용하거나 new 연산자를 이용
1) 값 목록으로 배열 생성
타입[] 변수 = { 값0, 값1, 값2, 값3, ... };
- 중괄호{}는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성
- 배열 객체의 번지를 리턴
- 배열 변수는 리턴된 번지를 저장
(1) 배열 값을 바꾸는 방법
name[1] = "홍삼원";
- name[1] 값에 홍삼원을 대입
(2) 값의 목록으로 배열 객체를 생성할 때 주의할 점
- 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음
타입[] 변수;
변수 = {값0, 값1, 값2, 값3, ... }; //컴파일 에러
(3) 배열 변수를 미리 선언한 후 값 목록이 나중에 결정되는 상황
- new 연산자를 사용해서 값 목록을 지정
- new 연산자 바로 뒤에는 배열 변수 선언에서 사용한 "타입[]"를 붙여주고 중괄호 {}에는 값을 나열
변수 = new 타입[] { 값0, 값1, 값2, 값3, ... };
2) new 연산자로 배열 생성
- 향후 값을 저장할 배열을 미리 만들고 싶다면 new 연산자로 배열 객체 생성
타입[] 변수 = new 타입[길이];
- 길이 : 배열이 저장할 수 있는 값의 개수
- 이미 배열 변수가 선언된 경우에도 new 연산자로 배열을 생성
타입[] 변수 = null;
변수 = new 타입[길이];
ex) int[] scores = new int [30]; //30개의 변수 값을 0으로 초기화
- 배열이 생성되고 나서 특정 인덱스 위치에 새로운 값을 저장하려면 대입 연산자를 사용
변수[인덱스] = 값;
4. 배열 길이
1) 배열 길이
- 배열에 저장할 수 있는 전체 항목의 개수
- 코드에서 배열의 길이를 얻으려면 배열 객체의 length필드를 읽음
배열 변수.length;
int[] intArray = {10, 20, 30};
int num = intArray.length;
System.out.println(num);
---------------------------------
3
5. 다차원 배열
1) 2차원 배열
- 행과 열로서 구성된 배열
- 가로 인덱스와 세로 인덱스를 사용
int[][] scores = new int[2][3];
- 이 코드는 3개의 배열 객체를 생성
- 배열 변수인 scores는 길이가 2인 배열 A 참조
- 배열 A의 scores[0]는 다시 길이가 3인 배열 B 참조
- scores[1]은 길이가 3인 배열 C 참조
2) ArrayIndexOutOfBoundsException
- 배열의 정확한 길이를 알고 인덱스를 사용하지 않으면 에러 발생
6. 객체를 참조하는 배열
- 참조 타입 배열은 각 항목에 객체의 번지를 가지고 있음
ex) String[] 배열은 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있음
- String[] 배열은 String 객체를 참조
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("JAVA");
System.out.println(strArray[0] == strArray[1]); //true(같은 객체를 참조)
System.out.println(strArray[0] == strArray[2]); //false(다른 객체를 참조)
System.out.println(strArray[0].equals(strArray[1])); //true(문자열이 동일)
7. 배열 복사
- 배열은 한 번 생성하면 크기를 변경x
- 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값을 복사
- for문과 System.arraycopy() 사용 가능
1) for문 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i = 0; i<oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i]; //oldIntArray값을 newIntArray에 복사
}
2) System.arraycopy() 사용
System.arraycopy(원본배열, 복사할 항목의 시작 인덱스, 새 배열, 새 배열을 붙일 시작 인데스, 복사할 개수);
- 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일
8. 향상된 for문
- 반복 실행을 하기 위해 루프 카운터 변수와 증감식을 사용x
- for문의 괄호()에는 배열에서 꺼낸 항목을 저장할 변수 선언과 콜론 그리고 배열을 나란히 작성
1) 배열 ①에서 가져올 첫 번째 값이 존재하는지 평가
2) 가져올 값이 존재하면 값을 ②에 저장
3) ③ 실행
4) ③이 모두 실행되면 다시 배열 ①에서 가져올 다음 값이 존재하는지 평가
5) ③ -> ② -> ①로 루프 진행