변수는 저장공간이고, 각 저장방식에 따라서 자료형이 존재했고, 변수 하나에는 정해진 크기 안에서 하나의 값만 저장할 수 있었다.
만약 같은 타입의 저장공간이 10개가 필요하다면?
이를 위해 변수 10개를 선언하면 되겠지만, 사용할 변수가 100개만 넘어가도 하나, 하나 값을 정하고, 반대로 수정하면 100개 중의 하나를 찾아야 한다.
곧 변수가 늘어날수록 코드의 가독성도, 유지 보수성도 떨어진다.
이 때문에 같은 타입의 변수를 여러 개를 묶어서 다른 하나의 변수에 연결해 쓰는 것이 바로 “배열”이다.
추가로 변숫값의 입력도 반복 작업이라 반복문이나 조건문을 통해 이 배열을 관리할 수 있다.
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
앞서 말했듯 ‘같은 타입’의 변수를 여러 번 선언하는 건 손해다. 다루기도 어렵고 그래서 배열을 통해서 ‘인덱스’와 ‘길이’로 데이터를 다룰 수 있다.
배열 안의 데이터들은 저장공간이 연속적으로 배치된다. 곧 순서가 존재한다.
애초에 배열은 포인터(메모리 주소를 저장하는 변수)로 구현이 된다. 따라서 배열을 저장하는 변수 자체는 c에서 말하는 포인터 변수이다.
다만 자바는 사용자가 임의의 주소를 다룰 수 없게 했기 때문에(‘참조 변수’로만 주소를 다룰 수 있음.) 포인터 변수를 사용할 수는 없다.
[]
를 붙인다.// 타입[] 변수명
int[] score;
// 타입 변수명[]
int score[];
int[] score;
score = new int[5]; // 길이가 5인 배열 생성
int[] score = new int[50]; // 길이 : 50, 인덱스 : 0~49
score[48] = 49; // 49번째 요소에 49를 저장한다.
int[] score = new int[10];
// 변수로 값 저장하기
for(int i=0; i<10; i++){
score[i] = i * 2;
}
// score[] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
// 수식으로 값 꺼내오기
System.out.print(“출력 : ”);
for(int i=0; i<5; i++){
System.out.printf(“%d ”, score[i*2]);
}
// 출력 : 0 4 12 16
[]
안에 들어가는게 길이, 곧 '요소의 개수'이다.int[] arr1 = new int[100000]; // 길이가 100000인 배열
int[] arr2 = new int[0]; // 길이가 0인 배열
.length
를 통해 배열의 길이를 쉽게 구할 수 있다.int[] arr1 = new int[5];
int[] arr2 = new int[5];
// arr1
for(int i=0; i<5; i++){ // arr1의 길이가 바뀌면 같이 바뀌어야 한다.
score[i] = i * 2;
}
// arr2
for(int i=0; i<arr2.length; i++){ // arr2의 길이가 바껴도 건들지 않아도 된다.
score[i] = i * 2;
}
.length
를 사용하면 배열의 길이가 변해도, 반복문은 건들지 않는다.int[] score = new int[]{10, 12, 18, 15, 60}; // 길이가 5인 배열
// new int[]는 생략이 가능하다.
int[] score = {10, 12, 18, 15, 60}; // new int[] 생략 가능.
// 생략은 선언과 초기화가 동시에 할 때, 가능하다.
int[] score;
score = new int[]{10, 12, 18, 15, 60};
score = {10, 12, 18, 15, 60}; // 에러, new int[] 생략 불가.
// 메서드의 인자값일 때도 new int[] 생략 불가
int result = add(new int[]{1, 2, 3});
int result = add({1, 2, 3}); // 에러.
{}
안에 아무것도 넣지 않으면 길이가 0인 배열이 된다.int[] score = new int[0];
int[] score = new int[]{};
int[] score = [];
Array.toString(배열명)
메서드를 사용하자. int[] score = {1, 2, 3, 4, 5};
System.out.println(“출력 : ” + Arrays.toString(score));
// 출력 : {1, 2, 3, 4, 5}
char[] cArr = {‘A’, ‘B’, ‘C’};
System.out.println(cArr);
// ABC
System.arraycopy()
사용. 이렇게 두가지 방식이 있다.(1) for 반복문 사용
int[] arr1 = new int[10]; // 기존 배열
int[] arr2 = new int[arr1.length * 2]; // arr1보다 길이가 2배인 배열
// 반복문으로 옮겨담기
for(int j = 0; j<arr1.length; j++){
arr2[j] = arr1[j];
}
// 참조변수의 주소를 옮기기
arr1 = arr2;
(2) System.arraycopy()
int[] arr1 = new int[10]; // 기존 배열
int[] arr2 = new int[arr1.length * 2]; // arr1보다 길이가 2배인 배열
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
/* arr1의 인덱스 0포함 arr1.length개의 데이터를
인덱스 arr2의 인덱스 0부터 복사해서 저장해라.
*/
// score 안의 수는 0~1000사이의 수다.
int[] score = {100, 21, 657, 15, 132, 544, 221, 687, 54};
// 사실 인덱스 0으로 초기화 시키는게 낫다.
int max = -1;
int min = 1001;
for(int i=0; i<score.length; i++){
if(score[i]>max){
max = score[i];
}
if(score[i]<min){
min = score[i];
}
}
System.out.println("최대값 :" + max); // 최대값 : 687
System.out.println("최소값 :" + min); // 최소값 : 15
int[] ball new int[45]; // 1~45를 저장할 배열
// 배열 초기화 1~45
for(int i=0; i < ball.length; i++){
ball[i] = i+1;
}
int temp = 0; // 백업 공간
int j = 0; // 임의 인덱스 값을 저장할 변수
// 섞기
for(int i=0; i < 6; i++) {
j = (int)(Math.random()* 45); // 인덱스는 0~44이다.
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
// 번호 출력
for(int i=0; i < 6; i++){
System.out.print(ball[i] + “ ”);
}
Math.random()
으로 인덱스 값만 뽑아서 교환한 다음 원하는 개수만 뽑아도 섞여있다.int[] numArr = {1, 4, 2, 6, 7, 8, 12, 34};
// 총 반복(회차)
for(int i=0; i<numArr.length-1; i++){
// 요소간 비교
for (int j=0;j<numArr.length-1-i; j++) {
if(numArr[j] > numArr[j+1]) { // 왼쪽의 값이 크면 서로 바꾼다.
int tmp = numArr[j];
numArr[j] = numArr[j+1];
numArr[j+1] = tmp;
}
}
}
○ 요약
new
를 생략할 수 없다.String[] name = new String[3];
name[0] = “kim”;
name[1] = “park”;
name[2] = “Lee”;
String[] name1 = new String[]{“kim”, “park”, “Lee”};
String[] name2 = {“kim”, “park”, “Lee”}
String[] name3 = new String[3];
name3[0] = “kim”;
name3[1] = “park”;
name3[2] = “Lee”;
“”
으로 묶어준다.C:\jdk1.8\work\ch5>java ArrayEx16 abc 123 "Hello world"
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] + "\"");
}
}
/* 출력
매개변수의 개수 : 3
args[0] = "abc"
args[1] "123"
args[2] = "Hello world"
*/
int[][] score; // 타입[][] 변수명
int score[][]; // 타입 변수명[][]
int[] score[]; // 타입[] 변수명[]
int[][] score = new int[4][3] // 4(행-세로) X 3(열-가로) 배열 생성
int[][] score = {
(100, 100, 100},
(20, 20, 20},
(30, 30, 30),
(40, 40, 40),
(50, 50, 50)
};
배열의 배열이기 때문에, score.length == 5
이다. 즉, score은 배열 1개의 주소를 갖고 있다.
그리고 해당 배열의 각 요소는 또 다른 배열의 주소이므로 ‘배열 주소의 배열’이다.
즉, score[?]
자체가 배열 하나의 참조변수라고 이해하는 것이 편하다.
따라서 score[0].length == 3
이 된다.
괄호 외에도 이중 반복문으로 2차원 배열의 초기화가 가능하다.
for(int x=0; x<score.length; x++){
for(int y=0; y<score[i].length; y++){
score[x][y] = 0; // 모든 요소를 0으로 초기화
}
}
for(int[] tmp : score){ // score의 각 요소는 int[]배열을 가리킨다.
for(int i: tmp){ // tmp의 각 요소는 int이다.
System.out.println(i);
}
}
int[][] arr = new int[5][]; // 두 번째 차원의 길이는 지정하지 않았다.
// arr의 요소마다 길이가 다른 배열을 생성해서 연결해준다.
arr[0] = new int[4];
arr[1] = new int[1];
arr[2] = new int[3];
arr[3] = new int[2];
arr[4] = new int[3];
{}
을 이용해서 생성과 함께 할 수 있다.int[][] score = {
{100, 100, 100, 100},
{20, 20, 20},
{40, 40},
{50, 50, 50}
};
○ 요약
new
의 생략도 마찬가지이다.도움이 되셨다면 '좋아요' 부탁드립니다 :)