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];
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 (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-06] 객체지향프로그래밍 - 클래스, 객체 (0) | 2021.02.16 |
---|---|
[Java-05] 배열(Array) - String 배열, 2차원 배열 (0) | 2021.02.15 |
[Java-04] 조건문과 반복문 (0) | 2021.02.09 |
[Java-03] 연산자(Operator) - 비교 연산자, 논리 연산자, 비트 연산자 (0) | 2021.02.08 |
[Java-03] 연산자(Operator) - 단항 연산자, 산술 연산자 (0) | 2021.02.02 |