[문제]
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개 발생
'Troubleshooting: 무엇이 문제였는가? > 본캠프 2주 차: 계산기 만들기' 카테고리의 다른 글
2단계: "반복문 안에서 인스턴스화를 했다고요? 갑부시군요!" (0) | 2024.11.24 |
---|---|
2단계: 절차 지향 add() vs 객체 지향 add() (0) | 2024.11.20 |
2단계: 반환타입이 int라서 return "문자열"이 불가능할 때 (0) | 2024.11.19 |
2단계: sc.nextLine(); vs sc.next(); (0) | 2024.11.19 |