D+24 - java.2차원배열, 부동소수점법(정수와 실수 사이의 오차), 향상된 for문

Bku·2024년 1월 29일

학원 일기

목록 보기
23/67
post-thumbnail

배열

1차원 배열 정의하는 방법

배열을 정의 하는 방법은 여러가지가 있다.

첫 번째 방법

int[] score = {90, 91, 92, 93, 94, 95, 96, 97, 98, 99};

자료형[] 변수명 = {변수값}을 해주면된다.

두 번째 방법

int[] score2 = new int[3];

        score2[0] = 10;
        score2[1] = 20;
        score2[2] = 30;

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

int[] 배열변수이름 = new int[배열의 크기]; 를 해주면 된다.
int타입의 인스턴스를 만드는 것으로 인스턴스는 힙영역에 저장되기 때문에 인스턴스로 만든 배열도 힙 영역에 저장된다.(함수가 끝나면 사라진다.)

세번째 방법

 int[] score3;
 score3 = new int[]{80, 90, 100};

2차원배열

배열에 배열이 들어가있는 형태

첫번째 방법

int[][] score4 = {{1,2,3}, {11, 12, 13}, {21, 22, 23}};

다음과 같이 나타낼 수 있다.

출력은 어떻게 해야할까? 배열이 두개이므로 for문을 2번 사용해야한다.

        for (int i = 0; i < score4.length; i++) {
            for (int j = 0; j < score4[i].length; j++) {
                System.out.print(score4[i][j] + " ");
            }
            System.out.println();
        }// 별찍기와 같은 원리

이차원 배열을 출력할때는 모든 열과 행을 다 찍어야하기에 score4 [i][j]를 해주어야한다.

별찍기와 같은 원리인 것이다. 행과 열이 있는 2차원 배열이 되는 것이어서 2차원 배열이라고 한다.

두 번째 방법

배열 정의

int[][] score5 = new int[3][3];
        

타입[][] 변수명 = new 타입[바깥 배열 길이][안 배열 길이]이렇게 정의를 해주면 된다. 1차원 배열에서 []만 하나씩 더 추가 된 것이다.

배열에 숫자 넣기

   for (int i = 0; i < score5.length; i++) {
            for (int j = 0; j < score5[i].length; j++) {
                score5[i][j] = 10*i + 1*(j+1);
            }
        }

첫 번째 방법에서는 우리가 직접 손으로 값을 넣어주었지만 이번 방법에서는 그럴 수가 없으니 반복문으로 값을 넣어주어야한다.

출력과 같은 for문을 짜고 "배열[i][j]"에 원하는 값을 식으로 만들어 넣어주면된다.

결과

출력하면 다음과 같은 결과가 나온다.

double과 int사이의 한계

0.1, 0.2, 0.3을 배열에 넣는 문제였다.

 double[] arr = new double[3];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 0.1 * (i+1);
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

배열에 0.1 * (i+1)을 해주고 계속 넣어주었다. 그런데 결과가 좀 이상했다.

0.3뒤에 긴 숫자가 붙었는데 물어보니 현재 코딩은 실수에 숫자를 많이 담기위해 부동소수점법을 이용하는데, 이 때 오차가 발생할 수 있어서 다음과 같은 현상이 일어난다고 한다.

이를 해결하기 위해서는 함수를 사용해서 소수점 절삭을 해야한다.


향상된 for문

 int[] score6 = {90, 91, 92, 93, 94};
        int sum1 = 0;
        

//        for (int i = 0; i < score6.length; i++) {
//            sum1 += score6[i];
//        }
//        double avg1 = (double) sum1/5;
//        System.out.println(avg1);

        for (int i : score6) {
            sum1 += i;
        }
        double avg1 = (double) sum1/5;
        System.out.println(avg1);

배열의 값을 변수에 담고 변수를 자동으로 0부터 길이만큼 증가시킨다. 그래서 원래 실행문에 score6[i]라고 배열의 값을 표현했지만, 여기서는 그냥 변수로 그걸 대신한다.

하지만 이것의 단점은 무조건 처음부터 배열의 끝까지 반복한다는 것이다. 그래서 배열을 출력하는데 사용하는데에만 사용하기 좋은거 같다.

profile
기억보단 기록

0개의 댓글