이것이 자바다 ch05 참조타입 (5.6~) ...ing

dev·2022년 10월 12일
1

이것이 자바다

목록 보기
2/7

5.6 배열(Array) 타입

변수는 하나의 값만 저장할수 있으므로 저장해야할 값의 수가 많아지면 그만큼 많은 변수가 필요해진다. 필요한 모든 값에 대한 변수를 만드는것은 비효율적임

배열
배열은 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해놓은 자료구조이다.
많은 양의 값을 다루는 효율적인 방법

  • 같은 타입의 값만 관리한다.
  • 배열은 생성과 동시에 길이가 결정되므로, 한번 결정된 길이를 늘리거나 줄일수 없다.

배열 변수 선언

배열을 사용하려면 배열변수를 선언해야한다.
배열변수 선언은 두가지 방법이 있다.
타입[] 변수; <- 관례적으로 주로 사용한다.
타입 변수[];

//타입별로 배열 선언하는 방법

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 타입[길이];
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
    }
}

5.7 다차원 배열

다차원 배열
배열 항목 안에 또 다른 배열이 대입된것
생각보다 잘 안쓴다. 길이 조절이 안되기때문에 다차원배열보다는 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 프로그래밍의 기본서 - 신용권, 임경균 저

profile
hello world!

0개의 댓글