계산기 Lv.2

하늘·2025년 3월 4일

Spring 부트캠프

목록 보기
16/18

Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기

먼저 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성

캡슐화를 하기전에 연산 결과를 Calculator클래스의 연산 결과 저장하는 필드에 저장 할 수 있게 만들어야하는데 전 그렇게 하지 않았네요.
사실 지금 알았어요 뭐 캡슐화 했으면 괜찮은거겠죠...

★트러블 슈팅★

코드를 작성하기 전에 캡슐화에 대해 이해해야 하는데 이 부분에서 어려움을 겪고 있습니다. 특히, Getter & Setter를 코드에서 어떻게 활용해야 하는지 감이 잘 오지 않아 블로그를 찾아보며 공부했지만 이해하기 어려워서 Spring 부트캠프 동기와 튜터님께 질문하여 개념을 정리할 수 있었습니다. 질문을 통해 Getter & Setter 개념을 이해하고 코드에 사용하는 방법도 알았습니당

간략히 설명해보자면
캡슐화는 변수와 메서드를 하나로 묶고 외부에서 직접 접근하지 못하게 막는 개념이며 변수를 private으로 숨기고 public 메서드(Getter, Setter)를 통해서만 접근할 수 있도록 할 수 있고 이렇게 하면 데이터를 마음대로 변경하지 못하게 보호하면서도 필요할 때 안전하게 조작할 수 있습니다.

예를 들면, 내 폰에 잠금을 걸어두면 아무도 마음대로 열 수 없지만 비밀번호(=Getter/Setter)를 사용하면 전화번호를 저장하고 삭제할 수 있는 것과 같습니다.

public class Smartphone{
	private String contact; // 연락처(데이터) - 직접 접근 불가
    
    //Getter(비밀번호를 입력해야 연락처 확인 가능)
    public String getContact(String password){
    	if(password.equals("1234")){
        	return contact;
        } else {
        	return "비밀번호가 틀렸습니다";
        }
    }
    
    //Setter(비밀번호를 입력해야 연락처 변경 가능)
    public void setContact(String password, String newContact) {
    	if(password.equals("1234")){
        	this.contact = newContact;
            System.out.println("연락처가 변경되었습니다.");
        } else {
        	System.out.println("비밀번호가 틀렸습니다. 연락처를 변경할 수 없습니다.");
       }
    }
 }

여기서 스마트폰은 클래스여서 내부에는 연락처(데이터)가 저장되어있고 잠금 기능은 캡슐화여서 비밀번호 없이는 아무나 연락처를 수정하거나 삭제할 수 없고 비밀번호 입력은 Getter와 Setter여서 비밀번호를 입력하면 연락처에 접근해서 추가하거나 삭제 할 수 있습니다.

아래에 있는 코드는 완성 코드입니당


Calculator.java

package example.v2;

import java.util.ArrayList;
import java.util.List;

public class Calculator {
    private List<Double> results = new ArrayList<>(); // 연산 결과 저장

    // 결과 리스트를 설정하는 메서드(Setter)
    public void setResults(List<Double> newResults) {
        if(newResults != null){ // 입력된 리스트가 null이 아닌 경우만 실행
            this.results = new ArrayList<>(newResults); // 새로운 리스트를 만들어 results에 저장
        } else{
            // null이 들어오면 경고 메시지 출력
            System.out.println("잘못딘 입력입니다. 결과 리스트를 null로 설정할 수 없습니다.");
        }
    }

    //결과 리스트를 가져오는 메서드(Getter)
    public List<Double> getResults() {
        return new ArrayList<>(results); // 원본 리스트를 보호하기 위해 복사본 반환
    }

    // 사칙연산을 수행하는 메서드
    public double calculate(double num1, double num2, char operator) {
        double result = 0; // 계산 결과를 저장할 변수

        // 입력된 연산자(operator)에 따라 계산 수행
        switch (operator) {
            case '+': // 덧셈
                result = num1 + num2;
                break;
            case '-': // 뺄셈
                result = num1 - num2;
                break;
            case '*': // 곱하기
                result = num1 * num2;
                break;
            case '/': // 나눗셈
                if (num2 != 0) { // 0으로 나누는 경우를 방지
                    result = num1 / num2;
                } else {
                    // 0으로 나누면 오류 메시지 출력 후 0반환
                    System.out.println("0으로 나눌 수 없습니다.");
                    return 0;
                }
                break;
            default:
                // 잘못된 연산자 입력 시 오류 메시지 출력 후 0 반환
                System.out.println("잘못된 연산자입니다.");
                return 0;
        }
        results.add(result); // 계산 결과를 리스트에 저장
        return result; // 계산 결과 반환
    }

    // 저장된 첫 번째 연산 결과를 삭제하는 메서드
    public void removeFirstCalculation() {
        if (!results.isEmpty()) { // 리스트에 값이 있는 경우만 실행
            List<Double> updatedResults = new ArrayList<>(results); // 현재 리스트 복사
            updatedResults.remove(0); // 복사한 리스트에서 첫 번째 결과 삭제
            setResults(updatedResults); // 삭제된 리스트를 다시 설정(세터 사용)
            System.out.println("연산 결과 삭제 완료.");
        } else {
            // 리스트가 비어 있을 경우 삭제할 데이터가 없다는 메시지 출력
            System.out.println("삭제할 결과가 없음");
        }
    }
}
App.java

package example.v2;

import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Scanner;

public class App {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 사용자 입력을 받기 위한 Scanner 객체 생성

        // 소수점 둘째 자리까지 표시(예 : 2.8577 → 2.85)
        DecimalFormat df = new DecimalFormat("0.00");
        df.setRoundingMode(RoundingMode.DOWN); // 반올림 방식: Down (버림)

        Calculator calc = new Calculator();// Calculator 객체 생성(연산 기능 사용)

        while (true) { // 계산기를 계속 실행하기 위해 무한 루프
            System.out.print("첫 번째 숫자를 입력하세요:");
            double num1 = sc.nextDouble();
            sc.nextLine();

            System.out.print("사칙연산의 기호를 입력하세요(+, -, *, /) : ");
            char operator = sc.next().charAt(0);
            sc.nextLine();

            System.out.print("두 번째 숫자를 입력하세요:");
            double num2 = sc.nextDouble();
            sc.nextLine();

            //Calculator클래스의 'calculate' 메서드 호출하여 연산 수행
            double result = calc.calculate(num1, num2, operator);

            // 연산 결과 소수점 둘째 자리까지 출력
            System.out.println("결과는 : " + df.format(result));

            while (true) {
                System.out.print("계산기 종료(exit 입력 시 종료, Yes 입력 시 계산 계속, remove 입력 시 첫 번째 결과 삭제) : ");
                String str = sc.nextLine();

                if (str.equalsIgnoreCase("exit")) {
                    System.out.print("계산 종료");
                    sc.close(); // scanner 닫기
                    return; // main 종료
                } else if (str.equalsIgnoreCase("remove")) { // remove 입력 시 첫 번째 연산 결과 삭제
                    calc.removeFirstCalculation(); // calculator 클래스의 'removeFirstCalculation' 메서드 호출
                    System.out.println("삭제 후 남은 연산 결과: " + calc.getResults()); // 삭제 후 남은 연산 결과 출력
                    break;
                } else if (str.equalsIgnoreCase("yes")) {
                    System.out.println("계산 계속");
                    break;
                } else {
                    System.out.println("다시 입력하세요"); // 잘못된 입력 시 다시 입력 요청
                }
            }
        }
    }
}

remove를 쓰면 첫 번째 기록을 삭제하고 남은 연산 결과 출력하는걸 볼 수 있다.

4개의 댓글

comment-user-thumbnail
2025년 3월 4일

검은 것은 글씨, 흰 것은 도화지라고 했었던가요? 검은 것이 보이지 않는 걸 보아하니 아직 가야할 길이 먼 듯 싶습니다. 오늘도 좋은 가르침 얻고 갑니다~

답글 달기
comment-user-thumbnail
2025년 3월 4일

오늘도 한 수 배우고 갑니다. 정말 좋은 정보 감사합니다 :)

답글 달기
comment-user-thumbnail
2025년 3월 5일

이게 바로 그 옛날옛적에 사용했다던 암호화된 문서인가요??

답글 달기
comment-user-thumbnail
2025년 3월 6일

나는 코딩벌레~ 어쩔 수 없네에~ 저기 Stack 무덤이 내~ RAM인 걸~
아무리 고쳐봐도오~ 에러~가 뜨으 네에~

답글 달기