Troubleshooting: 무엇이 문제였는가?/본캠프 2주 차: 계산기 만들기

2단계: 비교 연산자(==) vs equals()

writingforever162 2024. 11. 19. 14:32

[문제]

package com.project.personal.calculator;

// [1] Calculator 클래스 제작
public class Calculator {

    public Calculator() {
    }

    public int calculate(int numOne, String operator, int numTwo) {
        if (operator == "+") {
            return numOne + numTwo;
        } else if (operator == "-") {
            return numOne - numTwo;
        } else if (operator == "*") {
            return numOne * numTwo;
        } else if (operator == "/") {
            return numOne / numTwo;
        } else {
            return 0;
        }
    }
}
package com.project.personal.calculator;

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

        // [2] Main.java에서 생성자로 객체 test 생성
        Calculator test = new Calculator();

        // [3] calculate 메서드 사용 및 출력
        System.out.println(test.calculate(5, "+", 2));
    }
}

객체를 생성해서 프로그램을 실행하면 값은 잘 출력되는데, 비교 연산자(==)마다 생긴 노란 줄이 영 신경쓰였다.

마우스 커서(cursor)를 노란 줄에 대 보니 위와 같은 경고가 떴다. equal() 메서드는 이미 몇 번 사용해서 알았으나, 언제 비교 연산자를 쓰고 언제 메서드를 써야 할지 헷갈렸다. 프로그램이 작동하긴 하는데 찝찝한 기분이 들었달까. 이럴 때 확실하게 짚고 넘어가야 더 큰 실수를 하지 않을 듯해서 튜터님을 찾아갔다.  

 

[원인] 

package com.project.personal.calculator;
public class Calculator {

    public Calculator() {
    }

    public int calculate(int numOne, String operator, int numTwo) {
        if (operator == "+") {
            // [오답] operator == "+"
            // [정답] operator.equals("+")
            return numOne + numTwo;
        } else if (operator == "-") {
            // [오답] operator == "-"
            // [정답] operator.equals("-")
            return numOne - numTwo;
        } else if (operator == "*") {
            // [오답] operator == "*"
            // [정답] operator.equals("*")
            return numOne * numTwo;
        } else if (operator == "/") {
            // [오답] operator == "/"
            // [정답] operator.equals("/")
            return numOne / numTwo;
        } else {
            return 0;
        }
    }
}

역시 원인은 equals() 메서드를 사용하지 않은 탓이었다. 정확히는 비교 연산자(==)와 equals() 메서드를 제대로 구분하지 못해서 경고가 떴다. 

 

(1) 비교 연산자: 동일성, 즉 메모리의 주솟값이 동일한지 비교할 때 사용

(2) equals(): 동등성, 즉. 메모리에 저장된 값이 동등한지 비교할 때 사용 

(3) 만약 비교 연산자를 사용해서 객체와 객체를 비교하면, 각 객체의 주솟값을 비교하므로 오류가 발생할 수 있다.

 

[해결]

package com.project.personal.calculator;

public class Calculator {

    public Calculator() {
    }

    public int calculate(int numOne, String operator, int numTwo) {
        if (operator.equals("+")) {
            return numOne + numTwo;
        } else if (operator.equals("-")) {
            return numOne - numTwo;
        } else if (operator.equals("*")) {
            return numOne * numTwo;
        } else if (operator.equals("/")) {
            return numOne / numTwo;
        } else {
            return 0;
        }
    }
}

노란 줄이 사라져서 마음이 편해졌다. 노란 줄은 경고(warning)를, 빨간 줄은 오류(error)를 의미하는데 튜터님의 설명에 따르면 빨간 줄이 떴을 때 감사해야 했다. 오류가 발생하면 프로그램이 작동하지 않고 안 되는 부분을 알려주는데, 경고는 오류가 아니라서 프로그램이 작동하기 때문이다. 나중에 문제가 발생하면 일일이 코드를 뜯어봐야 했다.

 

헷갈릴 때 느껴지는 그 미묘한 찝찝함이 파도에 쓸려나가듯 말끔히 사라져서 기분이 좋았다. 

 

[결과 수치화]

[수정 전] 자바(Java) 인텔리제이(IntelliJ) 노란 줄 경고 표시 4개 발생

[수정 후] 자바(Java) 인텔리제이(IntelliJ) 노란 줄 경고 표시 0개 발생