Post

TIL-Java 문법 종합반 1주차 과제 고찰

TIL-Java 문법 종합반 1주차 과제 고찰

2024-04-22

오늘의 학습 🌠


1

과제에 대해서

  • Java 문법 종합반 1주차 과제를 보면 고찰한 부분입니다.
  • 입력값
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해 주세요. (ex. 3.5)
    • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
  • 출력값
    • 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
    • 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해 줍니다. (ex. 3)
    • 바로 뒤에 정수 별점을 5점 만점 퍼센트로 표현했을 때 값을 실수로 출력해 줍니다. (ex. 60.0%)
    • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력해 줍니다. </aside>
  • 입력 예시

    백종원 돼지고기 김치찌개 만들기 4.5 돼지고기는 핏물을 빼주세요. 잘익은 김치 한포기를 꺼내서 잘라주세요. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요. 다진마늘 한스푼, 설탕 한스푼 넣어주세요. 종이컵으로 물 8컵 부어서 센불에 끓여주세요. 핏물 뺀 돼지고기를 넣어주세요. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요. 중불로 줄여서 오래 끓여주세요~!! 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^

  • 출력 예시

    [ 백종원 돼지고기 김치찌개 만들기 ] 별점 : 4 (80.0%)

    1. 돼지고기는 핏물을 빼주세요.
    2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
    3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
    4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
    5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
    6. 핏물 뺀 돼지고기를 넣어주세요.
    7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
    8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
    9. 중불로 줄여서 오래 끓여주세요~!!
    10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^

해당 문제를 배운 내용으로 풀면

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
32
33
34
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //Scanner 선언
        String input = sc.nextLine(); //사용자로부터 한 줄의 문자열을 입력 받음
        double doubleNum = Double.parseDouble(sc.nextLine()); //사용자로부터 입력받은 문자열을 double형으로 변환하여 저장
        int intNum = (int) doubleNum; //double형을 int형으로 형변환
        double score = (double)intNum / 5 *100; //백분율 구하기
        String input1 = sc.nextLine(); //사용자로부터 입력 받음
        String input2 = sc.nextLine();
        String input3 = sc.nextLine();
        String input4 = sc.nextLine();
        String input5 = sc.nextLine();
        String input6 = sc.nextLine();
        String input7 = sc.nextLine();
        String input8 = sc.nextLine();
        String input9 = sc.nextLine();
        String input10 = sc.nextLine();

        System.out.println("[ "+input+" ]"); //결과
        System.out.println("별점 : "+intNum+" ("+score+"%)");
        System.out.println("1. "+input1);
        System.out.println("2. "+input2);
        System.out.println("3. "+input3);
        System.out.println("4. "+input4);
        System.out.println("5. "+input5);
        System.out.println("6. "+input6);
        System.out.println("7. "+input7);
        System.out.println("8. "+input8);
        System.out.println("9. "+input9);
        System.out.println("10. "+input10);
    }
}
  • 다음과 같이 길게 나오게 됩니다.

  • 해당 문제를 배열로 사용해서 코드 길이를 줄이고자 하였습니다.

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
import java.util.Scanner; //Scanner 클래스 호출

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //Scanner 객체 생성
        //사용자로부터 제목을 입력받음
        String title = sc.nextLine(); //string 형 입력 및 리턴(개행을 기준으로 한 줄을 읽음)
        //사용자로부터 평점을 입력받음
        double score = sc.nextDouble();
        //평점을 정수로 변환
        int intScore = (int) score; //double형을 int형으로 변환하여 저장
        double percentage = (double)intScore / 5 * 100; //백분율 계산
        String[] arr = new String[10]; //크기가 10인 배열 생성
        for(int i=0;i<10;i++) //10번 반복
        {
            arr[i] = sc.nextLine(); //사용자로부터 10개 입력 받음
        }
        System.out.println("[ "+title+" ]"); //제목 출력
        System.out.println("별점 : "+intScore+" ("+percentage+"%)"); //평점과 백분율 출력
        for(int i=0;i<10;i++) //10번 반복
        {
            System.out.println((i+1)+". "+arr[i]); //결과 출력
        }
    }
}

  • 하지만 다음 코드를 실행하면 1

다음과 같은 결과가 나오게 됩니다. 10개의 문자열을 제대로 입력 받지 못하게 되는 문제점을 파악했습니다.

  • nextDouble()은 버퍼에서 공백이나 개행 문자를 건너뛰고 double 값을 읽어오는데 사용자가 숫자를 입력하고 엔터를 누르면 입력 버퍼에 개행 문자(\n)가 남게됩니다. 이후에 다른줄에서 nextLine()을 호출하면 입력 버퍼에서 개행 문자를 읽어들여 빈문자열을 반환하게 되어 원하는 동작을 수행하지 못하는 것이죠.

  • 따라서 nextLine()으로 문자열을 읽는 부분이 빈 문자열을 반환하기 때문에 사용자가 입력해야 할 10개의 문자열을 제대로 입력 받지 못하게 되어서 공백 + 9개의 문자열이 출력되게 됩니다.

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
import java.util.Scanner; //Scanner 클래스 호출

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //Scanner 객체 생성
        //사용자로부터 제목을 입력받음
        String title = sc.nextLine(); //string 형 입력 및 리턴(개행을 기준으로 한 줄을 읽음)
        //사용자로부터 평점을 입력받음
        double score = Double.parseDouble(sc.nextLine()); //사용자로부터 입력받은 문자열을 double형으로 변환하여 저장
       
        //평점을 정수로 변환
        int intScore = (int) score; //double형을 int형으로 변환하여 저장
        double percentage = (double)intScore / 5 * 100; //백분율 계산
        String[] arr = new String[10]; //크기가 10인 배열 생성
        for(int i=0;i<10;i++) //10번 반복
        {
            arr[i] = sc.nextLine(); //사용자로부터 10개 입력 받음
        }
        System.out.println("[ "+title+" ]"); //제목 출력
        System.out.println("별점 : "+intScore+" ("+percentage+"%)"); //평점과 백분율 출력
        for(int i=0;i<10;i++) //10번 반복
        {
            System.out.println((i+1)+". "+arr[i]); //결과 출력
        }
    }
}

  • 따라서 해당 부분을 double doubleNum = Double.parseDouble(sc.nextLine()); 으로 변경하였습니다.

1

  • 사용자로부터 입력 받은 문자열을 double형으로 변환하여 저장하고 문자열로부터 double 값을 읽어들입니다. 사용자가 숫자를 입력하고 엔터를 누르면 입력 버퍼에는 엔터(\n) 문자가 남게되지만 nextLine()은 이 엔터 문자를 읽어들여 문제없이 처리하게 됩니다.

    🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

추가 🕤


  • 오늘 튜터님과의 면담을 통해 공부 방향이 잘못되었다는 것을 알게되었고 Java -> 객체지향 순이 아닌 객체지향 -> Java 순으로 공부해야겠다고 생각했습니다.

  • 객체지향은 왜 나왔지? 부터 접근하며 객체지향에 대해 이해하는 게 우선 순위인걸로,,

  • 제일 중요한 건 스스로 사고하기, 캠프 기간 동안 내가 하고자 하는 방향을 명확히 정하고 내가 잘못 공부했던 것들을 올바른 방향으로 갈 수 있게 고치도록 하는 과정이 이 4개월이 아닐까 생각합니다.

  • 아직까지는 남의 코드를 보며 이해하고 학습하는 게 더 쉽고 생각하는 힘을 기르는 게 어렵지만 그러지 않으면 4개월 뒤에도 이 자리에 머물러 있겠다는 생각이 들었고 오늘부터 목표는 내 코드에 주석을 달며 이 한 줄을 어떠한 이유로 왜?! 다는지에 대해 고찰해 보며 생각하는 것부터 시작하기로.

  • 내가 이 행동을 하는 것에 대해 끊임없이 질문하기.. 개발에 정답은 없다. 🤸🏻‍♀️

This post is licensed under CC BY 4.0 by the author.