
먼저 연산 결과를 저장하는 컬렉션 타입 필드를 가진 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를 쓰면 첫 번째 기록을 삭제하고 남은 연산 결과 출력하는걸 볼 수 있다.
검은 것은 글씨, 흰 것은 도화지라고 했었던가요? 검은 것이 보이지 않는 걸 보아하니 아직 가야할 길이 먼 듯 싶습니다. 오늘도 좋은 가르침 얻고 갑니다~