코드 그라데이션
배열 본문
배열
: 유사한 데이터를 저장하는 관련 변수의 집합은 한꺼번에 선언하는데, 이럴 때 사용하는 것이 배열이다.
배열은 같은 타입의 변수를 모아놓은 변수의 집합
--- 대량의 정보를 저장할 때 사용하며 반복적인 처리가 가능하다.
타입[] 배열명;
타입 배열명[];
배열 요소의 타입과 배열의 이름으로 선언하되 일반 변수와 달리 []괄호로 배열임을 명시한다.
[]는 배열임을 표시하는 기호일 뿐이며 선언할 때 괄호만 적고 크기는 할당할 때 밝힌다.
[] 괄호는 타입 뒤에 붙일 수도 있고, 배열명 뒤에 붙일 수도 있다.
배열 변수는 배열 요소의 시작 위치를 가리키는 참조형 변수이며, 그 자체는 대량의 데이터를 저장할 수 없다.
배열을 선언한 후 new 연산자로 정보를 저장할 공간을 할당하여 배열을 생성해야 한다.
배열 = new 타입[크기];
배열의 초기화
- 일반 변수와 마찬가지로 배열 요소도 사용하기 전에 원하는 값으로 초기화 해야 한다.
- 별도의 지정이 없으면 모든 배열 요소를 기본값(0, false, null)으로 초기화한다.
- 배열을 선언하면서 동시에 요소를 일괄 초기화하기도 한다.
class JavaTest {
public static void main(String[] args) {
int[] score = new int[] { 88, 99, 70, 55, 100 };
for (int i = 0; i < score.length; i++) {
System.out.println((i + 1) + "번 학생의 성적 : " + score[i]);
}
}
}
- 배열의 초깃값은 할당문 뛰쪽에 {}와 함께 나열한다.
- 크기값과 초깃값의 개수를 세어 보면 배열의 크기를 알 수 있어 할당문에는 크기를 밝히지 않는다.
-크기를 생략해 두고 배열을 늘리고 싶을 때 초깃값을 더 적으면 된다.
- 크깃값뿐만 아니라 할당문인 new int[] 구문도 꼭 필요치 않아 생략 가능하다.
int[] score = new int[] {88, 99, 70, 55, 100}
이것에 대한 설명) score 변수의 선언문에 정수형 배열임을 명시했으므로 할당문에 타입을 다시 밝힐 필요는 없다.
정수형 배열의 초기값은 당연히 정수형이다. 따라서 할당문의 int[] 구문은 필요치 않다.
new 연산자는 배열을 할당하라는 뜻인데 뒤쪽에 초깃값이 있어 할당문임을 알 수 있다.
메모리를 초기화하지 않고 초깃값을 저장할 수는 없다.
그래서 new 연산자도 생략 가능하다.
배열을 선언과 동시에 초기화할 때는 new 연산자, 타입, 크기 등을 모두 생략하고 간략하게 쓴다.
int[] score = {88, 99, 70, 55, 100};
간편한 초기화는 선언과 동시에 초기화할 때만 사용할 수 있으며, 선언과 최기화를 분리할 때는 초기식의
new int[]를 반드시 써야 한다.
int[] score;
score = new int[] {88,99,70,55,100};
score 배열을 선언해 놓고 새로운 배열을 할당 및 초기화하여 대입했다. 여기서 new int[] {} 구문은 새로운
배열을 정의하는 배열 리터럴이다. 초기식 아닌 곳에서 배열을 생성할 때는 반드시 new 연산자로 할당해야
하며 {초기식} 만으로는 메모리가 할당되지 않는다.
int[] score;
score = {88,99,70,55,100}; //에러
대개의 경우 선언과 초기화를 한꺼번에 하는 것이 편리하지만, 선언 후 초기화할 때는 new 연산자를 쓴다.
또 배열을 재초기화할 때도 선언과 할당이 분리되므로 new 연산자가 필요하다.
class JavaTest {
public static void main(String[] args) {
// 간편한 초기화
int[] score = { 88, 99, 70, 55, 100 };
for (int i = 0; i < score.length; i++) {
System.out.print(score[i] + ", ");
}
System.out.println();
// 재초기화
score = new int[] {1, 2, 3, 4, 5, 6, 7, 8 };
for (int i = 0; i < score.length; i++) {
System.out.print(score[i] + ", ");
}
}
}
최초 배열을 생성할 때는 선언과 동시에 초기화하므로, 간편한 초기화 방식을 사용했다. 이 상태에서 배열을 통째로 교체할 때는 new int [] { } 구문으로 할당 및 초기화하여 대입한다. score을 새 배열로 교체한다.
완전히 새로운 배열을 만드는 것이므로, 모든 요소의 값을 바꿀 수 있을 뿐만 아니라 배열의 크기도 바꿀 수 있다.
그러나 배열 요소의 타입을 바꾸거나 차원을 변경할 수는 없다. score은 정수형 1차 배열로 선언되어 실수형 배열이나 정수형 2차 배열을 가리킬 수는 없다.
메서드 내에서 배열을 재초기화하는 경우는 드물다. 그러나 메서드 간에 배열을 전달할 때는 기존 배열을 넘기거나 인수열에서 새로운 배열을 만든다.
=> 이때는 완전한 형식으로 배열 리터럴을 할당 및 초기화해야 한다.
2차원 배열
- 사실 배열 요소의 타입에는 제한이 없어서 실수나 문자열은 물론이고 객체의 배열도 가능하다.
배열명 = new 타입[행크기][열크기]
// 배열의 총 크기는 행크기*열크기
// 2차원 배열을 초기화할 때는 전체를 { } 괄호로 감싸고,
// 각 행별로 { } 괄호 안에 초깃값을 나열한다.
심지어 배열도 하나의 타입이어서 배열의 요소가 될 수 있다.
ex) 각 학생의 총점과 평균을 구해 출력하고 학습 전체의 평균 계산하기
class JavaTest {
public static void main(String[] args) {
int[][] score = {
{ 77, 56, 70, 82},
{ 99, 96, 89, 88},
{ 81, 69, 62, 80}
};
int classsum = 0;
for (int student = 0;student < score.length; student++) {
int sum = 0;
for (int subject = 0;subject < score[0].length;subject++) {
sum += score[student][subject];
}
System.out.println((student + 1) + "번 => 총점 : " +
sum + ", " + "평균 : " + (float)sum/score[0].length);
classsum += sum;
}
System.out.print("학급 전체 평균 : " +
(float)classsum/(score.length * score[0].length));
}
}
for each문 <= 향상된 for문
제어 변수 i는 score 배열의 선두부터 크깃값 직전까지 순회하며 루프에서 score[i] 표현식으로 배열의 각 요소를 액세스한다. 배열 전체를 순회할 일이 빈번하기 때문에 향상된 for문이라고 하늗데, 배열 요소를 하나씩 읽는다고 해서 for each 문이라고 한다.
for (타입 변수 : 배열) {
명령
}
- 괄호 안에 제어 변수를 선언하고 : 다음에 대상 배열을 명시한다. 제어 변수의 이름은 마음대로 붙일 수 있지만,
타입은 배열 요소와 일치해야 한다.
- 배열의 첫 요소부터 순서대로 제어 변수에 대입되며 마지막 요소까지 루프를 반복한다.
ex) 배열의 성적 총점 구해보기
class JavaTest {
public static void main(String[] args) {
int[] score = { 88, 94, 72, 75, 23 };
int sum = 0;
for (int s : score) {
sum += s;
}
System.out.println("총점 : " + sum);
System.out.println("평균 : " + (float)sum/score.length);
}
}
By. 자바 정복