20일차
명령문을 어떻게 배우는지 배웟다 명령문들 실행흐름 바꾸는 법들
파트2는 자바의 값들이 어떻게 저장되는지 등등
참조타입이 중요하고 앞으로 작성하고 사용할 것이다.
이걸알아야 다음 내용들이 진행된다.
배열부터 해보자. 기본타입 아니면 다 참조타입임 배열로 익히기가 용이하다.

5. 참조타입

5.1 배열

여러값을 가진 자료형(data type)
값의 순서가 있고 0번부터 순서를 매긴다.

5.1.1 배열 -1

public class C01Array {
    public static void main(String[] args) {
        int a; // 기본 타입
        a = 3;

        int[] arr1; // 배열 타입 (각 값(원소, 아이템)의 타입이 int)
        arr1 = new int[3]; // 아이템의 수 정의

        arr1[0] = 3;
        arr1[1] = 5;
        arr1[2] = 10;

        a = arr1[0];
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);

        System.out.println(a);
        System.out.println(arr1[0]);

        arr1[0] = 99;
        System.out.println(a);
        System.out.println(arr1[0]);

        // for와 궁합이 잘 맞는 자료형
        int[] arr2;
        arr2 = new int[4];

        arr2[0] = 99;
        arr2[1] = 100;
        arr2[2] = 200;
        arr2[3] = 1000;

        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
        System.out.println(arr2[3]);

        for (int i = 0; i < 4; i++) {
            System.out.println(arr2[i]);
        }
    }
}

5.1.2 배열 - 2

다른 타입을도 만들 수 있다.

public class C02Array {
    public static void main(String[] args) {
        int[] arr1;
        arr1 = new int[3];

        double[] arr2;
        arr2 = new double[2];

        arr2[0] = 3.14;
        arr2[1] = 99.9;

        char[] arr3;
        arr3 = new char[3];
        arr3[0] = '가';
        arr3[1] = 'a';
        arr3[2] = '나';

        int[] arr4 = new int[5];
        arr4[0] = 100;
        arr4[1] = 200;
        arr4[4] = 300;

        //참조타입의 배열도 가능
        String[] arr5 = new String[2];
        arr5[0] = "hello";
        arr5[1] = "java";

        //배열을 원소로 갖는 배열
        int[][] arr6 = new int[3][4];
    }
}

int배열을 만들때 기본이 0이다. 누가 정했느냐? 자바만든사람이 정햇다.
책 172페이지
기본타입 배열 기본 0
boolean은 false
그외 참조타입은 null이 기본값이다.

5.1.3 배열-3

배열을 만들때 바로 초기값을 넣을 수있다.

public class C03Array {
    public static void main(String[] args) {
        // 배열을 만들고 값 할당
        int[] arr1 = new int[3];
        arr1[0] = 9;
        arr1[1] = 7;
        arr1[2] = 5;

        // 배열만들때 초기값 생성
        int[] arr2 = new int[] { 99, 77, 55 };

        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);

        int[] arr3;
        arr3 = new int[] { 10, 20, 30, 40 };
        for (int i = 0; i < 4; i++) {
            System.out.println(arr3[i]);
        }
    }
}

5.1.4 배열 -4

타입선언시 초기값 할당할때 new 타입명 생략가능하다.

int[] arr5 = { 3, 4, 5 };

int[] arr6;
// arr6 = {3,4,5}; 문법오류
arr6 = new int[] { 3, 4, 5 };

처음 초기값 할당할때만 가능하다.!!

5.1.5 배열 -5

배열의 길이를 알 수 있다.
arr1.length 배열의 길이를 알 수있는 필드, property를 사용해서 알 수 있다.

public class C06Array {
    public static void main(String[] args) {
        // 배열의 길이
        int[] arr1 = { 3, 4, 5 };

        int len = arr1.length; //배열의 길이를 알 수있는 필드, property 

        for (int i = 0; i < len; i++) {
            System.out.println(arr1[i]);
        }

        System.out.println();

        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
}

5.1.6 배열 - 6

배열을 복사할때 새 배열을 얻고 싶다면 어떻게 해야할까?

public class C07Array {
    public static void main(String[] args) {
        int[] arr1 = {5,6,7};
        int[] arr2;
        arr2 = arr1;

        System.out.println(arr1[0]); //5
        System.out.println(arr2[0]); //5

        arr1[0] = 50;

        System.out.println(arr1[0]); //50
        System.out.println(arr2[0]); //50
    }
}

위 처럼하면 같은 번지의 배열을 arr1과 arr2이 같이 차지하고 있다.
그래서 arr1[0] = 50;을 하면 arr2[0]의 값도 변하는게 당연하다.

자바에서는 인덱스를 넘어서면 오류가 생긴다.

int[] arr1 = { 3, 4, 5 };
//arr1[3] = 9; 실행중오류(runtime exception);

int[] arr2 = {10,20,30};
int[] arr3 = new int[arr2.length];

for (int i = 0; i < arr2.length; i++) {
    arr3[i] = arr2[i];
}

System.out.println(arr2[0]); //10
System.out.println(arr3[0]); //10

arr2[0] = 100;

System.out.println(arr2[0]); //100
System.out.println(arr3[0]); //10

배열을 복사하려면 같은 크기의 '새로운' 배열을 만들어서 값을 하나씩 넣어줘야한다.
이전 예제에서는 참조 값을 복사해와서 첫 배열이 바뀌면 뒤 배열도 바뀌었다.
이번 예제처럼하면 새로운 배열이기때문에 원 배열이 바뀌어도 같이 바뀌지 않는다.

5.1.7 배열 확인문제

배열 자르기
내풀이 다른데서 배운 arraycopy사용했다.

public int[] solution(int[] numbers, int num1, int num2) {
    int[] answer = new int[num2+1];
    //System.arraycopy(원본배열, 원본배열 복사 시작인덱스, 새배열, 새배열 붙여넣기 사직인덱스, 복사 항목 수);
    System.arraycopy(numbers, num1,answer, 0, num2+1 );
    return answer;
}

강사님 풀이

public int[] solution(int[] numbers, int num1, int num2) {
    int len = num2 - num1 + 1;
    int[] answer = new int[len];

    for (int i = num1; i <= num2; i++) {
        answer[i - num1] = numbers[i];
    }
    return answer;
}

5.2 데이터 타입 분류

int a = 3;을하면 메모리(램)에 a라는 박스를 만들고 3을 넣음.

int[] arr = new int[] { 3, 4, 5 };
arr이라는 공간을 만들고 다른 어느 공간에 3, 4, 5를 담는 공간의 주소를 가져옴.
new는 연산자이다. 값들이 저장된 공간의 메모리의 주소를 리턴
값을 저장하는게 아니라 주소를 저장하는 것임.
arr은 9898이라는 주소를 저장 9898이라는 공간에 3,4,5가 들어가있음.

int a = 3;
int b = a;
하면 b에 a의 값을 복사해서 담은거임.
여기서 a의 값이 변경되면?
a=6
a만 6이되는 것임 b에는 영향 미치지 않는다.

int[] arr1 = { 5, 6, 7 };
int[] arr2 = arr1;
일때 arr1 arr2 저장공간은 다르지만 모두 같은 주소를 가지고 있다.

arr1[0] = 99; 하면 가르키고있는 주소의 값이 변경되는 것임. {99, 6, 7}
arr2도 이 주소를 가르키고 있으니 값이 똑같이 바뀐다.

번지에 있는 것을 instance(객체, 개체)라고 한다.

5.2.1 참조 응용

public class C03Reference {
    public static void main(String[] args) {
        int a = 3;

        method1(a);

        System.out.println(a);//3
    }

    public static void method1(int b) {
        System.out.println(b);//3
        b = 30;
        System.out.println(b);//30
    }
}

a와 b는 각자의 값을 가지고 있음. 서로 영향을 주지 않음.

public class C04Reference {
    public static void main(String[] args) {
        int[] arr = new int[] {3,4,5};

        method1(arr);

        System.out.println(arr[0]);//30
    }

    public static void method1(int[] arr2) {
        System.out.println(arr2[0]);//3
        arr2[0] = 30;
        System.out.println(arr2[0]);//30
    }
}    

메소드에서 매개변수로 들어온 arr2 배열 = 매개값으로 준 main의 arr임
메소드 실행후 값이 바뀌면 같은 주소를 참조하고 있기때문에
원래 배열의 값을 뽑으면 바뀐값이 나옴.

5.2.2 참조 응용 -2

public class C06Reference {
    public static void main(String[] args) {
        int[] arr = {2,4,6};

        method1(arr);

        System.out.println(arr[0]); //2
    }

    public static void method1(int[] arr) {
        arr = new int[] {3,5,7};
    }
}

메소드 안에서 arr을 만들엇는데 메소드안에서 arr이라는 이름의 배열을 만들엇을뿐임.
리턴한게 아님 이름이 우연히 같을뿐 값만 복사한 것임.
그래서 메소드 실행 후 하면 2가 나옴

5.6 행렬 Matrix n차원 배열

5.6.1 2차원배열

행렬은 배열을 가지고 있는 배열이다 라고 생각하면된다.
int[][] arr = new int[3][]; 배열의 길이는 배열을 만드듯이 앞에 갯수를 정해준다.
특정인덱스의 값을 얻고자 한다면 [index][index]하면된다.
전체를 탐색을 한다면 이중 for을 사용하면된다.
첫번째 for문은 배열의 길이만큼, 두번째 for문은 안의 배열의 길이만큼 돌게 해준다.

public class C01Matrix {
    public static void main(String[] args) {
        // 2차원 배열(행렬)

        //int[]는 int값을 가지는 배열이다.
        //값으로 int[]배열을 가지는 배열을 만듬
        int[][] arr = new int[3][];

        System.out.println(arr.length);

        // 행3개 열 4개인 행렬
        //배열에 배열을 넣는 것임.
        arr[0] = new int[] { 1, 3, 5, 7 };
        arr[1] = new int[] { 2, 4, 8, 10 };
        arr[2] = new int[] { 9, 10, 11, 12 };

        System.out.println(arr[0][0]); //1
        System.out.println(arr[1][1]); //4

        System.out.println("---------------");

        System.out.println("전체탐색 for");
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }
    }
}

5.6.2 행렬 Matrix n차원 배열 -2

열의 길이도 정해보자.

public class C02Matrix {
    public static void main(String[] args) {
        // 2차원 배열(행렬) 열의 길이도 정하기
        int[][] mat = new int[3][4];

        System.out.println(mat.length); //3

        System.out.println(mat[0].length);//4
        System.out.println(mat[1].length);//4
        System.out.println(mat[2].length);//4

        System.out.println("전체탐색");
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[i].length; j++) {
                System.out.println(mat[i][j]);
            }
        }

        //각원소에 값 할당
        mat[0][0] = 3;
        mat[0][1] = 5;
        //....
        mat[1][2] = 10;

        System.out.println("다시전체탐색");
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[i].length; j++) {
                System.out.println(mat[i][j]);
            }
        }
    }
}

5.6.3 행렬 Matrix n차원 배열 -3

행렬을 초기화하면서 값을 넣어보자.
1차원 배열에 넣듯이 넣으면 된다.
배열의 배열이기때문에 각 안에 원소들인 배열의 길이가 같지 않아도 된다.

public class C03Matrix {
    public static void main(String[] args) {
        int[] arr1 = new int[] {2,3,4,5};

        int[][] mat1 = new int[][] {
            new int[] {3,4,5,7},
            new int[] {10,11,12,13},
            new int[] {9,8,7,6}
        };
    }
}

1차원 배열 배울때 new를 생략했듯이 생략가능하다.
int[] arr2 = { 2, 3, 4, 5 };

int[][] mat2 = {
        { 3, 4, 5, 7 },
        { 10, 11, 12, 13 },
        { 9, 8, 7, 6 }
};

int[][] mat3 = {
        { 1, 2, 3, 4 },
        { 10, 11},
        { 99, 100, 101}
};

5.6.4 확인문제 8번

public class ex8 {
    public static void main(String[] args) {
        int[][] array = {
                { 95, 86 },
                { 83, 92, 96 },
                { 78, 83, 93, 87, 88 }
        };

        int totalNum = 0;
        int totalSum = 0;
        double avg = 0;

        //전체합과 평균
        for (int i = 0; i < array.length; i++) {
            //totalNum += array[i].length;
            for (int j = 0; j < array[i].length; j++) {
                totalSum += array[i][j];
                totalNum++;
            }
        }

        avg = (double) totalSum / totalNum;

        System.out.println("전체 합: " + totalSum);
        System.out.println("평균: " + avg);
    }
}

2023.02.22 후기

오늘의 독학은 문제풀이 위주로 진행했다.
작심삼일의 날이다.

방향이 잡힐줄 알았지만 더 혼란스럽다. 앞으로 어떻게 할지 진득하게 고민할 시간이 있어야 하는데 독학때와는 다르게 매일매일 뭔가 하니 더 어려운 것 같다.
중요한 것은 꺾이지 않는 마음.

'국비 > Java' 카테고리의 다른 글

2023.02.24 22일차 Java  (0) 2023.02.24
2023.02.23 21일차 Java  (0) 2023.02.23
2023.02.21 19일차 Java  (0) 2023.02.21
2023.02.20 18일차 Java  (0) 2023.02.20
2023.02.17 17일차 Java  (0) 2023.02.17

+ Recent posts