1. 배열
- 같은 타입의 여러 변수를 하나로 묶어서 다루는 것
- 각 저장공간이 메모리에 연속적으로 배치되어 있다.
1-1. 배열의 선언과 생성
- 배열 선언은 타입이나 변수 이름 뒤에 `[]`를 붙이면 된다.
- 타입[] 변수이름;
- 타입 변수이름[];
- 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이다.
- 배열을 생성하려면 연산자 `new`와 함께 배열의 타입과 길이를 지정해야 한다.
- 변수이름 = new 타입[길이];
- 길이가 0인 배열도 생성할 수 있다.
- 한번 생성하면 길이를 변경할 수 없다.
- 더 큰 길이의 배열이 필요하다면 새로 생성하여 기존 배열의 내용을 복사해야 한다.
int score[] = new int[5];
- int형 배열 참조변수 score를 선언한다. 데이터를 저장할 수 있는 공간은 아직 마련되지 않았다.
- 연산자 `new`에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.
- 각 배열요소는 자동적으로 int의 기본값인 0으로 초기화된다.
- 대입연산자 `=`에 의해 배열의 주소가 score에 저장된다.
1-2. 배열의 길이와 인덱스
- 생성된 배열의 각 저장공간을 배열의 요소(element)라고 한다.
- 배열이름[인덱스] 형식으로 배열의 요소에 접근한다.
- 인덱스(index)는 배열의 요소마다 붙여진 일련번호로, 각 요소를 구별하는데 사용된다.
- 인덱스의 범위는 0부터 배열길이-1까지이다.
- 배열의 인덱스로 상수 대신 변수나 수식도 사용할 수 있다.
- 인덱스의 범위를 벗어난 값을 사용하지 않도록 주의해야 한다.
- `배열이름.length`를 사용하여 배열의 길이를 얻을 수 있으며, 이 값은 상수이다.
1-3. 배열의 초기화
- 배열은 생성과 동시에 자동으로 자신의 타입에 해당하는 기본값으로 초기화된다.
- 원하는 값을 저장하려면 각 요소마다 값을 지정해야 한다.
int[] score = new int[]{50, 60, 70};
int score = {50, 60, 70};
int socre[];
score = {50, 60, 70} // 에러. 선언과 생성 따로 할 경우 new int[] 생략 불가
int add(int[] arr) {}
int result = add(new int[]{50, 60, 70});
int result = add({50, 60, 70}); // 에러. new int[] 생략 불가
1-4. 배열의 출력
- `Arrays.toString(배열이름)` 메서드를 사용하면 `[첫번째 요소, 두번째 요소, ...]`와 같은 형식의 문자열을 반환한다.
- 예외적으로 char배열은 구분자없이 출력된다. `// abcd`
- 배열의 값을 바로 출력하면 `타입@주소`의 형식으로 출력된다.
1-5. 배열의 복사
- 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;
- System.arrayCopy() 이용
- 복사하려는 위치가 부적절하여 여유 공간이 적을 경우 에러가 발생한다.
// num[0]에서 newNum[0]으로 num.length개의 데이터 복사
System.arraycopy(num, 0, newNum, 0, num.length);
2-6. 배열의 활용
- 총합과 평균 계산
int sum = 0;
float average = 0f;
int[] score = {100, 98, 99};
for(int i=0; i<score.length; i++) {
sum += score[i];
}
average = sum / (float)score.length;
- 최대값, 최소값 구하기
int[] score = {1, 2, 3, 4, 5};
int max = score[0];
int min = score[0];
for(int i=0; i<score.length; i++) {
if(score[i] > max) {
max = score[i];
} else if(score[i] < min) {
min = score[i];
}
}
- 값 섞기
int[] numArr = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = i; // 초기화
}
for(int i=0; i<100; i++) {
int n = (int)(Math.random() * 10); // 0~9
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
- 다음과 같이 보다 효율적으로 작성할 수 있다.
int[] numArr = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = i; // 초기화
}
for(int i=0; i<numArr.length; i++) {
int n = (int)(Math.random() * 10); // 0~9
int tmp = numArr[i];
numArr[i] = numArr[n];
numArr[n] = tmp;
}
- 오름차순 정렬 (버블정렬)
int[] numArr = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = (int)(Math.random() * 10);
}
for(int i=0; i<numArr.length-1; i++) {
boolean changed = false;
for(int j=0; j<numArr.length-1-i; j++) {
if(numArr[j] > numArr[j+1]) {
int temp = numArr[j];
numArr[j] = numArr[j+1];
numArr[j+1] = temp;
changed = true;
}
}
if(!changed) break;
}
2. String 배열
- String 타입은 참조형이기 때문에 String 배열을 생성할 경우 각 요소의 기본값은 null이다.
- null은 아무 객체도 가리키고 있지 않다는 의미이다.
- 객체의 주소가 저장된다.
- char 배열에 메서드를 추가한 것이다.
- 읽은 것은 가능하지만, 문자열을 변경하는 것은 불가능하다. 단지 새로운 문자열이 생성될 뿐이다.
- 문자열의 내용 비교시 equals() 메서드를 사용한다.
- 대소문자를 구분하지 않고 비교할 경우 equalsIgnoreCase() 메서드를 사용한다.
3. 다차원 배열
- 2차원 이상의 배열도 사용할 수 있으며, 2차원 배열은 주로 테이블 형태의 데이터를 다룰 때 사용된다.
int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 score 생성
int[][] score = {
{100, 100, 100},
{200, 200, 200},
{300, 300, 300}
};
int sum = 0;
for(int i=0; i<score.length; i++) {
for(int j=0; j<score[i].length; j++) {
System.out.printf("score[%d][%d] = %d%n", i, j, score[i][j]);
}
}
for(int[] tmp : score) {
for(int i : tmp) {
sum += i;
}
}
System.out.println("sum="+sum);
3-1. 가변 배열
- 다차원 배열 생성시 마지막 차수의 길이를 지정하지 않고 추후에 각기 다른 길이의 배열을 생성하여 보다 유동적으로 배열을 구성할 수 있다.
int[][] score = new int[3][];
score[0] = new int[2];
score[1] = new int[3];
score[2] = new int[4];
'Java' 카테고리의 다른 글
Java :: 객체지향 II (0) | 2024.07.07 |
---|---|
Java :: 객체지향 I (0) | 2024.07.06 |
Java :: 제어문 (0) | 2024.06.24 |
Java :: 연산자 (0) | 2024.06.23 |
Java :: 변수와 형변환에 대하여 (0) | 2024.06.22 |