Java

[ch05 참조타입] 배열

김차루 2022. 7. 11. 19:59

 

📆 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) ③ -> ② -> ①로 루프 진행