231013 TIL

SEULBI LEE·2023년 10월 13일
2

TIL

목록 보기
2/25

자바 문법종합반 1주차 마무리

강의에서 기억하고 싶은 팁

1) sout 단축... 인텔리제이 제공. (System.out.println)

2) deprecated : 더 이상 사용하지 않는 표현. 지원 종료

3) 문자(char)와 문자열(String), 저장 관점의 차이점
문자(char)는 1byte만 쓰기 때문에 끝을 알고 있음. 따라서 문자 뒤에 \0(널문자)가 없음.
문자열(String)은 몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 함. 따라서 문장의 끝에 \0(널문자) 사용.

동적 : 알 수 없을 때 / 정적 : 항상 고정됨

변수 선언해보기

mport java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 참조형 변수
        // (1) 문자열
        // String helloWorld = "Hello world!";

        // (2) 배열
        // 타입 뒤에 []대괄호는 배열 값을 선언할 것임을 표시, 해당 변수에 들어갈 배열 값은 {}중괄호 안에, (,)쉼표를 사용하여 구분하여 기재
        int[] a = {1,2,3};
        // 참조형 데이터는 주소값을 저장함
        // Arrays 유틸리티의 tostring 기능 이용
        System.out.println(Arrays.toString(a));

        // 래퍼 클래스(Wrapper Class 변수)
        int number = 21;
        // new 연산자 없이 선언
        Integer num = number; // boxing
        System.out.println(num.intValue()); //unboxing

    }
}

형변환 예시 1

// 숫자 -> 문자
// import : 외부 유틸리티가 제공하는 기능을 가지고 옴
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //콘솔에서 입력한 값을 저장함
        Scanner sc = new Scanner(System.in);
        // 입력한 값을 하나 하나 읽어 아스키코드로 할당
        int asciiNumber = sc.nextInt();
        //아스키코드로 읽은 수를 문자로 바꿈(형변환)
        char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.

        System.out.println(ch);
    }

}

형변환 예시 2

// 문자 -> 숫자

import java.util.Scanner;

public class Main {

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

		char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
		int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.

		System.out.println(asciiNumber);
	}

}

// 입력
a

// 출력
97

내가 코드를 읽을 때 키워야 하는 실력
이런 예시문을 볼 때 어느 부분이 변수 이름이고, 어느 부분이 메서드인지 정확하게 구분하기. 변수에 값이 저장되고 변환, 출력되는 경로를 항상 머릿속으로 그려보기. 변수 명, 즉 바꿀 수 있는 이름이라면 조금씩 바꿔보며 코드 작성에 익숙해지기

bit 2진수를 16진수로 저장(표현)하는 것.
이게 무슨 말이지?? 복습할 때 다시 보기.

1주차 숙제

실수 1) float → int 형변환

틀렸던 코드

//레시피 별점 입력
        System.out.println("레시피의 별점을 매겨주세요.");
        Scanner sc2 = new Scanner((System.in));
        Float input2 = sc2.nextFloat(); // float 값을 받을 때는 nextFloat
        int inputChange = (int)input2; //형 변환
        System.out.println(inputChange+"점");

float 타입 선언이 아닌, Float 래퍼클래스 타입을 적어 형 변환 불가
float 타입으로 변경하여 문제 해결.
그런데 왜 Float 클래스로 적었을 때도 값 출력은 됐을까? 질문중
값 출력도 가능하고, 형 변환을 하고 싶다면... intValue() 메소드를 사용하면 됨!

내가 완성한 코드

// 문자 -> 숫자

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // 레시피 제목 입력
        System.out.println("레시피 제목을 입력해 주세요.");
        Scanner sc1 = new Scanner(System.in); //Scanner 객체 생성
        String input1 = sc1.nextLine(); //sc(Scanner)의 .next();를 실행하면 input 변수에 입력한 글자 받음. next는 공백 기준 한 단어만. nextLine은 한 줄만

        //레시피 별점 입력
        System.out.println("레시피의 별점을 5점 만점으로 매겨 수를 적어주세요.");
        Scanner sc2 = new Scanner(System.in); // Scanner 객체 명 구분해줘야 하지 않나??
        float input2 = sc2.nextFloat(); // float 값을 받을 때는 nextFloat
        int inputChange = (int)input2; //형 변환
        //별점을 %로 치환
        float rate = input2/5*100;

        //레시피 기입
        System.out.println("레시피를 10줄로 적어주세요.");

        Scanner sc3 = new Scanner(System.in);
        String input3 = sc3.nextLine();
        Scanner sc4 = new Scanner(System.in);
        String input4 = sc4.nextLine();
        Scanner sc5 = new Scanner(System.in);
        String input5 = sc5.nextLine();
        Scanner sc6 = new Scanner(System.in);
        String input6 = sc6.nextLine();
        Scanner sc7 = new Scanner(System.in);
        String input7 = sc7.nextLine();
        Scanner sc8 = new Scanner(System.in);
        String input8 = sc8.nextLine();
        Scanner sc9 = new Scanner(System.in);
        String input9 = sc9.nextLine();
        Scanner sc10 = new Scanner(System.in);
        String input10 = sc10.nextLine();
        Scanner sc11 = new Scanner(System.in);
        String input11 = sc11.nextLine();
        Scanner sc12 = new Scanner(System.in);
        String input12 = sc12.nextLine();


        System.out.println("["+input1+"]");
        System.out.print("별점 : "+inputChange);
        System.out.println(" ("+rate+"%)");

        System.out.println("1. "+input3);
        System.out.println("2. "+input4);
        System.out.println("3. "+input5);
        System.out.println("4. "+input6);
        System.out.println("5. "+input7);
        System.out.println("6. "+input8);
        System.out.println("7. "+input9);
        System.out.println("8. "+input10);
        System.out.println("9. "+input11);
        System.out.println("10. "+input12);

        System.out.println("레시피 입력이 종료되었습니다.");
    }

}

정답 코드를 보니 코드의 중복이 너무너무 많다.
다시 고쳐보자.

1. 스캐너가 너무 많다. 입력란을 구분해주려면 스캐너 구분이 필요할 것 같긴 한데. 마지막 입력란은 다 통일하자.
2. 이렇게 되면 별점과 %가 통일되지 않는다. 숙제 의도대로 %도 정수값을 받자.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // 레시피 제목 입력
        System.out.println("레시피 제목을 입력해 주세요.");
        Scanner sc1 = new Scanner(System.in); //Scanner 객체 생성
        String input1 = sc1.nextLine(); //sc(Scanner)의 .next();를 실행하면 input 변수에 입력한 글자 받음. next는 공백 기준 한 단어만. nextLine은 한 줄만

        //레시피 별점 입력
        System.out.println("레시피의 별점을 5점 만점으로 매겨 수를 적어주세요.");
        Scanner sc2 = new Scanner(System.in); // Scanner 객체 명 구분해줘야 하지 않나??
        float input2 = sc2.nextFloat(); // float 값을 받을 때는 nextFloat
        int inputChange = (int)input2; //형 변환
        //별점을 %로 치환
        int rate = inputChange/5*100;

        //레시피 기입
        System.out.println("레시피를 10줄로 적어주세요.");

        Scanner sc3 = new Scanner(System.in);
        String input3 = sc3.nextLine();
        String input4 = sc3.nextLine();
        String input5 = sc3.nextLine();
        String input6 = sc3.nextLine();
        String input7 = sc3.nextLine();
        String input8 = sc3.nextLine();
        String input9 = sc3.nextLine();
        String input10 = sc3.nextLine();
        String input11 = sc3.nextLine();
        String input12 = sc3.nextLine();


        System.out.println("["+input1+"]");
        System.out.print("별점 : "+inputChange);
        System.out.println(" ("+rate+"%)");

        System.out.println("1. "+input3);
        System.out.println("2. "+input4);
        System.out.println("3. "+input5);
        System.out.println("4. "+input6);
        System.out.println("5. "+input7);
        System.out.println("6. "+input8);
        System.out.println("7. "+input9);
        System.out.println("8. "+input10);
        System.out.println("9. "+input11);
        System.out.println("10. "+input12);

        System.out.println("레시피 입력이 종료되었습니다.");
    }

}

오늘 하루를 마무리하며

오늘은 정말 집중이 안 되는 날이었다.
중요하고 필수적인 내용인데, 애매하게 아는 게 역시 제일 무섭다.
안다고 생각해도 정작 실전에서 버벅거리면 안다고 할 수 없지...
인내심을 갖고 보자.
배속은 하고...
그리고 자꾸 느낌적인 느낌으로 코드를 짜지 말자.
그것 때문에 10분 걸릴 내용을 10시간 돌아간 적이 있으니...

0개의 댓글