John's Code Journey

[TIL] 250305 계산기 과제 리뷰 본문

Today I Learned/스파르타 내일배움캠프

[TIL] 250305 계산기 과제 리뷰

Johnnnn 2025. 3. 5. 22:16
728x90

어제는 예비군 훈련을 다녀와서 공가 처리를 받았다. 올해 3번을 더 가야 하다니 절망적이다...

 

오늘은 아침에 코드카타 알고리즘과 sql 문제를 몇 문제 풀었다. 

 

오랜만에 sql문을 봐서 기억이 잘 안 나서 강의를 돌려 가며 풀었다.

 

계산기 과제 리뷰와 트러블슈팅을 해볼 것이다. 

 

level 1 트러블슈팅

while (true) {
            System.out.print("첫 번째 숫자를 입력하세요 (종료하려면 'exit'을 입력하세요): ");
            String input1 = scanner.nextLine();
            //equalsIgnoreCase() 대소문자를 구별하지 않고 문자열을 비교하는 메서드
            if (input1.equalsIgnoreCase(exit)) {
                System.out.println("계산기를 종료합니다.");
                break;

            }
            int n1 = Integer.parseInt(input1);
            // 문자열을 정수로 변환

 

위의 코드에 문자열을 비교하는 equalsIgnoreCase() 사용되었는데 처음에는 그냥 equals() 함수를 사용했었는데 사용자가 실수로 대문자로 입력했을 경우도 있을 것이라 생각해서 문자열 비교하는 함수를 찾다가 알게 된 equalsIgnoreCase(), compareIgnoreCase()를 사용해서 코드르 짰다.

 

그리고 원욱 튜터님께서 변수 이름을 누가 봐도 알아볼 수 있게 적어주는 것이 좋다고 하셨다.

위 코드에 첫번째 숫자를 변수에 담아주는 n1을 firstNumber 라고 하거나 길어도 괜찮으니까 코드를 이해하기 쉽게 변수명을 선언하는 것이 좋다고 강조하셨고, while문을 true로 하는 것보다 boolean 변수를 flag라고 만들어서 whlie(flag) 로 사용하는 방법을 추천해 주셨다. 

boolean flag = true;

while (flag) {
    // 반복문 내에서 처리할 작업

    // 종료 조건이 맞으면 flag를 false로 설정
    if (어떤조건) {
        flag = false; // flag가 false로 바뀌면 while문 종료
    }
}

 

이 방식은 반복문을 종료할 조건을 반복문 내부에서 동적으로 결정할 수 있기 때문에 유용하다.

예를 들어, 사용자가 입력을 할 때까지 반복하거나, 특정 연산이 완료될 때까지 반복할 때 flag를 사용해 종료 조건을 처리할 수 있다.

이 방식은 while(true)로 무한 루프를 만들고, 루프 내에서 break 문으로 탈출하는 방법과 유사합니다.

하지만 flag 변수를 명시적으로 사용함으로써 코드의 의도를 더 명확하게 나타낼 수 있습니다 !

break를 사용한 방식은 종료 조건이 어디서 나오는지 한눈에 보기가 어려울 수 있는데, flag를 사용하면 종료 조건을 관리하는 부분이 명확해지기 때문입니다.

 

숫자를 받아 주는 변수를 기본형 int로 받아주었는데 나누기 연산을 위해 double형으로 변수를 선언했으면 더 좋았을 거 같다.

 

계산기 level 1 코드 -> https://thisisjohn.tistory.com/36

 

[JAVA] 계산기 과제 Lv 1

package calculatorlevel1;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String exit = "exit"; while (true) { System.out.print("첫 번째 숫자를 입력하세요 (종료하

thisisjohn.tistory.com

 

level 2 트러블슈팅

 

public double divide(double num1, double num2) {
        if (num2 == 0) {
            System.out.println("분모는 0일 수 없습니다. 다른 값을 입력해주세요.");
            return Double.NaN;
        }
        double result = num1 / num2;
        results.add(result);
        return result;
    }

 

위 코드는 Calculator 클래스에서 나누기를 담당하는 메서드이다.

지피티를 참고하면서 코드를 작성했는데 처음 보는 return Double.NaN; 이라는 코드를 처음 봐서 찾아봤는데 Double 클래스에 제공하는 상수로 Not a Number의 약자로 숫자가 아닌 값을 나타내는 특별한 값입니다.

따라서 Double.NaN은 값 자체를 의미하며, 함수가 아니라 Double 클래스의 정적인 값입니다.

이 값은 나누기에서 오류가 발생했을 때 반환하거나, 계산 결과가 숫자가 아닐 때 사용됩니다.

 

ex)

double result = 0.0 / 0.0;  // 이 경우 result는 NaN이 됩니다.
System.out.println(result);  // 출력: NaN

 

 

 

public class Calculator {
    /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
    private List<Double> results = new ArrayList<>();

위 코드는 Calculator 클래스에 필드를 컬렉션 타입으로 선언한 것이다. 레벨2 과제의 조건으로 컬렉션 타입 필드 선언이 있었는데 왜 컬렉션으로 써야 되는지 의문점이 생겨서 컬렉션 타입으로 필드를 선언했을 경우의 장점을 찾아보았다.

 

필드를 컬렉션 List로 사용 시 장점

1. 여러 결과를 저장하고 관리할 수 있음

컬렉션 타입을 사용하면 여러 개의 연산 결과를 저장할 수 있습니다. 예를 들어, 덧셈, 뺄셈, 곱셈, 나눗셈 등 다양한 연산을 진행하면서 그 결과를 하나의 리스트에 저장해 두고, 나중에 추후 사용할 수 있습니다. 컬렉션을 사용하면 여러 값을 순차적으로 저장하고 관리하는 것이 가능합니다.

 

2. 연산 결과 목록을 추적하고 기록하기 위해

프로그램을 통해 수행된 모든 계산 결과를 추적하고 기록하는 것이 중요할 수 있습니다. 예를 들어, 디버깅하거나 검토할 때, 각 계산에서 나온 결과를 확인할 수 있는 기능이 유용하다.

 

3. 추가 기능을 구현할 수 있는 기반

results 컬렉션을 사용하면 추가적인 기능을 손쉽게 구현할 수 있습니다. 예를 들어, 최근에 수행한 연산 결과를 삭제하거나, 특정 조건에 맞는 결과를 찾거나, 연산의 통계를 낼 수 있습니다.

 

4. 유연성과 확장성

리스트는 동적 크기 조정이 가능하므로, 연산 결과의 개수가 변경되더라도 문제가 없습니다. 예를 들어, 계산기 기능이 확장되어 더 많은 연산을 처리해야 할 경우, results 컬렉션을 사용하는 방법은 유연하고 확장 가능한 방법입니다.

(실제 개발에서 매우 유용한 패턴이라고 함)

 

// 연산 결과 목록에서 가장 먼저 저장된 데이터를 삭제
    public void removeFirstResult() {
        if (!results.isEmpty()) {
            results.remove(0);
            System.out.println("가장 첫 번째 연산 결과를 삭제했습니다.");
        } else {
            System.out.println("삭제할 연산 결과가 없습니다.");
        }
    }

 

Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현하는 것도 과제의 조건이어서 위 코드 같이 remove(인덱스 번호)를 가지고 삭제하는 코드를 작성했다. 첫 번째 저장된 데이터를 삭제해야 되기에 리스트 컬렉션이 비어있는 상태면 안되기에 If(!results.isEmpty()) 로 코드를 작성해줬다. 

 

isEmpty()와 isBlank() 메서드 비교

 

1. isEmpty() 메서드

  • isEmpty() 메서드는 문자열의 길이가 0인지 확인합니다.
  • 공백 문자(예: 띄어쓰기, 탭 등)도 포함된 문자열이라면 길이가 0이 아니므로 false를 반환합니다.

동작방식:

  • 문자열이 빈 문자열인 경우 ("")만 true를 반환하고, 그 외의 경우에는 false를 반환합니다.
String str1 = "";
String str2 = " ";
String str3 = "Hello";

System.out.println(str1.isEmpty());  // true
System.out.println(str2.isEmpty());  // false (공백이 포함된 문자열은 비어있지 않음)
System.out.println(str3.isEmpty());  // false (내용이 있으므로 비어있지 않음)

 

 

2. isBlank() 메서드

  • isBlank() 메서드는 문자열이 비어있거나 공백 문자만 포함되어 있는지 확인합니다.
  • 즉, 문자열이 빈 문자열이거나 공백, 탭, 줄 바꿈 등만 포함된 경우 true를 반환합니다.

동작방식:

  • 문자열이 빈 문자열("")이거나 공백 문자만 포함된 경우에 true를 반환하고, 그 외의 경우에는 false를 반환합니다.
String str1 = "";
String str2 = " ";
String str3 = "Hello";

System.out.println(str1.isBlank());  // true
System.out.println(str2.isBlank());  // true (공백만 포함된 문자열은 비어있는 것과 같음)
System.out.println(str3.isBlank());  // false (내용이 있으므로 공백만이 아님)

 

결론

 

isEmpty(): 문자열이 빈 문자열인지 확인할 때 사용합니다.

예를 들어, 사용자가 입력한 텍스트 필드가 비어 있는지 확인할 때 유용합니다.

isBlank(): 문자열이 공백만 포함되어 있는지 확인할 때 사용합니다.

사용자가 입력한 텍스트가 의미 없는 공백만으로 이루어져 있는지 확인할 때 유용합니다

따라서, 특정 문자열이 공백만 포함된 경우에도 빈 문자열로 간주하고 싶다면 isBlank()를 사용하는 것이 적합합니다.

 

계산기 level 2 코드 -> https://thisisjohn.tistory.com/38

 

[JAVA] 계산기 과제 Lv 2

package calculatorlevel2;import java.util.ArrayList;import java.util.List;public class Calculator { /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */ private List results = new ArrayList(); // 사칙연산 메서드들 public do

thisisjohn.tistory.com

 

트러블슈팅 어떻게 작성하는지 잘 모르겠다..... 새롭게 알게 된 사실만 적은 느낌이다...

레벨 3까지 구현하지 못해서 조금 아쉽다. 다음 과제에는 더욱 발전된 코드와 트러블슈팅을 작성할 수 있기를..!

 

'Today I Learned > 스파르타 내일배움캠프' 카테고리의 다른 글

[TIL] 계산기 과제 수정  (1) 2025.03.11
[TIL] JAVA 컬렉션 프레임워크  (1) 2025.03.10
[TIL] 예외처리(Exception)  (0) 2025.02.26
[TIL] 250225  (1) 2025.02.25
[TIL] 250224  (1) 2025.02.24