✔ 배열 사용 전 (배열을 모를 때)
프로그램에서 처리하는 값들이 많아질수록, 선언해야 하는 변수의 수가 증가하게 되어 프로그램의 소스가 더 난해해진다.
int dooly_kor = 75;
int dooly_eng = 82;
int dooly_math = 91;
System.out.println(
(dooly_kor+dooly_eng+dooly_math)/3
);
int donner_kor = 88;
int donner_eng = 64;
int donner_math = 50;
System.out.println(
(donner_kor+donner_eng+donner_math)/3
);
int ddochi_kor = 100;
int ddochi_eng = 100;
int ddochi_math = 90;
System.out.println(
(ddochi_kor+ddochi_eng+ddochi_math)/3
);
▶ 이러한 데이터들을 효율적으로 관리하기 위해 배열을 배우고 사용한다.
배열의 선언
데이터형[] 배열이름;
배열의 생성 : 변수를 저장할 수 있는 사물함 생성
배열이름 = new 데이터형[크기]
배열 생성의 예 : 3개의 int형 변수를 저장할 수 있는 배열 생성
int[] grade; // 여러개의 int형 변수를 저장할 수 있는 배열의 선언
grade = new int[3]; // 배열의 칸을 3칸으로 할당
=> 0, 1, 2 ... : '인덱스'라고 한다. (배열은 0부터 시작한다.)
배열의 모양
→ 생성된 배열은 사물함과 같이 각각의 칸에 값들이 저장되고, 각각의 칸은 0부터 일련번호가 지정된다. (일련번호 = 배열의 인덱스)
배열의 선언과 크기 지정에 대한 일괄처리
데이터형[] 배열이름 = new 데이터형[크기];
int[] grade = new int[3];
배열은 값을 저장할 수 있는 공간일 뿐, 그 자체가 값은 아니다.
값이 대입되지 않은 경우, 숫자형은 0, boolean형은 false가 자동으로 대입된다.
배열 안에 값을 저장하기 위해서는 인덱스 번호를 사용하여 각각의 칸에 직접 값을 대입해야한다.
배열이름[인덱스] = 값;
둘리의 점수를 배열로 표현한 예
int[] grade = new int[3];
grade[0] = 75;
grade[1] = 82;
grade[2] = 91;
배열의 크기를 지정하면서 괄호 "{...}"안에 배열에 포함될 각 항목들을 콤마(,)로 나열하면, 배열의 생성과 값의 할당을 일괄처리할 수 있다. 이 때는 배열의 크기를 별도로 지정하지 않으며, "new 데이터형[ ]" 부분은 생략 가능하다.
데이터형[] 배열이름 = new 데이터형[]{값1, 값2, 값3, ..., 값n}
또는
데이터형[] 배열이름 = {값1, 값2, 값3, ..., 값n}
배열 안에 저장되어 있는 값들을 사용하여 연산이나 출력 등의 처리를 위해서는 배열에 부여된 인덱스 값을 통해서 데이터에 접근해야 한다.
grade[0];
System.out.println(grade[0]); // 75
System.out.println(grade[2]); // 91
System.out.println(grade[3]); // Err
배열의 특성
→ 0 ~ (배열의 크기 - 1) 만큼의 인덱스 값을 순차적으로 갖는다.
특성을 활용한 배열 데이터의 처리
→ 일정 범위를 갖고 순차적으로 증가하는 인덱스 값의 특성을 활용하는 반복문 안에서 배열의 값을 할당하거나, 할당된 값을 읽어들이는 처리가 가능하다.
// 배열의 인덱스는 0부터 전체 길이 3보다 작은 2까지이다.
int[] grade = new int[]{100, 100, 90};
for(int i=0; i<3; i++){
// i번째 배열 값에 대한 출력 처리
System.out.println(grade[i]);
}
배열의 길이를 얻기 위해서는 "배열이름.length" 형식으로 접근한다.
grade라는 배열을 생성한 경우 배열의 길이는
int size = grade.length;
배열의 길이 값은 주로 반복문의 조건식에서 반복의 범위를 지정하기 위하여 사용된다.
int[] grade = new int[]{100, 100, 90};
for(int i = 0; i < grade.length; i++){
// i번째 배열값에 대한 출력 처리
System.out.println(grade[i]);
}
1차 배열
→ 앞에서 살펴본 배열처럼 한 줄만 존재하는 사물함 같이 구성된 배열
→ 행에 대한 개념이 없고, 열에 대한 개념만 존재하기 때문에 "배열이름.length"는 몇 칸인지를 알아보는 기능이 된다.
2차 배열
→ 1차 배열의 각 칸에 새로운 배열을 넣는 형태
→ 1차 배열의 각 칸은 "행"이 되고, 각각의 칸에 추가된 개별적인 배열이 "열"의 개념이 되어 "행렬"을 구성하세 된다.
데이터 타입의 이름 뒤에 대괄호 "[ ]"를 행과 열에 대하여 각각 지정한다. (선언)
데이터형[][] 배열이름;
2차원 배열의 크기 할당
→ 행과 열에 대한 크기를 명시한다.
배열이름 = new 데이터형[행][열];
→ 2차원 배열의 선언과 할당의 일괄처리
데이터형[][] 배열이름 = new 데이터형[행][열];
2차원 배열의 선언, 크기 할당, 값의 대입에 대한 일괄처리
→ 2차원 배열의 경우 블록 괄호 "{}"를 2중으로 겹쳐서 2차원 배열을 표현한다.
→ 행과 열의 구분에는 콤마(,)가 사용된다.
→ 컴파일러가 블록괄호 "{}"의 요소를 파악하면 행, 열의 크기가 산출될 수 있으므로 배열의 크기 설정을 위한 [ ][ ]에는 배열의 크기를 명시하지 않는다.
데이터형[][] 배열이름 = new 데이터형[][]{
{0행0열의 값, 0행1열의 값, ... ,0행n열의 값},
{1행0열의 값, 1행1열의 값, ... ,1행n열의 값},
...
{n행0열의 값, n행1열의 값, ... ,n행n열의 값}
};
행, 열에 대한 인덱스를 통하여 값을 대입한다.
배열이름[행][열] = 값;
int[][] grade = new int[3][3];
grade[0][0] = 75;
grade[0][1] = 82;
grade[0][2] = 91;
...
일괄 지정하는 경우
int[][] grade = new int[][]{
{75, 82, 91},
{88, 64, 50},
{100, 100, 90}
};
2차원 배열의 길이는 행에 대한 측면과 열에 대한 측면을 나누어서 생각해야한다.
행의 길이
→ 1차 배열의 길이는 2차 배열에서는 행의 크기로 조회가 된다.
int rows = grade.length;
열의 길이
→ 열의 길이는 각 행에 대하여 개별적으로 조회해야 한다.
int cols = grade[행].length;