티스토리 뷰
📌 배열
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 여러 데이터를 저장하고 다루어야 한다면 배열로 좀 더 간편하게 사용할 수 있다.
👉 배열 (array)
1. 배열의 선언과 생성
int[] score; //타입[] 배열명;
int score[]; //타입 배열명[];
✔ 대괄호를 배열명의 앞에 사용해도 되고, 뒤에 사용해도 된다.
✔ 대괄호가 배열명의 일부라기보다, 타입의 일부라고 볼 수 있기 때문에 전자를 추천한다.
int[] scoreA = new int[5];
int[] scoreB;
scoreB = new int[5];
✔ 배열의 선언은 단지 생성된 배열을 다루기 위해 참조 변수를 위한 공간을 만드는 것
✔ 이렇게 배열을 선언해 저장 공간을 만들었다면, 배열을 생성할 수 있다.
✔ 배열을 생성할 때에는 연산자 'new'와 함께 배열의 타입과, 길이를 지정해주어야 한다.
✔ 배열의 선언과 생성은 따로따로도 가능하고, 한 번에 함께 할 수 도 있다.
2. 배열의 길이와 인덱스
int[] arr = new int[5];
arr[0] = 10; //배열의 첫번째 요소
arr[1] = 20; //배열의 두번째 요소
int sum = arr[0]+arr[1]; //sum=30
✔ 생성된 배열의 저장공간을 요소라고 하며, 배열 이름[인덱스]의 형태로 각 요소에 접근할 수 있다.
✔ 배열의 인덱스는 1이 아닌 0부터 시작한다.
✔ 배열의 요소는 상수나 변수처럼 수식에서도 사용할 수 있다.
✔ 배열의 유효한 범위를 벗어나는 경우 컴파일 시 문제가 없었어도 실행 시에 에러가 발생하니 주의하자.
int[] arr = new int[5];
int len = arr.length;
✔ 배열의 길이는 배열 생성 시, 대괄호 안에 적어둔 배열 요소의 개수를 말한다.
✔ 배열명.length 을 사용해 배열의 길이를 얻을 수 있다.
✔ 배열의 길이는 한번 생성하면 변경할 수 없기 때문에, 배열명.length 는 상수라고 볼 수 있다. 그러므로 값을 변경할 수 없다.
int[] arr = new int[0];
✔ 길이가 0인 배열도 생성할 수 있다. 지금은 아니고 나중에 유용하게 사용할 수 있으니 기억해두자.
3. 배열의 초기화
int[] arr = new int[5];
arr[0] = 10; //배열의 첫번째 요소
arr[1] = 20; //배열의 두번째 요소
arr[2] = 30; //배열의 세번째 요소
arr[3] = 40; //배열의 네번째 요소
arr[4] = 50; //배열의 다섯번째 요소
✔ 배열은 생성과 동시에 자신의 자료형에 해당하는 기본값으로 초기화된다. (int는 0)
✔ 기본값이 아닌 원하는 값으로 초기화하려면 위와 같이 각 요소마다 값을 초기화해주어야 한다.
int[] arr = new int[5];
for(int i=0; i<arr.length; i++){
arr[i] = 10 * (i+1); // 10 20 30 40 50
}
✔ 배열의 길이가 길어서 요소마다 값을 지정하기 힘들 때에는 for문을 사용하자.
✔ 배열의 길이만큼 반복을 해야 하므로, 배열명.length를 조건식에 사용한다.
✔ 다만, 배열의 요소에 저장할 값들에 일정한 규칙이 있어야 초기화 시 for문을 사용할 수 있다.
int[] arr = new int[5];
//배열 초기화
for(int i=0; i<arr.length; i++){
arr[i] = 10 * (i+1);
}
//배열의 요소 출력하기
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
// 1 2 3 4 5 6 7 8 9 10
✔ 배열의 모든 요소를 출력하고자 할 때에도 for문을 사용한다.
int[] arr = new int[5];
//배열 초기화
for(int i=0; i<arr.length; i++){
arr[i] = 10 * (i+1);
}
//배열에 할당된 메모리의 주소를 출력
System.out.print(arr);
✔ 만약 배열명을 출력하면, 배열에 할당된 저장공간의 주소를 출력한다.
//배열 선언
int[] arr;
//배열 생성
arr = new int[5];
//배열 초기화
for(int i=0; i<arr.length; i++){arr[i] = i+1;}
//배열 선언 + 생성 + 초기화 → 생성 생략 가능
int[] arr = { 1, 2, 3, 4, 5};
✔ 배열의 선언, 생성, 초기화를 위처럼 따로 할 수 있지만 한 번에 하는 것도 가능하다.
✔ 중괄호를 사용한 초기화는 선언과 함께하는 경우에만 사용 가능하니 주의하자.
4. 배열의 복사
✔ 배열은 길이를 변경할 수 없기 때문에, 더 많은 저장공간이 필요하면 더 큰 배열을 생성하고 배열 요소를 복사해 다시 저장한다.
✔ 배열을 복사할 수 있는 방법은 두 가지가 있다.
int[] arrA = new int[5] { 1, 2, 3, 4, 5 };
int[] arrB = new int[10]; //기존 배열의 2배
//기존 배열 요소의 값으로
//새로운 배열 요소를 초기화 해야하기 때문에
//기존 배열의 길이만큼 for문을 돌려야한다.
for(int i=0; i<arrA.length; i++){
arrB[i] = arrA[i];
}
//참조변수 arrA가 arrB를 가리키게 한다
arrA = arrB;
✔ 첫 번째 방법은 더 큰 배열을 만든 다음, for문을 사용해서 배열 요소를 하나하나 복사해 초기화하는 방법이다.
✔ 메모리 공간 낭비를 방지하기 위해, 기존에 사용하던 배열의 2배 길이로 배열을 생성하는 것을 추천한다.
✔ 그리고 기존의 배열명은 참조 변수이므로, 새롭게 만든 배열을 가리키도록 참조 변수를 초기화해주어야 한다.
✔ 이렇게 하면, arrA를 사용해서 arrB의 요소에 접근할 수 있다.
int[] arrA = new int[5] { 1, 2, 3, 4, 5 };
int[] arrB = new int[10];
System.arraycopy(arrA, 0, arrB, 0, arrA.length);
✔ System.arraycopy() 함수를 사용하여 배열을 통째로 복사할 수 있다.
✔ 요소를 하나하나 옮기는 첫 번째 방법보다 간단하고 빠르다.
✔ 복사하려는 배열에 여유 공간이 부족하면 에러가 발생한다.
5. 배열의 활용
✔ 배열의 활용은 다양하게 가능하다. 아래의 예제들을 풀어나가면서 확인해보자.
✔ 교재의 예제와 다르게 키워드를 보고 새롭게 만들어봤다.
//총 합과 평균
public class Main {
public static void main(String args[]) {
int[] score = {87,64,52,90,100};
int sum=0;
float avg;
for(int i : score) {
sum+=i;
}
avg = (float)sum/score.length;
System.out.printf("합계 : %10d 점\n평균 : %10.2f 점\n",sum, avg);
}
}
//최대값과 최소값
public class Main {
public static void main(String args[]) {
int[] score = {87,64,52,90,100};
int min = score[0];
int max = 0;
for(int i : score) {
if(min>i) min=i;
else if(max<i) max=i;
}
System.out.printf("최저점 : %5d 점\n최고점 : %5d 점\n",min, max);
}
}
//섞기(shuffle)
public class Main {
public static void main(String args[]) {
int[] arr = {10,20,30,40,50,60,70,80,90,100};
//기존 순서대로 출력
System.out.print("섞기 전 : ");
for(int i:arr) {
System.out.print(i+" ");
}System.out.println();
//섞기(shuffle)
for(int i=0; i<arr.length; i++) {
//Math.random()은 0부터 1까지 랜덤하게 실수 값을 반환
//10을 곱하고 int로 형변환을 해주면, 0~9를 랜덤으로 반환한다.
int n = (int)(Math.random()*10);
//랜덤으로 정해진 index의 요소 값을 i번째 요소와 맞바꾸어보자.
int temp = arr[i];
arr[i] = arr[n];
arr[n] = temp;
}
//멋대로 바뀐 순서대로 출력 (실행할 때 마다 순서가 바뀐다)
System.out.print("섞은 후 : ");
for(int i:arr) {
System.out.print(i+" ");
}System.out.println();
}
}
//임의의 값으로 배열 채우기
public class Main {
public static void main(String args[]) {
int[] arr = new int[10];
for(int i=0; i<arr.length; i++) {
arr[i] = (int)(Math.random()*100); //0~99 임의값으로 초기화
System.out.printf("%d ", arr[i]); //출력
}
}
}
//임의값으로 채우고 정렬하기(sort)
public class Main {
public static void main(String args[]) {
int[] arr = new int[10];
System.out.print("정렬 전 : ");
for(int i=0; i<arr.length; i++) {
arr[i] = (int)(Math.random()*100); //0~99 랜덤으로 초기화
System.out.printf("%2d ", arr[i]); //출력
}
int temp;
for(int i=0; i<arr.length; i++) {
int min = arr[i];
int idx = i;
for(int j=i; j<arr.length; j++) {
if(min>arr[j]) {
min = arr[j];
idx = j;
}
}
temp = arr[i];
arr[i] = min;
arr[idx] = temp;
}
System.out.print("\n정렬 후 : ");
for(int i:arr){
System.out.printf("%2d ", i); //출력
}
}
}
6. 배열의 초기화 기본 값
자료형 | 기본값 |
boolean | false |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
[참고] 자바의 정석
'BackEnd > JAVA' 카테고리의 다른 글
싱글톤 패턴(SingleTone Pattern) (0) | 2021.10.25 |
---|---|
[Ch.05] 2. String 배열, 다차원 배열 (0) | 2021.03.14 |
[Ch.04] 조건문과 반복문 (0) | 2021.03.05 |
[Ch.03] 5. 기타 연산자 (0) | 2021.02.28 |
[Ch.03] 4. 비교 연산자/논리 연산자 (0) | 2021.02.28 |