[내배캠 7일차] 클래스 선언할 때와 다룰 때 주의할 점 / 계산기 과제 Lv.1 - Scanner 사용시 버퍼 비워주기 필수

말하는 감자·2025년 2월 25일

내일배움캠프

목록 보기
7/73

오늘도!!!!!!!!강의를 듣는 것이 좀 주가되겠지만 정리하는 내용은 내가 헷갈리고 잘 모르겠는 것만 집어서 기록한다!

자바 문법 종합반 2주차

클래스의 생성자

📚 생성자(constructor) - 조립설명서

  • 객체를 만들 때 사용합니다.
  • 객체를 어떻게 만들지 정의해 놓는 것입니다. - 조립설명서
  • 생성자가 없으면 클래스를 객체화 시킬 수 없습니다.(조립불가)
    • 객체화 시킨다 = 인스턴스화 시킨다.

📌 생성자를 만들지 않았는데도 객체화가 된다.

왜냐하면 클래스를 선언할 때 기본생성자가 눈에보이진 않지만 있기 때문이다.
기본 생성자의 형태는 클래스이름() {}

Public class Person{
	String name;
    int age;
    String address;
}
...
pulbic static void main(String[] args){
	Person pA = new Person();
}

클래스를 사용할 때 new 를 보통 앞에 붙이는데 이것이 생성자를 호출하는 키다.
위에 있는 예제의 생성자는

	Person(){}

이 되는 것이다.

생성자의 특징
1️⃣반환 자료형이 없다.
2️⃣클래스명과 이름이 똑같다.
3️⃣여러 개가 존재할 수 있다.
들어가는 매개변수 타입과 개수에 따라서 생성자를 알아서 선택하게 됨.


JVM 메모리 영역

런타임구역과 아닌구역으로 나뉘어져 있다..


레퍼클래스


레퍼클래스는 기본 자료형을 객체로 감싸고 있는 클래스 이다.
리스트였나?? 뭐 비슷한 자료형을 int로 선언할때가 있고 Integer로 선언할때가 있고 그렇지않나
Integer는 보통 Integer.parseInt() 쓸 때 많이 사용해봤다.

이외에도 String도 래퍼클래스다. 사용해보면 혼자 변수 시작점이 대문자 S임

기본 자료형(Primitive Type)종류범위바이트비트래퍼 클래스(Wrapper Class)
boolean논리형true/false18Boolean
char문자형0~65535 유니코드 값216Character
byte정수형-128~12718Byte
short정수형-32,768 ~ 32,767216Short
int정수형-2,147,483,648 ~ 2,147,483,647432Integer
long정수형-9,233,372,036,854,775,808 ~ 9,233,372,036,854,775,807864Long
float실수형약 소수점 6~7자리까지432Float
double실수형약 소수점 15~17자리까지864Double

.
.

📌 오토박싱 vs 언박싱

  • 래퍼클래스 ↔ 기본형으로 형변환은 굉장히 자주 일어남.
  • Java에서는 이 형변환 과정을 자동으로 지원해 준다.

오토박싱

기본형 → 래퍼형으로 변환하는 과정을 오토박싱이라고 함
Integer는 참조형(객체)이지만 기본형 int 값을 직접 대입할 수 있음.

Integer num3 = 10; // ✅ 오토박싱
Integer num = Integer.valueOf(10); // 원래는 이렇게 선언되어야 함.

.

오토 언박싱

래퍼형 → 기본형으로 변환하는 과정으로 오토언박싱
num은 Integer 객체(참조형변수)지만 기본형 int 변수에 대입할 수 있음

Integer num3 = 10; 

int num = num3;   // ✅ 오토 언박싱
int a = num.intValue(); // 원래는 이렇게 바꿔줘야 함.

게터와 세터

추상화까지 보고 정리예정


계산기 과제

Lv1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기

✅ 요구사항

1. 양의 정수(0포함)을 입력받기

  • Scanner사용하기.
  • 값은 2개만 받기, 하나씩 전달받기

2. 사칙연한 기호(+,-,×,÷)입력받기

  • Scanner를 사용하여 사칙연산 기호를 전달
  • 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장 (charAt(0))

3. 위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력

  • 키워드 : if switch
  • 연산을 진행
  • 제어문을 사용. (예를 들면 if, switch)
  • 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력
    • ex) “나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.“

4.반복문을 사용하되, 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정하기

  • 키워드 : 무한으로 반복, 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하며 수정)
  • 반복문을 사용합니다. (예를 들어, for, while…)

📌고려할 사항

  • 계산 입력 도중에 exit입력하면 바로 종료하게하기
    • 들어오는 값을 바로 int나 char으로 받지말고 exit인지 먼저 확인해야할듯?
    • 질문했는데 계산 다 끝나고 나서만 exit받으면됨
  • 음의 정수 입력받으면 안됨
    • int 변환 후 값 비교 필요
  • 정수를 받는 타이밍에 스트링이나 연산자를 입력받으면 안됨.
  • 나눗셈 연산에서 분모에 들어가는 수가 0이 될 수 없음.

당장 생각나는 것은 이정도인데 고려할 사항과 요구사항은 다음 레벨에 가서 계속 추가되기 때문에 매 게시글마다 갱신하고 복붙해줄 생각이다.

오늘은 먼저 - 정수를 받는 타이밍에 스트링이나 연산자를 입력받으면 안됨. <<이것부터 해결해보려고한다.

❗정수를 받는 타이밍에 스트링이나 연산자를 입력받으면 안됨.

일단 받은 값을 str로 받아서
Integer.parseInt 시도 하는 수순으로 ?? 할까싶다.
만약에 받은 값들 안에 int범위에 없는 문자가 들어가면 다시 입력하라고 보낼것이다.

        System.out.println("연산을 진행할 첫 번째 정수를 입력해주세요 : ");
        String str = sc.next();
        int value = Integer.parseInt(str);

이 부분인데, 입력에 문자열을 넣어봤다.

이걸이제 try-catch문으로 이 오류가 뜨면
메시지를 주고 다시 받아라~~ 라고 바꿔줄 것이다.

라고생각했었다.
근데 try-catch문이면 int value1 = sc.nextInt(); 여기서 오류가 나면 다시 받기로 해도 되지 않나?? 불필요한 String 변수를 안 써도 될 것 같다.

한번해보겠따~!!

        int[] values = new int[2];

        System.out.println("연산을 진행할 "+ (0+1) +"번째 정수를 입력해주세요 : ");
        try{
            values[0] = sc.nextInt();
            sc.nextLine();
        }catch (InputMismatchException e) {
            System.out.println("정수 값을 입력해주세요!");
        }

값 똑같이 두개 받을거라서 for문 두번돌리면되는거아닌가? 라는 생각으로 일단 포멧은 이렇게 만들었다

생각대로 잘나온다

for문에 넣으니 문제가생겼다

 			for(int i = 0; i < 2; ){
                System.out.println("연산을 진행할 "+ (i+1) +"번째 정수를 입력해주세요 : ");
                try{
                    values[i] = sc.nextInt();
                    sc.nextLine();
                    i++;
                }catch (InputMismatchException e) {
                    System.out.println("정수 값을 입력해주세요!");
                }
            }


int값을 넣어줘도 계속 InputMismatchException에러가 난다.
이 에러의 이유는 nextInt()로 입력값을 읽어와서다..

nextInt() 같은경우 앞에있는 Int값을 우선 받아오는 것이 우선??이라고 해야하나 여튼 버퍼가 비워지지 않아서 생기는 문제임..

그래서 catch문에도 nextLine()으로 버퍼를 비워주는 과정을 거쳐야한다.

++)그 외에도 음수를 받으면 다시 치라고 돌려보내는 코드도 추가했다.!!

            for(int i = 0; i < 2; i++){
                System.out.println("연산을 진행할 "+ (i+1) +"번째 정수를 입력해주세요 : ");
                try{
                    values[i] = sc.nextInt();
                    if(values[i] < 0){
                        System.out.println("0 이상의 값만 입력이 가능해요.");
                        sc.nextLine();
                        i--;
                    }
                }catch (InputMismatchException e) {
                    System.out.println("정수 값을 입력해주세요!");
                    sc.nextLine();
                    i--;
                }
            }

이제 무한루프를 돌려주되, 플래그를 설정해주고
계산값을 출력했을 때,
계산기 계속 쓸거냐고 물어보기만 추가하면 끝

       boolean exitFlag = true;
       ...
       while(exitFlag){
       
       계산기 어쩌고 저쩌고~~
       		System.out.print("계산을 종료하시려면 'exit'를 입력해주세요 : ");
            str = sc.nextLine();
            if(str.equals("exit")){
                exitFlag = false;
                System.out.println("계산기를 종료합니다.");
            }
            else{
                System.out.println("입력된 값 : " + str);
                System.out.println("계산을 다시 시작합니다.");
            }
        }
        sc.close();
       

이런식으로 마무리 해줬다!!! 푸시푸시도끝

Lv.1 마무리한 깃허브~!
https://github.com/Ksr-ccb/Sparta-Chapter2

profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글