동일한 자료형을 가지는 변수들의 집합
- 인덱스는 0부터 시작한다
- 배열은 항상 참조형이다
- 반복문을 사용할 수 있다
자료형 [] 변수명;
자료형 [] 변수명 = new 자료형[];
int [] arr = new int[4];
//정수 4개를 저장할 수 있는 배열
배열을 선언 후 할당하게 되면 각 자료형의 기본값이 들어간다
숫자형 = 0
boolean = false
char = ' '
참조형에서 주소는 스텍에 있고
데이터는 주소가 가리키는 곳 heap에 저장되어 있다
이 때 주소값이 비어 있으면 null 값이 들어 있다
int[] arr1 = new int[5];
for (int i=0; i<arr1.length; i++) {
System.out.println(arr1[i]);
} // int의 기본값 0, 0, 0, 0, 0 출력
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
arr1[3] = 4;
arr1[4] = 5;
for (int i=0; i<arr1.length; i++) {
System.out.println(arr1[i]);
} //1, 2, 3, 4, 5 출력
int[] arr = {1, 2, 3, 4, 5};
new int[4] 배열이 만들어진다
arr[5]를 출력하게 되면 runtime error 발생
lotto 프로그램 ( 중복 제거 / com 값과 user 값 대조 )
public void practice( ) {
Scanner sc = new Scanner(System.in);
int[] user = new int[6];
Random r = new Random();
for(int i=0; i<user.length; i++) {
System.out.print((i+1)+"번째 숫자를 입력해 주세요 : ");
user[i] = sc.nextInt();
if(user[i]>45 || user[i]<1) {
System.out.println("1~45 사이 값으로 입력하세요.");
i--;
continue;
}
// 중복을 제거
// 0번, 1번, 2번, 3번, 4번, 5번
for(int j=0; j<i; j++) {
if(user[i] == user[i-1]) {
System.out.println("이미 입력한 값입니다.");
i--;
continue;
}
}
}
// 오름차순정렬
for(int i=0; i<user.length-1; i++) {
for(int j=0; j<user.length-1-i; j++) {
if(user[j]>user[j+1]) {
int tmp = user[j];
user[j] = user[j+1];
user[j+1] = tmp;
}
}
배열은 참조형
안에 값이 어떻든, 변수가 다르면 주소가 다르다
주소가 다르기 때문에 다른 배열
public void test1() {
int[] arr1 = {1, 2, 3, 4, 5};
System.out.println(arr1[2]); // 3
System.out.println(arr1[3]); // 4
// 얕은 복사 (주소 값 복사)
int[] arr2 = arr1;
System.out.println(arr2[4]); // 5
// 같은 주소를 공유한다는 것은 같은 배열
arr1[4] = 100;
System.out.println(arr1[4]); // 100
System.out.println(arr2[4]); // 100
arr2[0] = 10;
System.out.println(arr1[0]); // 10
System.out.println(arr2[0]); // 10
}
- 배열 생성 후 제어문을 통한 직접 복사
- 배열 생성 후 System.arraycopy( )를 통한 복사
- clone( );
int[] arr1 = {1, 2, 3, 4, 5, 6};
// 1-1) 원본배열과 동일한 길이의 배열 생성
int[] arr2 = new int[arr1.length];
// 1-2) for문을 통한 데이터 복사
for(int i=0; i<arr1.length; i++) {
arr2[i] = arr1[i];
}
arr1[2] = 100;
arr2[3] = 200;
for(int i=0; i<arr1.length; i++) {
System.out.print(arr1[i]+" ");
}
System.out.println();
// 1 2 100 4 5 6
for(int i=0; i<arr2.length; i++) {
System.out.print(arr2[i]+" ");
}
System.out.println();
// 1 2 3 200 5 6
배열의 일부 데이터만 복사 가능
// 1) 원본 배열과 길이가 같은 배열 선언
int[] arr3 = new int[arr1.length];
// 2) System.arraycopy(괄호 안에 5개의 값을 설정)
// (원본배열,
// 원본배열에서 복사 시작할 위치,
// 데이터가 복사될 배열,
// 데이터가 복사될 배열 중 데이터가 들어갈 위치,
// 복사할 길이)
System.arraycopy(arr1, 2, arr3, 1, 2);
// "arr1의 2번 인덱스부터 arr3의 1번 인덱스 위치에 2개 복사한다."
for(int i=0; i<arr3.length; i++) {
System.out.print(arr3[i]+" ");
}
System.out.println();
// 0 100 4 0 0 0
int[] arr4 = new int[arr2.length];
System.arraycopy(arr2, 2, arr4, 2, 4);
for(int i=0; i<arr4.length; i++) {
System.out.print(arr4[i]+" ");
}
System.out.println();
// 0 0 3 200 5 6
int[] arr5 = arr1.clone();
배열의 배열
배열로 배열을 관리하는 구조이다
int[][] arr = new int[2][3];
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
int k = 1;
// 후위연산 = 인접연산(대입) 하고 자기 자신을 올린다.
arr[0][0] = k++;
arr[0][1] = k++;
arr[0][2] = k++;
arr[1][0] = k++;
arr[1][1] = k++;
arr[1][2] = k++;
int[][] arr1 = {{1, 2, 3}, {4, 5, 6}};
int[][] arr2 = new int[2][3];
int num = 1;
for(int i=0; i<arr2.length; i++) { // 행의 길이
for(int j=0; j<arr2[i].length; j++) { // 열의 길이
arr[i][j] = num++;
}
}
/*
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
[3[0] [3][1] [3][2] [3][3] [3][4]
[4][0] [4][1] [4][2] [4][3] [4][4]
*/
public void practice1() {
int[][] arr = new int[5][5];
int num = 1;
// 이중포문 활용
for (int i=0; i<arr.length; i++) {
for(int j=0; j<arr[i].length; j++) {
arr[i][j] = (j*5)+num;
} num++;
}
// 출력
for(int i=0; i<arr.length; i++) {
for(int j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
} System.out.println();
}
}