2023.07.24 - java 문법 종합반(1주차)

mjjin·2023년 7월 24일
0

Java 문법 종합반

목록 보기
1/8

1. TIL(Today I Learned) 시작

평소 나는 무언가를 기록할 일이 있을 때
UpNote, onenote, Joplin 등의 노트앱으로 배운 것들을 정리해왔고,
해당 기록등은 어차피 '나'만 볼 것이므로 가독성의 부분들은 신경쓰지 못했다.

단언컨대, 누군가에게 내 노트앱을 공개로 전환하라면 밤새 이불킥 할 자신있다.

사실 어느 순간부터 필요성에 의해 노트들을 들여다볼 때면
그 노트를 썼던 '과거의 나'는 '미래의 나'에게 전혀 배려해주지 않은 느낌을 받았고,
내 기억력은 금붕어 수준이라는 리마인드 외엔 아무 정보도 얻을 수 없었다.

새로운 언어를 배워보는 만큼, 이번 기회에 TIL를 작성해보려고 한다.
부끄럽지만, 나 외의 다른 독자가 있다는 전제로 글을 작성하다 보면
신경써서 글을 적게 될 것이고, 그것이 미래의 나에게도 도움이 될 것이라 믿는다.

2. Java 다른 버전 구성

오늘부터 수강 할 Java 종합반에서는 Java17 버전의 환경에서 진행한다.
내 컴퓨터에는 Java8 버전만 설치되어 있었기 때문에
17버전 다운로드 및 세팅을 진행했지만, cmd->Java -version 결과
내가 방금 설치한 17버전은 출력되지 않고, 기본 버전인 Java8만 출력됐다.

이럴 땐 당황하지 않는게 제일 중요한 법이랬다.
해결방법을 찾아보기 위해 만능의 구글링을 시작했고,
"자바 다른 버전 설치" 로 검색 후 링크의 글을 참조하여 해결 할 수 있었다.

3. 1주차 강의 수강 및 복습

1주차 내용에서는 크게 세가지 정도를 배웠다.

※ 자바 언어의 특징
※ 변수
※ 변수의 형변환

<자바 언어의 특징>

개발언어의 역사 (A언어, B언어, C언어, Java)와
Java 언어의 특징에 대해 배웠다.
객체 지향, JVM, JDK 등…

객체지향성에 대한 내용은 python언어를 배울 때도 들어봤던 내용이라
개념이나 특징 등에 대해 이해하기 쉬웠고,

JVM(Java Virtual Mechine) 의 개념으로는 집에 있는 NAS 서버를 통해
가상 환경을 구동해 본 경험이 있었기에 다행히 이해하는데 도움이 되었고,
특징으로는 어떠한 운영환경에서도 구동이 가능하도록 해준다는 특징은
정말 너무 큰 장점이라고 생각했다.

이미 리눅스와 윈도우의 차이로 인한 고통을 너무 많이 겪었기 때문이다.
그 외 JRE나, JDK등에 대해서도 크게 어려운 개념은 없었던 것 같다.

<변수>

변수는 기본형 변수, 참조형 변수, 래퍼 클래스 변수가 있다.

- 기본형(primitive type) 변수

논리형 - boolean : true, false 값을 저장한다.
문자형 - char : 문자 하나만 저장한다. ex) 'A', '1'
정수형 - byte, short, int, long : 정수형 숫자값을 저장하며 각 저장 범위가 다르다.
- byte : -128 ~ 127 범위의 숫자
- short : 2byte, -32,768~32,767 범위의 숫자
- int : 4byte, -21억~21억 범위의 숫자
- long : 8byte, 9백경 정도의 범위

실수형 - float, double : 소수점 실수값을 저장하며 long보다 넓은 범위를 표현한다.
주의 할 점은 float가 long보다 byte는 작지만 더 넓은 범위를 표현하기 때문에
자동 형변환이 되지 않는다는 점이다.
- float : 4byte, 3.4 * -10^38 ~ 3.4 * 10^38
- double : 8byte, 1.7 * -10^308 ~ 1.7 * 10^308
  #
  

- 참조형(reference type) 변수

참조형은 기본형 이외의 타입으로, 메모리 공간에 주소값(memory address)이 저장된다.

  • <래퍼클래스(Wrapper Class) 변수>
    기본형 변수를 객체로 다루기 위해 사용하며, 박싱과 언박싱이 있다.
    주로 기본형 변수에서 앞글자를 소문자에서 대문자로 변경해주면 되는데,
    int의 경우 Integer, char의 경우 Character로 변경한다.

    변수 자료형에 대한 개념은 이미 아는 내용이었지만,
    변수 선언 방식 등은 Python 언어와 다르다보니 아직도 헷갈리고 있다.
    Python에서는 i = 2 정도면 됐는데, Java에서는 int i = 2;로
    자료형에 대한 타입을 먼저 적고, 변수명을 적어야 한다.

    코드를 열심히 쓰다보면 점차 익숙해지리라 믿고
    현재 할 수 있는 방법이라곤 몸으로 때우(?)는 수 밖엔 없는 것 같다.

<형변환>

형변환에는 자동 형변환과 강제 형변환이 있으며
자동 형변환의 경우는 작은 타입 > 큰 타입으로 변환시 자동으로 이루어지고,
강제 형변환의 경우는 큰 타입 > 작은 타입으로 변환하고자 할 때
값의 손실이 생기기 때문에 개발자가 선택하여 형변환을 진행한다.

형변환은 주로 기본형 변수인 정수, 실수, 문자들 사이에서 일어난다.

변수의 타입을 바꾸는 것,
파이썬 언어가 왜 쉽다고 했는지 점점 알 것 같아지고 있다.

4. 1주차 숙제 (요리 레시피 메모장 만들기)

문제 내용 - 요리 레시피 메모장 만들기

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

ex) 입력 예시

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

예시 출력

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

숙제 완성코드


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input0 = sc.nextLine(); //개행문자(/n)제거용. 없으면 1번이 사라진다
        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("[ "+title+" ]");
        int intRate = (int)rate;
        float floatRate = (float) (intRate / 5.0 * 100);
        System.out.printf("별점 : %d (%.1f%%)%n",intRate,floatRate);
        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);


        }
}

오류해결기

어찌어찌 풀긴 풀었다.
이번 문제를 풀다보니 총 3가지의 문제가 생겼는데,

첫번째는 Exception 오류.
두번째는 퍼센트가 0으로 출력되는 오류.
세번째는 별점 입력 후 쥐도새도 모르게 사라지는 '한 줄'

<첫번째 문제 - Exception 오류>

코드가 어느 정도 완성이 되었었다.
이제 테스트를 돌려보고자 문장 쓰기 귀찮아서 ㅇㅇㅇ,3,1 등으로 진행하던 테스트를
실제 문장에 맞게 테스트를 돌렸는데 Exception 오류가 나왔다.
본격 테스트용

문제 해결을 위해 "Exception in thread "main" java.util.InputMismatchException"로 검색,
자료형에 맞지 않게 입력해서 뜨는 문제라고 한다.

내 코드를 열심히 확인해봤지만 자료형에 맞지 않기 때문은 아닌 것 같았다.
더 열심히 검색해보기로 했다.

더 열심히 찾아본 결과 링크에서 답을 찾을 수 있었다.

문자를 여러줄 받는 경우, nextLine 메서드를 이용해서 한 줄 씩 읽어서 처리하자.

sc.next(); 를 sc.nextLine();으로 바꾸자 오류 없이 정상적으로 진행되었다.

<코드수정 전>

        Scanner sc = new Scanner(System.in);
        String title = sc.next();
        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input1 = sc.next();

<코드수정 후>

        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input1 = sc.nextLine();

sc.next();는 힌트 코드블럭에 있던 내용이기 때문에
설마 힌트 코드 블럭이 이상하겠어? 하면서 내 문제인 줄 알고 있었다.
일단 돌아는 가니까 그대로 작성 후 해설 동영상에서 확인해봐야지 했는데,
이후 해설 동영상에서도 sc.next();가 아닌 sc.nextLine();으로 기재되어있었다.

이 힌트는 나에게 좋은 배움(이라쓰고 삽질이라 읽는)의 기회를 주었다.
뒷통수가 살짝 얼얼한건 절대 기분탓이겠지..

<두번째 문제 - 퍼센트 오류>

문제 내용이
1. 요리 별점을 정수로 출력할 것 (힌트부분에서 float로 받았기에 int로 형변환이 필요)
2. 정수별점을 퍼센트로 표현 시 값을 실수로 출력할 것
이었기 때문에, 단순하게 int로 변환한 변수를 int/5*100 으로 진행해보았다.

그런데.. 별점을 4.5로 입력 시, 80이 아닌 0.0이 나왔다.
float형인데 전부 값이 정수라서 0이 나오는걸까 싶어
5를 5.0으로 바꿔보니 해결되었다.

<코드수정 전>

        float floatRate = (float) (intRate / 5 * 100);

<코드수정 후>

        float floatRate = (float) (intRate / 5.0 * 100);

<세번째 문제 - 한 줄이 사라지는 오류>

아 이제 끝이 보이겠구나! 싶었는데
어김없이 나타나는 오류가 내 발목을 잡았다.
무슨 짓을 해도 input1이 빈칸으로 나왔기 때문.

하지만 아까 첫 번째 문제를 해결하겠답시고 보았던 게시글에서
홀린듯 스쳐지나갔던 정보가 있었다.

숫자를 입력받고 엔터를 치면 개행문자는 다음 nextLine이 읽는다.

해당 게시글에서는 nextLine()을 중간에 사용하여 개행문자를 제거했고,
나도 코드 줄에 nextLine()을 한 줄 더 추가하여 해결을 보았다.
<코드수정 전>

        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();

<코드수정 후>

        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input0 = sc.nextLine(); //개행문자(/n)제거용. 없으면 1번이 사라진다
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();

이렇게 문제를 해결해나가며 코드작성을 마치게 되었다.

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

좋은 정보 감사합니다

1개의 답글