변수는 하나의 값만 저장할수 있으므로 저장해야할 값의 수가 많아지면 그만큼 많은 변수가 필요해진다. 필요한 모든 값에 대한 변수를 만드는것은 비효율적임
배열
배열은 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해놓은 자료구조이다.
많은 양의 값을 다루는 효율적인 방법
- 같은 타입의 값만 관리한다.
- 배열은 생성과 동시에 길이가 결정되므로, 한번 결정된 길이를 늘리거나 줄일수 없다.
배열을 사용하려면 배열변수를 선언해야한다.
배열변수 선언은 두가지 방법이 있다.
타입[] 변수;
<- 관례적으로 주로 사용한다.
타입 변수[];
//타입별로 배열 선언하는 방법
int[] intArr;
double[] doubleArr;
String[] strArr;
int intArr[];
double doubleArr[];
String strArr[];
배열 변수는 참조변수이다.
배열도 객체이므로 힙 영역에 생성되고, 배열변수는 힙 영역의 배열 주소를 저장한다. 참조할 배열이 없다면 배열변수도 null로 초기화 가능
배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있다.
타입[] 변수 = {값0, 값1, 값2, 값3, ...};
{중괄호}는 나열된 값들을 항목으로 가지는 배열을 힙에 생성하고, 번지를 리턴한다.
배열변수는 리턴된 번지를 저장하여 참조한다.
String[] season = {"spring", "summer", "fall", "winter"};
season[1] = "여름";
package ch05.sec6;
public class ArrayCreateByValueListExample1 {
public static void main(String[] args) {
//배열 변수 선언과 배열 생성
String[] season = {"spring", "summer", "fall", "winter"};
//배열 항목 값 읽기
System.out.println("season[0] : " + season[0]);
System.out.println("season[1] : " + season[1]);
System.out.println("season[2] : " + season[2]);
System.out.println("season[3] : " + season[3]);
//인덱스 1번 항목 값 변경
season[1] = "여름";
System.out.println("변경된 season[1] : " + season[1]);
System.out.println();
//배열 변수 선언과 배열 생성
int[] scores = {83, 90, 87};
//총합과 평균 구하기
int sum = 0;
for(int i=0; i<3; i++) {
sum += scores[i];
}
System.out.println("총합: " + sum);
double avg = (double) sum/3;
System.out.println("평균: " + avg);
// season[0] : spring
// season[1] : summer
// season[2] : fall
// season[3] : winter
// 변경된 season[1] : 여름
//
// 총합: 260
// 평균: 86.66666666666667
}
}
값목록을 배열변수 대입시 주의사항
배열변수를 먼저 선언한 다음엔 { } 중괄호로 감싼 값 목록으로 초기화 할수 없음타입[] 변수; 변수 = { 값0, 값1, 값2, 값3, ...}; //컴파일 에러 변수 = new 타입[] { 값0, 값1, 값2, 값3, ...};
배열 변수 선언 시점과 값목록 대입시점이 다르면
new 타입[]
로 값목록 을 대입할 수 있다.
메소드의 매개변수가 배열타입인 경우도 마찬가지이다.
//메소드 선언
public static void printItem(int[] scores) {}
//wrong
printItem( {83, 90, 87} );
//올바른 메소드 호출
printItem( new int[] {83, 90, 87} );
package ch05.sec6;
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
//배열 변수 선언
int[] scores;
//배열 변수에 배열을 대입
scores = new int[] {83, 90, 87};
//배열 항목의 총합을 구하고 출력
int sum1 = 0;
for(int i=0; i<3; i++) {
sum1 += scores[i];
}
System.out.println("총합: " + sum1);
//배열을 매개값으로 주고, printItem() 메소드 호출
printItem( new int[] {83, 90, 87} );
}
//printItem() 메소드 선언
public static void printItem(int[] scores) {
//매개변수가 참조하는 배열의 항목을 출력
for(int i=0; i<3; i++) {
System.out.println("score[" + i + "]: " + scores[i] );
}
}
// 총합: 260
// score[0]: 83
// score[1]: 90
// score[2]: 87
}
향후 값들을 저장할 목적으로 배열을 미리 생성할수있다.
new 연산자를 이용하고, 배열이 저장할수 있는 항목수(길이)를 정해주면 된다.
타입[] 변수 = new 타입[길이];
new연산자는 해당 길이의 배열을 생성하고 배열의 주소
를 리턴.
리턴된 주소를 배열변수에 대입할수있다.
이미 배열 변수가 선언된 후에도 대입가능
타입[] 변수 = null;
변수 = new 타입[길이];
//길이 5인 int[] 생성하고 배열 주소를 intArr 변수에 대입
int intArr = new int[5];
new연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화된다.
정수배열은 0, 실수배열은 0.0, 논리배열은 false, 참조배열은 null로 초기화
int[] scores = new int[30];
라고 했다면
30개의 배열항목에 모두 0이 들어가게된다.
String[] names = new String[30];
라고 했다면 30개의 배열항목에 모두 null이 들어간다.
package ch05.sec6;
public class ArrayCreateByNewExample {
public static void main(String[] args) {
//배열 변수 선언과 생성
int[] arr1 = new int[3];
//배열항목의 초기값 출력
for(int i=0; i<3; i++) {
System.out.print("arr1[" + i+ "]: " + arr1[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
//배열항목의 변경된 값 출력
for(int i=0; i<3; i++) {
System.out.print("arr1[" + i+ "]: " + arr1[i] + ", ");
}
System.out.println("\n--------------------------------------------");
//배열 변수 선언과 생성
double[] arr2 = new double[3];
//배열항목의 초기값 출력
for(int i=0; i<3; i++) {
System.out.print("arr2[" + i+ "]: " + arr2[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
//배열항목의 변경된 값 출력
for(int i=0; i<3; i++) {
System.out.print("arr2[" + i+ "]: " + arr2[i] + ", ");
}
System.out.println("\n--------------------------------------------");
//배열 변수 선언과 생성
String[] arr3 = new String[3];
//배열항목의 초기값 출력
for(int i=0; i<3; i++) {
System.out.print("arr3[" + i+ "]: " + arr3[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
//배열항목의 변경된 값 출력
for(int i=0; i<3; i++) {
System.out.print("arr3[" + i+ "]: " + arr3[i] + ", ");
}
System.out.println("\n--------------------------------------------");
// arr1[0]: 0, arr1[1]: 0, arr1[2]: 0,
// arr1[0]: 10, arr1[1]: 20, arr1[2]: 30,
// --------------------------------------------
// arr2[0]: 0.0, arr2[1]: 0.0, arr2[2]: 0.0,
// arr2[0]: 0.1, arr2[1]: 0.2, arr2[2]: 0.3,
// --------------------------------------------
// arr3[0]: null, arr3[1]: null, arr3[2]: null,
// arr3[0]: 1월, arr3[1]: 2월, arr3[2]: 3월,
// --------------------------------------------
}
}
배열 길이
배열에 저장할 수 있는 항목 수
읽기만 가능, length를 변경할 수는 없음
배열변수.length
package ch05.sec6;
public class ArrayLengthExample {
public static void main(String[] args) {
// 배열변수 선언과 대입
int[] scores = {84, 90, 96};
// 배열 항목 총합 구하기
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합: " + sum); //총합: 270
// 배열 항목의 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("평균: " + avg); //평균: 90.0
}
}
다차원 배열
배열 항목 안에 또 다른 배열이 대입된것
생각보다 잘 안쓴다. 길이 조절이 안되기때문에 다차원배열보다는 arrayList를 사용한다. arrayList는 알아서 길이를 조절해주기때문에 좋다.
다차원 배열에 접근하는 법
변수[1차원인덱스][2차원인덱스]...[N차원인덱스]
변수[0][1][1]
값목록으로 다차원 배열 생성할때는 배열변서 선언시 타입 뒤에 대괄호를 차원의 수만큼 붙이고, 값목록도 차원 수 만큼 중괄호를 중첩시킨다.
타입[][] 변수 = {
{값1, 값2,...}, //1차원 배열의 0 인덱스
{값1, 값2,...}, //1차원 배열의 1 인덱스
...
}
enum은 자바의 정석이나 다른 책 참조해서 보기
이것이 자바다는 설명이 빈약함
MONDAY는 객체이다.
파라미터 있으면 생성자도 만들어주고 해야한다.
어노테이션, 제너릭 이해 잘 해야한다.
5장 키포인트: JVM, call by value, call by reference 세가지
모르겠던 거 줄쳐두거나 하고 노션이나 개인노트에 적어두기
출처: 이것이 자바다 (개정판) : JAVA 프로그래밍의 기본서 - 신용권, 임경균 저