Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

241205 - Java 배열생성과 for-each반복문, 입력버퍼 오류 해결 본문

TIL

241205 - Java 배열생성과 for-each반복문, 입력버퍼 오류 해결

queenriwon3 2024. 12. 5. 18:09

▷ 오늘 하루 계획

 

하루에 하나씩 연습문제를 풀고 싶었는데, 각 장마다 문제수도 다르고 3장부터는 난이도가 다소 있어 시간이 걸렸던 것 같다. 8장까지 하려면 다음주까지는 걸릴 것 같은데 이후 Java 사전교육 퀘스트는 계속 미뤄질 것 같다. 다음주까지 java공부는 끝내고 싶으니 사전 캠프시간 외 따로 시간을 만들어 문제를 풀어야겠다.

 

 

▷ 오늘 배운 것

java의 반복문, 예외처리, 배열에 대해서 배웠다. 배열을 생성하는 방법이 다른 언어에 비해 특이하다. 

int array[] = new int[]; //배열크기를 지정하지 않았을 때

 

배열 선언 부분은 int array[] 부분이고 배열을 만드는 new int[] 부분이다.

간단히 말해서 int array[] 는 '정수자료형의 array이름으로 배열을 만들거다' 라고 선언해주는 것이고, new int[]가 대괄호 안에 있는 값으로 배열 객체를 만든다. array라는 변수는 생성된 배열을 가리킨다. (C언어의 포인트와 비슷한 방법으로 배열을 생성한다고 이해하고 있다.)

 

public class prac3_9 {
    public static void main(String[] args) {
        int num[][] = new int[4][4];

        for(int i=0;i<num.length;i++){
            for(int j=0;j<num[i].length;j++){
                num[i][j]=(int)(Math.random()*10+1);
            }
        }
        for(int i=0;i<num.length;i++){
            for(int j=0;j<num[i].length;j++){
                System.out.print(num[i][j]+" ");
            }
            System.out.println();
        }
    }
}

 

다음코드는 4x4 배열을 랜덤숫자로 구성하여 출력하는 코드이다. 각 배열의 원소에 접근하기 위해서는 2차원일 경우 반복문을 중첩시켜서 접근할 수 있다. 그리고 관련 문제를 풀어보진 않았지만 원소를 순차적으로 접근하는데 유용한 for-each구문도 있다.

 

for (변수 : 배열레퍼런스){
	... 반복 작업문 ...
}

//사용예시
int [] n = {1,2,3,4,5};
int sum = 0;
for (int k : n){
	sum += k;
}
System.out.println("합은 " + sum); //합은 15

 

 

▷ 막혔던 것

import java.util.Scanner;

public class prac3_15 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print("곱하고자 하는 두 수 입력>>");
            try{
                int a = scanner.nextInt();
                int b = scanner.nextInt();
                System.out.println(a+"x"+b+"="+(a*b));
                break;

            } catch(Exception e){
                System.out.println("실수는 입력하면 안됩니다");
                scanner.next();
            }
        }
        scanner.close();
    }
}

예외처리+반복문을 사용하여 실수를 입력받으면 예외처리하게 되는 문제를 풀었다. 다른 기능은 모두 문제가 없었는데, 

다음 처럼 입력값을 잘못 받아들여 출력되는 오류가 계속 발생했다. 코드 상으로는 문제가 없는데도 말이다. 그래서 챗 gpt에 물어봤더니 '입력 버퍼에 남아있는 데이터를 완전히 제거하지 못한 것이 문제입니다. 이는 Scanner가 공백이나 줄바꿈 문자를 제대로 처리하지 못해, 잘못된 값이 a 또는 b로 읽히는 상황을 초래합니다.' 따라서 버퍼를 완전히 제거해주는 코드가 필요하다는 뜻이다. 이를 해결하기 위해서는 scanner.nextLine(); 을 작성하여 버퍼를 제거해줘야 한다고 한다. 

아래는 수정된 코드이며, 잘못 입출력 되는 일 없이 정상작동한다.

import java.util.Scanner;

public class prac3_15 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print("곱하고자 하는 두 수 입력>>");
            try{
                int a = scanner.nextInt();
                int b = scanner.nextInt();
                System.out.println(a+"x"+b+"="+(a*b));
                break;

            } catch(Exception e){
                System.out.println("실수는 입력하면 안됩니다");
                scanner.nextLine();
            }
        }
        scanner.close();
    }
}

 

 

▷ 앞으로

문제를 풀면서 어떠한 예외에도 생각된대로 실행되게 하고 싶다는 생각이 드는 것 같다. 시간이 있으면 문제 하나라도 완벽한 프로그램으로 만들기 위해 여러 기능이 포함된 코드를 작성할 것 같지만 지금은... 캠프 시간 외에도 문제를 풀어야할 정도로 빡빡한 일정이라 어려울 것 같다. 

TIL - 3주차 수요일(2024.12.04)