내일배움캠프/TIL

[Spring_4기 본캠프] 2주차 - 자바 문법 종합반 | Day 18

austindynasty 2024. 11. 12. 23:32

1. 자바 문법 종합반 1주차 수강 후 과제 : 요리 레시피 메모장 만들기

<지시사항>

입력값

  • 내가 좋아하는 요리 제목을 먼저 입력합니다.
  • 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요.
  • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.

출력값

  • 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력해줍니다.
  • 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해 줍니다. 
  • 바로 뒤에 정수 별점을 5점 만점 퍼센트로 표현했을 때 값을 실수로 출력해 줍니다. 
  • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력해 줍니다.

위 과제를 진행하기 전 어떤 기능을 사용해 각 지시사항을 구현해야할 지 생각해봤다.

<제한 사항>

- 별점 입력 시에는 1~5사이 소수점이 있는 실수를 받지만, 출력 시에는 소수점을 제외한 별점에 그것을 5점만점 퍼센트로 표현했을 때 값을 함께 출력해야 함.

- 입력 종료 시 제목을 괄호로 감싸 가장 먼저 출력해야 함.

- 한 문장씩 입력해 최대 10문장

- 입력한 모든 문장 앞에 번호를 붙여 출력해야 함.

<구현 계획>

- while문을 무한 반복하게 해 레시피 문장을 계속 입력받자. 

- for문을 이용해 입력받은 문장을 문자와 함께 출력하자.

- while문 안에 if문으로 제한사항인 최대 10문장을 입력하면 종료되는 조건을 추가하자.

- 사용해야 할 변수들을 미리 생각해 정리해놓자.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); //input으로 입력받기
        String[] recipeSteps = new String[10]; //최대 10문장
        int step = 0; // 레시피 개수 저장

        System.out.print("요리 제목을 입력하세요 : ");
        String title = input.nextLine();

        System.out.print("별점을 1~5 사이의 소수점이 있는 실수로 입력하세요 : ");
        double rate = input.nextDouble();
        input.nextLine(); //숫자 입력 후 문자열을 입력받을 때 개행문자 제거 필수

        System.out.println("레시피를 입력하세요(최대 10개) : ");
        while (true) {
            System.out.print((step + 1) + ". ");

            String sc = input.nextLine();

            if (step < 10 ) {
                recipeSteps[step] = sc; //recipeSteps는 문장,step은 번호 sc에 저장
                step++; //레시피 앞 숫자 증가
            } else {
                System.out.println("최대 레시피 개수를 초과했습니다. 입력이 종료됩니다.");
                break;
            }
        }
        System.out.println("[ " + title + " ]");

        int intRate = (int)rate; //입력받는 별점은 실수, int로 형변환하기
        double percentage = intRate/5.0*100; //5점 만점 퍼센트로 표현하기
        System.out.println("별점 : " + intRate + "("+percentage+")");

        for (int a = 0; a < step ; a++) {
            System.out.println((a + 1) + ". " + recipeSteps[a]); //번호와 문장 출력
        }
    }
}
더보기

<입력>

요리 제목을 입력하세요 : 보글보글 라면
별점을 1~5 사이의 소수점이 있는 실수로 입력하세요 : 3.8
레시피를 입력하세요(최대 10개) : 
1. 물을 450ml 준비해 렌지에 올립니다.
2. 물이 끓기 전 가루스프를 넣어 풀어줍니다.
3. 채소 스프는 버립니다.
4. 물이 팔팔 끓으면 면을 넣습니다.
5. 면을 풀어 익혀줍니다.
6. 가운데 공간을 만들어 계란을 넣어줍니다.
7. 계란이 터지지 않게 가장자리를 저어줍니다.
8. 2분 더 끓입니다.
9. 그릇에 옮깁니다.
10. 완성!
11. 
최대 레시피 개수를 초과했습니다. 입력이 종료됩니다.

 

<출력>
[ 보글보글 라면 ]
별점 : 3(60.0)
1. 물을 450ml 준비해 렌지에 올립니다.
2. 물이 끓기 전 가루스프를 넣어 풀어줍니다.
3. 채소 스프는 버립니다.
4. 물이 팔팔 끓으면 면을 넣습니다.
5. 면을 풀어 익혀줍니다.
6. 가운데 공간을 만들어 계란을 넣어줍니다.
7. 계란이 터지지 않게 가장자리를 저어줍니다.
8. 2분 더 끓입니다.
9. 그릇에 옮깁니다.
10. 완성!

-> 범위를 10미만으로 조정해도 자꾸 11번까지 입력하는 칸이 생성된다. 뭐가 문젠지 전혀 모르겠다...

출력은 분명 예상처럼 잘 나오는데 어디가 문제일까 코드를 하나하나 뜯어봤다. 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); //input으로 입력받기
        String[] recipeSteps = new String[10]; //최대 10문장
        int step = 0; // 레시피 개수 저장

        System.out.print("요리 제목을 입력하세요 : ");
        String title = input.nextLine();

        System.out.print("별점을 1~5 사이의 소수점이 있는 실수로 입력하세요 : ");
        double rate = input.nextDouble();
        input.nextLine(); //숫자 입력 후 문자열을 입력받을 때 개행문자 제거 필수

        System.out.println("레시피를 입력하세요(최대 10개) : ");
        while (step < 10) {
            System.out.print((step + 1) + ". ");
            String sc = input.nextLine();
                recipeSteps[step] = sc; //recipeSteps는 문장,step은 번호 sc에 저장
                step++; //레시피 앞 숫자 증가
        }

        System.out.println("최대 레시피 개수를 초과했습니다. 입력이 종료됩니다.");
        System.out.println("[ " + title + " ]");

        int intRate = (int)rate; //입력받는 별점은 실수, int로 형변환하기
        double percentage = intRate/5.0*100; //5점 만점 퍼센트로 표현하기
        System.out.println("별점 : " + intRate + "("+percentage+")");

        for (int a = 0; a < step ; a++) {
            System.out.println((a + 1) + ". " + recipeSteps[a]); //번호와 문장 출력
        }
    }
}

-> while문을 true로 해놨기 때문에 무한반복되는 과정에서 11번까지 입력하는 칸이 생성되었던 것 같다. 

if문은 크게 필요가 없기 때문에 if문 안의 조건을 while문으로 옮겨 더 간결하게 수정했다. 코드를 수정하고 실행해보니 정상적으로 10번까지만 작성하는 칸이 나오는 걸 확인했다. 원래 while문을 쓰려던 이유가 레시피를 모두 출력하고 나면 자동으로 새로 레시피를 입력할 수 있게 하고싶어서였는데ㅠㅠ 구현계획과는 달라졌다. 

 

2. 트러블 슈팅

이렇게 내가 생각했던 구현 계획과는 다르고 예상치 못한 문제를 발견했을 때 해야하는 트러블슈팅

오늘부터 트러블 슈팅을 연습해 나가며 발전할 수 있는 기회로 삼아보고자 한다. 

 

LG CNS AWS IoT Core Endpoint 신뢰하지 않는 인증서 오류 트러블슈팅 

참조링크 | https://www.lgcns.com/blog/cns-tech/aws-ambassador/40847/ 

 

AWS IoT Core Endpoint 신뢰하지 않는 인증서 오류 트러블슈팅 - LG CNS

1. 개요 AWS IoT Core를 사용하여 프로젝트를 진행할 시 SDK를 사용하여 백엔드를 개발하는 경우가 있습니다.이번 포스트는 Backend에서 IoT Core를 사용하는 어플리케이션을 개발할 시에 겪은 ‘신뢰하

www.lgcns.com

 

위에 참조된 링크를 읽어보고 분석한 트러블 슈팅의 단계.

1. 개요 : 어떠한 문제(오류)가 발생했는지 간단하게 설명

2. 트러블 슈팅

  1) 아키텍쳐 다이어그램으로 나타내기 : 소프트웨어 시스템 구성 요소의 시각적 표현을 제작하는 프로세스. 소프트웨어는 본질적으로 추상적이므로 구현 방식, 기능 간의 상호 작용, 시스템 내의 다양한 데이터 이동 등을 시작적인 도표로 나타내 직관적이다. 

  2) 발단 : 당시 상황과 구현하려고 했던 초기 계획을 설명하고 어떠한 문제 상황이 발생했는 지 설명한다.

  3) 전개 : 문제점 파악

  4) 위기 : 문제점을 해결하기 위해 취한 조치와 그 조치에 대한 결과를 설명

  5) 절정 : 위의 단계에서 시도한 방법이 성공하지 못했다면 또 다른 해결 방법을 찾아 시도한다.

  6) 결말 : 해결 방식에 또 다른 문제가 있는 지 재차 확인하고, 의심한다. 즉, 더 나은 해결 방법이 있는지 확인한다. 

  7) 마무리 : 위의 단계를 요약해 간단하게 설명한다. 

 

 

<문제점>

  - 레시피 10문장을 모두 다 썼는데도 while문이 종료되지 않고 11번째 input이 나옴.

-> 원인 : while문에 exit조건이 없기 때문

  - while문 완료 후 새로 입력하려면 새로 run을 눌러줘야 함. (구현계획 틀어짐)

-> 원인 : while문의 위치가 프로그램 전체를 감싸고 있지 않아 특정 구간(레시피를 입력하는 부분)만 반복됨.

  - 선언된 변수가 많아 코드 짤 때 헷갈림.

  - 더 깔끔한 풀이 방법이 있을 것같은데 그다지 필요없는 조건을 추가하거나 더 복잡한 방법을 사용함.

 

<해결 방안 & 개선점>

  - while문에 exit을 입력하면 종료되는 조건을 추가한다. -> 실행 안함.  while문의 범위 자체를 step이 10개가 되었을 때 자동으로 종료되도록 설정.

- 전체 프로그램이 반복되게끔 while문을 true조건으로 프로그램 전체를 감싸 무한 반복 구조로 바꾸어야 한다. 즉, while문의 위치 조정을 해야함.

- 변수를 선언할 때 직관적이고 다른 사람도 쉽게 알아볼 수 있게 해야한다. 그러려면 내 스스로도 어떤 변수가 무엇을 가리키고 있는 지 알아야한다. 결국 코드를 계속 짜보면서 익숙하게 습관을 들여야 한다. 

- 구현계획을 짤 때 쓸만한 모든 조건문이나 반복문을 나열해놓고, 그 중 가장 깔끔하게 작성되는 것을 고른다. 이것 또한 아직 사용할 수 있는 메서드나 함수가 많이 없기 때문에 Java 공부를 더 진행하고 코드를 많이 짜봐야 알 수 있게된다.

 

  아직 많이 부족하지만 에러나 문제점이 발생했을 때 이를 구조적으로 파악하고 해결하려고 하는 연습을 꾸준히 하다보면 완벽한 트러블 슈팅을 할 수 있을 것이라고 생각한다!! 

 

 

 

 

★새배개★

 

1. 상속 (Inheritance라고 하며 extends가 대표적인 형태) : 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것.

2. 추상화 (abstract) : 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것. 반드시 상위 클래스일 필요는 없어서 공통적인 속성과 기능을 정의한 하위클래스를 생성할 수도 있다.

3. 클래스 : 객체를 생성하기 위한 설계도. 자바는 모든 코드가 클래스로부터 시작되며 클래스 내부에 변수(데이터)와 메서드(기능)가 포함된다.

4. 유니코드 : 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준. 문자에 2진수 10진수 등을 이용해 특정 코드 넘버를 부여한다.

6. 2진수 (binary) : 두 개의 숫자 0과 1만을 이용하는 수 체계. 오류를 최소화하고 비용과 시간을 효율적으로 사용하기 위해 창시됨.

7. 부모클래스 (상위클래스) 

8. 자식클래스 (하위클래스) : 자식 클래스는 부모 클래스를 선택해 그 부모의 멤버를 상속받아 그대로 쓸 수 있다. 하지만 상속을 한다고해서 모든 것을 물려받는 것은 아니다. 부모클래스의 private 접근 제한을 갖는 필드 및 메서드는 자식이 물려받을 수 없다. 또한 서로 다른 패키지에 있다면 부모의 default 접근 제한을 갖는 필드 및 메서드를 물려받을 수 없다.

9. equalsIgnoreCase : 자바에서 제공하는 기본 라이브러리 메서드. equals는 대소문자 구분을 하며 단어 문자 자체가 똑같아야 인식하지만 equalsIgnoreCase는 대소문자 구분 없이 단어가 같으면 인식해준다.

10. 접근제어자 : 클래스, 변수, 메서드 등에 대한 접근 범위를 설정해주는 키워드. 즉 누가 이 코드에 접근할 수 있는 지를 정한다. 주요 접근제어자는 public, private, protected 그리고 아무것도 안붙인 경우 네 가지이다.