1. 배열(Array)
1.1 배열(Array)이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 ‘배열’이라고 한다. 변수와 달리 배열은 각 저장공간이 연속적으로 배치되어 있다.
int[] score = new int[5] //5개의 int값을 저장할 수 있는 배열을 생성한다.
참고로 변수 score은 배열을 다루는데 필요한 참조변수일 뿐 값을 저장하기 위한 공간은 아니다. 그리고 score에는 배열 score[0]의 주소가 저장된다.
1.2 배열의 선언과 생성
//배열을 선언(배열을 다루기 위한 참조변수 선언)
타입[] 변수이름;
int[] score;
//배열을 생성(실제 저장공간을 생성)
변수이름 = new 타입[길이];
score = new int[5];
//배열의 선언과 생성을 동시에
타입[] 변수이름 = new 타입[길이];
int[] score = new int[5];//길이가 5인 배열
단계별로 보면 int형 배열 참조변수 score를 선언했을때는 데이터를 저장할 수 있는 공간은 아직 마련되지 않았다. 연산자 new에 의해 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다. 이때 배열 요소는 int의 기본값인 0으로 최고하된다. 끝으로 대입연산자 = 를 통해서 배열의 주소가 int형 배열 참조변수 score에 저장된다.
1.3 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 ‘배열의 요소(element)’라고 하며, 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 인덱스는 0부터 시작한다.
배열을 다룰때는 index의 범위를 벗어난 값을 index로 사용하지 않아야 하며, 컴파일러는 이러한 실수를 걸러주지 못한다. 왜냐하면 배열의 index로 변수를 많이 사용하는데 변수의 값은 런타입시에 대입되므로 컴파일러는 이 값의 범위를 확인할 수 없다. 해당 에러는 (ArrayIndexOutOfBoundsException)이다.
배열을 생성할 때 괄호[] 안에 배열의 길이를 적어줘야하는데, 이 배열의 길이는 값을 저장할 수 있는 공간의 개수다. 참고로 길이가 0인 배열도 생성이 가능하다.
배열이름.length
이렇게 하면 배열 길이에 대한 정보를 얻을 수 있다.
int[] arr = new int[5];
int tmp = arr.length;
1.4 배열의 초기화
배열은 생성과 동시에 자동적으로 기본값으로 초기화되기 때문에 for문을 통해 값을 하나씩 넣거나 , 저장할 값을 쉼표로 구분해 나열해서 배열을 초기화할 수 있다. 후자의 방법은 배열의 길이가 자동으로 결정되기 때문에 배열의 길이는 안적어도 된다.
int[] score = new int[]{1,2,3,4,5};
int[] score = {1,2,3,4,5};
배열의 출력
for문을 이용해 하나씩 출력할수도 있지만, Arrays.toString(배열이름)을 통해 배열 요소를 문자열로 만들어 출력할 수 있다.
int[] iArr = {1,2,3,4,5};
System.out.println(Arrays.toString(iArr)); // 배열의 값 출력
System.out.println(iArr); //그냥 출력시 타입@주소 형태로 출력
1.5 배열의 복사
배열을 복사하는 방법은 2가지 있다.
- for문을 하나씩 복사
int[] arr = new int[5];
int[] tmp = new int[arr.length *2];
for(int i =0; i< arr.length; i++){
tmp[i] = arr[i];
}
arr = tmp;
마지막에 변수 tmp에 저장된 값을 변수tmp 에 저장하면 참조변수 arr과 tmp는 같은 배열을 가리키게 된다. 즉 이름만 다를뿐 동일한 배열이며 전에 arr이 가리키던 배열은 더 이상 사용할 수 없게 된다. 이렇게 쓸모없어진 배열은 JVM의 가비지컬렉터에 의해서 자동적으로 메모리에서 제거된다.
- System.arraycopy() 를 이용한 복사
//num[0]에서 newNum[0]으로 num.length개의 데이터를 복사한다는 의미
System.arraycopy(num, 0, newNum, 0, num.length);
1.6 배열의 활용
2. 최대값과 최소값
public static void main(String[] args) {
int[] score = {3, 4, 5, 6, 7, 8, 1};
int max = score[0]; //배열의 첫번째 값으로 초기화
int min = score[0];
for (int i = 1; i < score.length; i++) {
if (max < score[i]) {
max = score[i];
} else if (min > score[i]) {
min = score[i];
}
}
System.out.println(max);
System.out.println(min);
}
3. 섞기 , 로또 번호 생성 등
public static void main(String[] args) {
//섞기
int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//100은 100번을 섞으려고/
for (int i = 0; i < 100; i++) {
//random함수는 0.0~ 1.0값을 출력
int n = (int) (Math.random() * 10);
System.out.println(n);
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
System.out.println(Arrays.toString(numArr));
}
public static void main(String[] args) {
//로또 번호 구하기
int[] ball = new int[45];
for (int i = 0; i < ball.length; i++) {
ball[i] = i;
}
int tmp = 0;
int randomNum = 0;
//배열의 앞의 6개까지 섞기
for (int i = 0; i < 6; i++) {
randomNum = (int) (Math.random() * 45); // 0 ~ 45까지의 랜덤 숫자
tmp = ball[randomNum];
ball[randomNum] = ball[i];
ball[i] = tmp;
}
for (int i = 0; i < 6; i++) {
System.out.println(ball[i]);
}
}
4. 임의의 값으로 배열 채우기
public static void main(String[] args) {
//임의의 값으로 배열 채우기
int[] code = {1, 3, 5, 6, -1};
int[] arr = new int[10];
int tmp = 0;
for (int i = 0; i < arr.length; i++) {
tmp = (int) (Math.random() * code.length);//code.length가 5이이니까 0 ~ 4사이의 랜덤 숫자가 나옴
arr[i] = tmp;
}
System.out.println(Arrays.toString(arr));
}
5. 정렬하기 : 오름차순, 내림차순으로 배열을 정렬
public static void main(String[] args) {
//버블정렬 오름차순
//버블정렬은 인접한 두 원소를 비교해 조건에 맞지 않을 때 자리를 교환한다.
int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int tmp = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) { // 1회전 수행시 가장 큰 값이 맨 뒤로 이동했으므로 2회전에서는 맨 끝에 있는 원소 제외
if (arr[j] > arr[j + 1]) {
tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
System.out.println(Arrays.toString(arr));
}
- 버블정렬
- 버블 정렬은 데이터 집합을 한번 순회할때마다 정렬해야하는 데이터의 집합의 범위가 하나씩 줄어드므로 , 데이터 집합의 범위를 n개라고 한다면 n-1만큼이 반복하면 정렬이 된다.
- 예시에서 6개가 정렬이 될때 5개가 정렬대상이었고, 5가 정렬될때는 4개의 요소가 정렬대상이었다. 측 5 + 4 + 3+ 2+ 1 = 15따라서 시간복잡도는 (n-1) + (n -2) + (n-3) + (n-4) +... + (n-(n-2)) + (n- (n-1)) => n(n-1)/2 이므로 O(n^2)이다.
- 공간 복잡도는 주어진 배열안에서 교환을 통해 정렬이 되므로 O(n)이다.
6. 배열의빈도수 구하기
public static void main(String[] args) {
int[] arr = new int[10];
int[] answer = new int[10];
for (int i = 0; i < arr.length; i++) {
//0 ~ 9사이의 랜덤 숫자를 구해서 배열에 넣기
arr[i] = (int) (Math.random() * arr.length);
}
System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
answer[arr[i]]++; //증가시키기
}
for (int i = 0; i < answer.length; i++) {
System.out.println(i + "의 개수" + answer[i]);
}
}
출처 : 자바의 정석
'Java' 카테고리의 다른 글
[JAVA] 다차원 배열 (0) | 2023.12.06 |
---|---|
[Java] String 배열 (0) | 2023.12.06 |
객체지향 설계 5원칙 - SOLID (0) | 2023.02.23 |
원시타입(Primitive type) vs 참조타입(Reference type) (0) | 2023.02.17 |
JVM과 자바의 실행 과정 (0) | 2023.02.16 |