공부/Java

[Java-05] 배열(Array) - 1차원 배열

줭♪(´▽`) 2021. 2. 10. 16:26

1. 배열(array)이란?

 

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

ex)

int[] score = new int[5];

-> 5개의 int값을 저장할 수 있는 배열을 생성함

 

2. 배열의 선언과 생성

1) 배열 선언

- 생성된 배열을 다루기 위한 참조변수를 위한 공간을 만드는 것

 

타입[ ] 변수이름;  또는  타입 변수이름[ ];

 

ex)

int [] score;         또는     int score[];

String [] name;     또는     String name[];

 

2) 배열 생성

- 배열을 선언한 다음에는 배열을 생성해야만 값을 저장할 수 있는 공간이 만들어짐

- new 연산자 사용

- 주어진 타입을 주어진 길이만큼 저장할 수 있는 배열이 생성

 

타입[ ] 변수이름;                     // 배열 선언 
변수이름 = new 타입[길이];      // 배열 생성

 

ex)

int [] score;

score = new int[5];

 

또는

 

int [] score = new int[5];

참조변수 score는 배열 저장공간의 주소(0x100)을 갖고 있음

 

3. 배열 길이와 인덱스

1) 배열의 요소(element)

- 생성된 배열의 각 저장공간

- 배열이름[인덱스] 형식으로 배열의 요소에 접근

 

2) 배열의 인덱스(index)

- 배열의 요소마다 붙여진 일련번호

- 인덱스의 범위는 0 ~ (배열 길이-1)

ex)

int [] score = new int[5]; 에서 배열의 길이는 5, 인덱스의 범위는 0 ~ (5-1) = 0 ~ 4 = 0,1,2,3,4 가 됨

 

- 유효한 범위를 벗어난 값을 index로 사용하면 실행 시에 에러(ArrayIndexOutOfBoundsException)가 발생

 

3) 배열의 길이

- 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수

- int범위의 양의 정수(0도 포함)이어야 함

 

4) 배열이름.length

- 배열의 길이에 대한 정보를 알 수 있음

- 값을 읽을 수만 있고 변경할 수 없음

 

5) 배열의 길이 변경하기

① 더 큰 배열을 새로 생성함

② 기존 배열의 내용을 새로운 배열에 복사함

 

4. 배열의 초기화

- 배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되지만 원하는 값을 저장하려면 초기값을 지정해 줘야함

 

① for문으로 배열 초기화

int[] score = new int[5];
for(int i = 0; i < score.length; i++)
	score[i] = i * 10;

 

② 배열 생성과 동시에 초기화

int[] score = new int[] { 50, 60, 70, 80, 90 };

// 생성과 동시에 초기화하면 new int[]를 생략할 수 있음

int[] score = { 50, 60, 70, 80, 90 };

 

※ 길이가 0인 배열

int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};

 

※ 변수의 타입에 따른 기본값

 

자료형 기본값
boolean false
char '\u0000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null

 

 

5. 배열의 출력

① 배열이름[인덱스]으로 출력

int[] score = { 100, 95, 80, 75, 60 };
for(int i = 0; i < score.length; i++)
	System.out.print(score[i] + " ");

 

② Arrays.toString(배열이름) 사용

-> 배열의 모든 요소를 '[첫번째 요소, 두번째 요소, ...]'와 같은 형식의 문자열로 만들어서 반환

int[] score = { 100, 95, 80, 75, 60 };
System.out.println(Arrays.toString(score));

 

※ 배열을 그대로 출력하면?

- score는 배열의 주소를 갖고 있는 참조변수이므로 배열의 주소가 출력

- 형식은 '타입@주소'

 

※ 예외적으로 char배열은 println메서드로 출력하면 각 요소가 구분자없이 그대로 출력됨

 char[] chArr = {'a','b','c','d'};
 System.out.println(chArr);		// abcd가 출력됨

 

6. 배열의 복사

① for문을 이용한 배열 복사

- 비용이 많이 발생

- 처음부터 배열의 길이를 넉넉하게 잡아주는 것이 좋음

- 배열의 요소 하나하나에 접근해서 복사

// 복사될 배열
int[] arr = {1, 2, 3, 4, 5};

// 복사할 배열
int[] tmp = new int[arr.lenght*2];

// for문을 이용하여 복사
for(int i = 0; i < arr.length; i++)
	tmp[i] = arr[i];	// arr[i]의 값을 tmp[i]에 저장
   
arr = tmp;	// 참조변수 arr이 새로운 배열을 가리키게 함

 

② System.arraycopy()를 이용한 배열 복사

- for문보다 효율적

- 지정된 범위의 값들을 한 번에 통째로 복사 (각 요소들이 연속적으로 저장되어 있기 때문)

 

System.arraycopy(배열1, 배열1의 시작 인덱스, 배열2, 배열2의 시작 인덱스, 개수)

-> 배열1의 시작 인덱스부터 개수만큼의 데이터를 배열2의 시작 인덱스에서부터 복사

// 복사될 배열
int[] arr = {1, 2, 3, 4, 5};

// 복사할 배열
int[] tmp = new int[arr.lenght];

// System.arraycopy를 이용하여 복사
// arr[0]부터 arr의 개수만큼 tmp[0]부터에 복사
System.arraycopy(arr, 0, tmp, 0, arr.lenght);

 

 

7. 배열의 활용

① 총합과 평균 : 배열의 모든 요소를 더해서 총합과 평균을 구함

② 최대값과 최소값 : 배열의 요소 중에서 제일 큰 값과 제일 작은 값을 찾음

③ 섞기(shuffle) : 배열의 요소의 순서를 반복해서 바꿈 (카드섞기, 로또번호 생성)

④ 임의의 값으로 배열 채우기 : 연속 또는 불연속적인 값들로 배열을 초기화

⑤ 정렬하기(sort) : 오름차순, 내림차순으로 배열을 정렬

⑥ 빈도수 구하기 : 배열에 어떤 값이 저장되어 있는지 세어서 보여줌

 

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)