배열
1. 배열이란?
- 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
- 배열의 참조변수는 실제 값이 저장되는 것이 아닌 실제 값이 저장된 위치의 주소를 가진다
// 정수형 변수 score 1 ~ 5
int score1, score2, score3, score4, score5;
// 정수형 배열 참조변수 score
int[] score = new int[5];
2. 배열의 선언과 생성
- 배열의 선언 : 배열을 다루기 위한 참조변수의 선언
선언방법 선언예
타입[] 변수이름; int[] score;
타입 변수이름[]; int score[];
// 배열을 선언(배열을 다루기 위한 참조변수 선언)
타입[] 변수이름;
int[] score;
// 배열을 생성(실제 저장공간을 생성)
변수이름 = new 타입[길이]
score = new int[5];
3. 배열의 인덱스
- 배열의 인덱스 : 각 요소에 자동으로 붙는 번호
- 인덱스(index)의 범위는 0부터 배열길이-1까지
- int[] score = new int[5];
- score의 길이는 5이지만 인덱스는 0 ~ 4까지이다
4. 배열의 길이
- 배열이름.length : 배열의 길이(int형 상수)
- 배열은 한번 생성하면 그 길이를 바꿀 수 없다
- 배열은 역속적인 값의 집합이기 때문에 각 배열의 크기는 정해져 있다
- 배열 뒤에 메모리의 공간이 비어있는지 확신할 수 없기 때문에 크기 변동이 안된다
- 만약에 더 큰 사이즈로 바꾸고 싶으면 새롭게 큰 공간에 기존 배열을 복사해주어야 한다
- int[] arr = new int[5]; // 길이가 5인 int 배열
- int tnp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다
5. 배열의 초기화
- 배열의 각 요소에 처음으로 값을 저장하는 것
- 자동초기화가 된다(int는 0으로 초기화 된다)
// 초기화 방법 1
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
// 초기화 방법 2
int[] score = { 50, 60, 70, 80, 90 };
// 방법 2는 나눠서 초기화할 수 없다
int[] score;
score = {50, 60, 70, 80, 90};
// 방법 2를 나눠서 초기화할 경우 방법3
int[] score;
score = new int[]{50, 60, 70, 80, 90};
6. 배열의 출력
int[] iArr = { 100, 95, 80, 70, 60 };
// 배열을 가리키는 참조변수 iArr의 값을 출력한다
System.out.println(iArr); // [I@14318bb]와 같은 메모리의 주소가 출력된다
// 예외로 char 배열은 값이 출력이 된다
char[] chArr = { 'a', 'b', 'c', 'd' };
System.out.println(chArr); // abcd
// for문을 사용
for(int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);
}
// 배열 iArr의 모든 요소를 출력한다.[100, 95, 80, 70, 60]이 출력된다
System.out.println(Arrays.toString(iArr));// 문자열로서 출력 된다
7. 배열의 활용
// 1. 총합과 평균
int sum = 0;
float average = 0f;
int[] score = {100, 88, 100, 100, 90};
for(int i = 0; i < score.length; i++) {
sum += score[i];
}
average = sum / (float)score.length;
System.out.println("총합 : " + sum);
System.out.println("평균 : " + average);
// 2. 최대값과 최소값
int[] score = {79, 88, 91, 32, 100, 55, 95};
int max = score[0], min = score[0];
for(int i = 1; i < score.length; i++) {
if(score[i] > max){
max = score[i];
} else if(score[i] < min){
min = score[i];
}
}
System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
// 3. 섞기(shuffle)
int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(numArr));
for(int i = 0; i < 100; i++) {
int n = (int)(Math.random() * 10);
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
System.out.println(Arrays.toString(numArr));
8. String배열의 선언과 생성
// 3개의 문자열을 담을 수 있는 배열을 생성
String[] name = new String[3];
name[0] = "Kim";
name[1] = "Moon";
name[2] = "Park";
9. 커맨드 라인을 통해 입력받기
// 이클립스에서 실행하게 되면 통상 방법으로는 args배열에 전달할 수 없다
public static void main(String[] args) {
System.out.println("매개변수의 개수:"+args.length);
for(int i = 0; i < args.length; i++) {
System.out.println("args["+i+"] = \""+args[i]+"\"");
}
}
- 이클립스에서 args에 값 전달 방법1
- 이클립스에서 args에 값 전달 방법2
- 예제 풀이
10. 2차원 배열
- 테이블 형태의 데이터를 저장하기 위한 배열
// 4행 3열의 2차원 배열을 생성
int[][] score = new int[4][3];
- score[column index][row index]
score[0][0] score[0][1] score[0][2]
score[1][0] score[1][1] score[1][2]
score[2][0] score[2][1] score[2][2]
score[3][0] score[3][1] score[3][2]
11. 2차원 배열의 초기화
// 초기 초기화
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}};
// 간소화된 초기화
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
// 주로사용되는 초기화, 간소화된 초기화랑 같으나 그저 가독성을 높여준 작성법
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
12. 2차원 배열 예제
// 1. 배열에 있는 모든 값의 합 구하기
int[][] score = {
{ 100, 100, 100 },
{ 20, 20, 20 },
{ 30, 30, 30 },
{ 40, 40, 40 }
};
int sum = 0;
for(int i = 0; i < score.length; i++) {
for(int j = 0; j < score[0].length; j++){
sum += score[i][j];
}
}
System.out.println("sum = " + sum); // 570
13. String 클래스
- String 클래스는 char[]와 메서드(기능)를 결합한 것
- String클래스 = char[] + 메서드(기능)
- String 클래스는 내용을 변경할 수 없다(read only)
- String a = "a";
- String b = "b";
- a = a + b; // "a"가 "ab"가 되는 것이 아닌 "ab"라는 완전히 새로운 값이 만들어져 a 참조변수에 참조된다
메서드 설명
char charAt(int index) 문자열에서 해당 위치(index)에 있는 문자를 반환
int length() 문자열의 길이를 반환
String substring(int from, int to) 문자열에서 해당 범위(from ~ to)의 문자열을 반환(to는 포함 안됨)
boolean equals(Ojbect obj) 문자열의 내용이 같은지 확인한다,
같으면 결과는 true, 다르면 false
char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환
14. Arrays로 배열 다루니
- 배열의 비교와 출력 : equals(), deepEquals(), toString(), deepToString()
int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11,12}, {21,22}};
System,out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
// deepToString()은 2차원이상 다차원 배열일 때 사용
System,out.println(Arrays.deepToString(arr2D)); // [[11, 12],[21,22]]
String[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2); // false
// 다차원 배열은 deep을 붙여준다
System.out.println(Arrays.deepEquals(str2D, str2D2); // true
- 배열의 복사 : copyOf(), copuOfRange()
int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = [0, 1, 2, 3, 4]
int[] arr3 = Arrays.copyOf(arr, 3); // arr3 = [0, 1, 2]
int[] arr4 = Arrays.copyOf(arr, 7); // arr4 = [0, 1, 2, 3, 4, 0, 0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); // arr5 = [2,3] <- 4는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6 = [0,1,2,3, 4, 0, 0]
int[] arr = { 3, 2, 0, 1, 4};
Arrays.sort(arr); // [0, 1, 2, 3, 4]