- 배열 선언
자료타입[] 변수이름;
- 배열 원소 (element)
배열에 담긴 각각의 데이터- 배열의 길이 (length)
배열 원소의 개수, 즉 배열에 담긴 데이터의 개수
- 배열 인덱스 (첨자, index)
배열의 인덱스는 0부터 시작해서, (배열의 길이 - 1)까지가 됨
배열인덱스를 사용하여 배열원소에 접근하여 사용
- 배열을 new로 생성한뒤에는 자동초기화 가 됨.
숫자타입들은 --> 0으로
boolean타입은 --> false 로
객체타입(Object) 타입은 --> null 로.
★ 배열변수의 타입, 배열원소의 타입 확실히 구분하자
★ JVM 메모리 상에 생기는 구조 이해 필수
package com.lec.java.array01;
public class Array01Main {
public static void main(String[] args) {
System.out.println("배열(Array)");
// 배열이 필요한 이유
// 동일 타입 데이터(들)을 위해 매번 새로운 변수 생성 불가
int korean1 = 99;
int korean2 = 88;
int korean3 = 77;
// 배열을 선언, 초기화
int[] korean = new int[3];
// int 타입의 배열을 선언
// 3개의 int 타입을 저장할 수 있도록 초기화
korean[0] = 90; // 첫번째 배열원소에는 int 값 90 대입
korean[1] = 80;
korean[2] = 70;
// korean[3] = 60; // 배열의 인덱스는 0 ~ 2 까지만 가능 - 에러: ArrayIndexOutOfBoundsException
System.out.println("국어0: " + korean[0]);
System.out.println("국어1: " + korean[1]);
System.out.println("국어2: " + korean[2]);
// 변수 korean의 타입은???? ===> int[] 타입
// 변수 korean[0]의 타입은???? ===> int 타입
System.out.println("for문 사용해서 출력");
for(int n = 0; n < 3; n++) {
System.out.printf("korean[d] = %d\n", n , korean[n]);
}
System.out.println();
// int 타입의 english라는 길이가 5인 배열을 선언 & 초기화
int [] english = new int[5];
// int []english;
// int english[];
System.out.println(english[1]); // 0으로 자동 초기화
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array01Main
- 배열 선언 따로, 초기화 따로
타입[] 이름 = new 타입[배열의 길이];
- 배열을 선언과 동시에 초기화 1
타입[] 이름 = new 타입[ ] {a, b, c, ...};
- 배열을 선언과 동시에 초기화 2
타입[] 이름 = {a, b, c, ...};
- 배열의 길이를 자동으로 알 수 있는 방법
배열이름.length
package com.lec.java.array02;
public class Array02Main {
public static void main(String[] args) {
System.out.println("배열의 선언과 초기화");
int [] kor = new int[3];
kor[0] = 100;
kor[1] = 90;
kor[2] = 80;
// 배열 선언과 동시에 초기화 1
int [] eng = new int[] {30, 20, 30, 40};
for(int i =0; i < 4; i++) {
System.out.println("영어" + i + ": " + eng[i]);
}
System.out.println();
// 배열 선언과 동시에 초기화 2
// 수학점수의 총점과 평균을 계산
int [] math = {100, 96, 83, 25, 59, 99, 100, 22, 11};
int total = 0;
int n= 0;
while(n < math.length) {
System.out.println("수학" + n + ": " + math[n]);
total += math[n];
n++;
}
System.out.println("수학총점: " + total);
double avg = (double)total / math.length;
System.out.println("수학평균: " + avg);
System.out.println("수학배열의 length: " + math.length);
int [] score = {10,20,30,40,50};
for (int i = 0; i < score.length; i++) { // ctrl + space => use index on array (for문 자동완성)
}
// 배열변수를 출력하면 뭐가 나오나???
System.out.println(score); // 실제 배열 객체가 생긴 메모리 주소 ('[' : 1차원 배열이라는 의미)
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array02Main
package com.lec.java.array03;
public class Array03Main {
public static void main(String[] args) {
System.out.println("여러가지 자료형의 배열");
System.out.println();
System.out.println("[1] double형 배열");
// 타입[] 이름 = new 타입[배열 길이];
// 타입[] 이름 = new 타입[] {a, b, ...};
// 타입[] 이름 = {a, b, ...};
double [] array1 = {1.2, 2.3, 3.4};
for (int i = 0; i < array1.length; i++) {
System.out.println("array1[" + i + "] = " + array1[i]);
}
System.out.println();
System.out.println("[2] char형 배열");
// TODO
System.out.println();
System.out.println("[3] boolean형 배열");
// TODO
System.out.println();
System.out.println("[4] String형의 배열");
String [] array4 = new String[3];
array4[0] = "Hello Java";
array4[1] = "Hello C++";
array4[2] = "Hello HTML5";
for (int i= 0; i < array4.length; i++) {
System.out.println("aaray4[" + i + "] = " + array4[i] + "(" + array4[i].length() + "글자)");
}
// array4의 타입은? => String[]
// array4[0]의 타입은? ==> String
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array03Main
- 직전의 예제와 같이 같이 배열 첨자를 하나만 쓰는 배열을 1차원 배열 (one-dimensional array) 이라고 함
ex) 배열 첨자를 2개사용하면 2차원 배열
배열 첨자를 3개사용하면 3차원 배열
...
- 배열원소가 '1차원 배열' 들로 이루어진 배열을 2차원 배열 이라 한다 (배열첨자 2개 사용)
- 배열원소가 '2차원 배열' 들로 이루어진 배열을 3차원 배열 이라 한다 (배열첨자 3개 사용)
package com.lec.java.array05;
import java.util.Scanner;
public class Array05Main {
public static void main(String[] args) {
System.out.println("2차원 배열");
// 1차원배열 x 3개 갖고 있는 2차원 배열
int[][] array = {
{1, 2}, // <- array[0]
{3, 4}, // <- array[1]
{5, 6} // <- array[2]
};
System.out.println(array.length);
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println(array[1][0]);
System.out.println(array[1][1]);
System.out.println(array[2][0]);
System.out.println(array[2][1]);
// System.out.println(array[2][2]); // 오류 : ArrayIndexOutofBoundsException
// ※ 흔히 2차원 배열을 행과 열로 표현하기도 함
// array 는 행(row) 3개, 열(column)이 2개인 2차원 배열
// 2차원 배열에서 length의 의미:
// array.length: 2차원 배열의 원소, 즉 1차원배열의 개수
// 행열의 개념에선 2차원 배열의 행(row)의 개수를 의미
System.out.println("array[0].length = " + array[0].length);
System.out.println("array[1].length = " + array[1].length);
// array 의 타입은? --> int[][]
// array[0] 의 타입은? --> int[]
// array[0][0] 의 타입은? --> int
System.out.println();
// 2차원 배열 확인
for(int x = 0; x < array.length; x++) {
for(int y =0; y < array[x].length; y++) {
System.out.print(array[x][y] + "\t");
}
System.out.println();
}
System.out.println();
System.out.println(array);
System.out.println(array[0]);
System.out.println(array[0][0]);
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array05Main
[메모리 예시]
[연습문제]
package 배열2.자가진단06;
import java.util.Scanner;
public class Main {
/*
85 67 95 65
80 95 86 56
100 98 67 86
95 76 84 65
67 86 90 76
*/
public static void main(String[] args) {
// 5명 학생 x 4개 과목 점수 담을 2차원 배열
int [][] score = new int[5][4];
Scanner sc = new Scanner(System.in);
for(int stu = 0; stu < score.length; stu++) {
for(int subj = 0; subj < score[stu].length; subj++) {
score[stu][subj] = sc.nextInt();
}
}
sc.close();
int success = 0; // 합격한 학생수
// 학생별로 점수 계산
for(int stu = 0; stu < score.length; stu++) {
int sum = 0;
double avg = 0.0;
// stu 학생의 총점 구하기 => sum
for(int subj = 0; subj < score[stu].length; subj++) {
sum += score[stu][subj]; // stu 번째 학생의 subj 과목점수 합산
}
avg = (double)sum / score[stu].length;
if(avg >= 80) {
System.out.println("pass");
success++; // 합격자수 +1 증가
} else {
System.out.println("fail");
}
}
System.out.println("Successful : " + success);
}
}
가변 배열 : column(열)의 개수가 일정하지 않은 배열
가변 배열 선언 방법
- 행의 개수만 지정을 하고, 열의 개수는 비워둠
- 열(column)이 몇 개가 될 지 모르기 때문에 메모리 할당이 되지 않습니다.
package com.lec.java.array09;
public class Array09Main {
public static void main(String[] args) {
System.out.println("Ragged Array(가변 배열)");
int [][] arr;
arr = new int[3][]; // 1차원 배열 3개를 담는 2차원 배열 객체 생성
arr [0] = new int[1]; // int 값 1개 갖는 1차원 배열 생성 (length 1)
arr [1] = new int[2]; // int 값 2개 갖는 1차원 배열 생성 (length 2)
arr [2] = new int[3]; // int 값 3개 갖는 1차원 배열 생성 (length 3)
arr[0][0] = 1;
arr[1][0] = 2;
arr[1][1] = 3;
arr[2][0] = 4;
arr[2][1] = 5;
arr[2][2] = 6;
for(int x = 0; x < arr.length; x++) {
for(int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
}
System.out.println();
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array09Main
for (배열타입 변수 : 배열이름) { ... }
package com.lec.java.array10;
public class Array10Main {
public static void main(String[] args) {
System.out.println("Enhanced for (향상된 for) 문");
int [] arr = {11, 22, 33, 44, 55};
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
for(int x : arr) {
System.out.print(x + " ");
}
System.out.println();
System.out.println();
int [][] array = {
{1,2},
{3, 4, 5, 6},
{7, 8, 9}
};
for(int[] row : array) {
for(int x : row) {
System.out.print(x + " ");
}
System.out.println();
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array10Main
- 배열을 다루는 유용한 메소드들 제공
Arrays.toString() : 문자열 형태로 리턴
Arrays.copyOf(원본배열, 복사할 length) -> 앞에서부터 복사
Arrays.copyOfRange(원본배열, from, to))
Arrays.fill() : 배열에 특정 값으로 채우기
Arrys.sort(원본배열) : 오름차순 변경
Arrays.asList() : array -> List 로
package com.lec.java.array13;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Array13Main {
public static void main(String[] args) {
System.out.println("java.util.Arrays 클래스");
int [] arr = {10, 20, 30, 40, 50};
System.out.println(Arrays.toString(arr));
int [] arr2 = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(arr2));
int [] arr3 = Arrays.copyOf(arr, 10); // length 가 원본보다 크면, 나머지 부분은 기본값(0)들로 채워짐
System.out.println(Arrays.toString(arr3));
int [] arr4 = Arrays.copyOfRange(arr, 0, 2); // 0번째부터 2 전까지 복사
System.out.println(Arrays.toString(arr4));
int [] arr6 = new int[4];
Arrays.fill(arr6, 8); // 죄다 8로 채움
System.out.println(Arrays.toString(arr6));
int [] arr7 = {8, 9, 3, 5, 1, 2};
System.out.println(Arrays.toString(arr7));
Arrays.sort(arr7); // sort에서 내림차순 지원 X
System.out.println(Arrays.toString(arr7));
System.out.println("\n프로그램 종료");
} // end main
} // end class
package com.lec.java.array14;
import java.util.Arrays;
public class Array14Main {
public static void main(String[] args) {
System.out.println("Reference 타입 주의할 사항");
int a = 10;
int b = 20;
System.out.println("a: " + a + ", b:" + b);
a = b; // '값'의 복사
System.out.println("a: " + a + ", b:" + b);
a = 30;
System.out.println("a: " + a + ", b:" + b);
int [] arrA = {10, 10, 10};
int [] arrB = {20, 20, 20};
System.out.println("A: " + arrA + ", B: " + arrB);
System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
arrA = arrB; // '값'의 복사. reference 타입이기 때문에 주솟값이 복사된다.
// arrA = arrB 하는 순간 먼저 arrA 가 referencing 하던 배열 객체의 reference 는 끊긴다.
// reference 가 끊긴 객체는 JVM 의 Garbage Collector 에 의해 메모리에서 삭제된다.
System.out.println("A: " + arrA + ", B: " + arrB);
System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
arrA[0] = 500;
System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
System.out.println("\n프로그램 종료");
} // end main
} // end class
[주솟값의 복사]