Java에서 클래스를 활용한 계산기와 클래스를 사용하지 않는 계산기를 구현하는 과제를 수행했다.
과제 수행 목적
- 클래스를 활용한 계산기: 이 버전에서는 자바의 객체 지향 원칙을 적용하여 클래스를 정의하고, 연산을 수행하는 메소드를 작성해야 한다. 이 과정에서 클래스와 객체의 개념을 이해하고 활용하는 방법을 익힐 수 있다.
- 클래스를 사용하지 않는 계산기: 이 버전에서는 클래스 없이 자바의 기본 문법만을 사용하여 계산기를 구현한다. 변수와 메소드를 이용하여 연산을 수행하는 과정에서 자바의 절차적 프로그래밍을 경험할 수 있다.
핵심 목표는 자바 문법의 실습과 객체 지향 개념의 적용이다.
과제 구현 범위
Lv.1 클래스 없이 기본적인 연산을 수행하는 계산기 만들기
- 양의 정수(0 포함)를 입력받고 int 타입으로 선언한 변수에 저장
- 사칙 연산 기호(+,-,*,/) 입력받고 char 타입으로 선헌한 변수에 저장 : charAt(0)
- 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행하고 결과값 출력 : if switch
- 연산 오류 - "나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없다."는 내용 출력
- 반목문을 사용하여 계산이 무한 반복 기능 구현 : for while
- "exit" 문자열을 입력하면 계산 반복이 종료되는 기능 구현 : break
가장 처음 구현한 코드
package com.example.calculator;
import java.util.Scanner;
public class CalculatorExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 양의 정수를 입력받고 int 타입의 변수에 저장
System.out.println("첫 번째 숫자를 입력하세요 : ");
int firstNumber = sc.nextInt();
System.out.println("두 번째 숫자를 입력하세요 : ");
int secondNumber = sc.nextInt();
System.out.println("사칙연산 기호를 입력하세요 (+, -, *, /) : ");
// 샤칙연산 기호를 적합한 타입으로 선언한 변수에 저장
char operator = sc.next().charAt(0);
// 입력 받은 문자열에서 첫 번째 문자만 추출하여 char 타입으로 저장
int answer = 0;
// 연산 결과를 저장할 변수 선언
if (operator == '+') {
answer = firstNumber + secondNumber;
} else if(operator == '-') {
answer = firstNumber - secondNumber;
} else if(operator == '*') {
answer = firstNumber * secondNumber;
} else if (operator == '/') {
if (secondNumber != 0) {
answer = firstNumber / secondNumber;
} else {
System.out.println("0으로 나눌 수 없습니다.");
sc.close();
return;
}
} else {
System.out.println("올바른 사칙연산 기호가 아닙니다.");
sc.close();
return;
}
System.out.println("연산 결과: " + answer);
// 연산 결과 출력
sc.close();
// Scanner 객체 닫기
}
}
}
}
사칙 연산 기능을 추가하고 연산 결과를 출력할 수 있다.
나눗셈 연산에서 두번째 정수가 0일 경우, "0으로 나눌 수 없습니다." 를 출력한다.
이런 식으로 구현하여 아래와 같은 코드로 Lv.1 기능을 구현하였다.
package com.example.calculator;
import java.util.Scanner;
public class CalculatorExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 양의 정수를 입력받고 int 타입의 변수에 저장
while (true) {
System.out.println("첫 번째 숫자를 입력하세요 : ");
int firstNumber = sc.nextInt();
System.out.println("두 번째 숫자를 입력하세요 : ");
int secondNumber = sc.nextInt();
System.out.println("사칙연산 기호를 입력하세요 (+, -, *, /) : ");
// 샤칙연산 기호를 적합한 타입으로 선언한 변수에 저장
char operator = sc.next().charAt(0);
// 입력 받은 문자열에서 첫 번째 문자만 추출하여 char 타입으로 저장
int answer = 0;
// 연산 결과를 저장할 변수 선언
if (operator == '+') {
answer = firstNumber + secondNumber;
} else if (operator == '-') {
answer = firstNumber - secondNumber;
} else if (operator == '*') {
answer = firstNumber * secondNumber;
} else if (operator == '/') {
if (secondNumber != 0) {
answer = firstNumber / secondNumber;
} else {
System.out.println("0으로 나눌 수 없습니다.");
sc.close();
return;
}
} else {
System.out.println("올바른 사칙연산 기호가 아닙니다.");
sc.close();
return;
}
System.out.println("연산 결과: " + answer);
// 연산 결과 출력
System.out.println("더 계산하시겠습니까? (exit 입력시 종료)");
String exitCommand = sc.next();
if ("exit".equals(exitCommand)) {
break;
}
}
sc.close();
System.out.println("계산기를 종료합니다.");
}
}
트러블 슈팅
1. 배경
사칙 연산 중 나눗셈 기능을 테스트하였다.
2. 발단
첫 번째 숫자 int firstNumber 에 100을 입력받고,
두 번째 정수(분모) int secoundNumber에 0을 입력받아서 나누기 연산을 실행할 때 연산결과가 0이 나오는 것을 발견했다.
3. 전개
두 번째 숫자 secoundNumber에 0을 입력 받는 경우,
"0으로 나눌 수 없습니다"라는 문자열을 출력하면서 프로그램이 종료되도록 구현하였다.
4. 위기
만약 사용자가 나누기 기능에 0을 입력하면 프로그램을 재실행해야하는 번거로움이 발생한다.
또한 잘못된 사칙연산자를 입력한 경우 처음에는 연산결과가 0이 나왔다.
0으로 나누는 경우와 동일하게 수정하여 "올바른 사칙연산 기호가 아닙니다."라는 문자열을 출력하게 수정하였다.
5. 절정
0으로 나눌 수 없는 경우 다시 돌아가서 첫 번째 숫자를 입력받는 것으로 돌아가야하는데, while문으로는 해결이 불가능하다.
do while문으로 먼저 연산을 실행한 다음, 조건을 충족하지 못하면 게산기를 끝내는 쪽으로 가고,
조건을 충족하는 경우에는 계속해서 계산을 할 수 있도록 구현하고 싶었는데,
이 부분의 적용이 어려워서 해결하지 못하였다.
6. 결말
좀 더 공부한 뒤에 do-while 반복문을 적용하여 나눗셈 연산자 이외에 올바르지 않은 사칙연산을 입력받았을 때도,
"올바른 사칙연산 기호가 아닙니다." 문자열을 출력한 뒤 다시 첫 번재 숫자를 입력 받는 곳으로 돌아가게 코드를 변경해야겠다.
Lv.2 클래스를 적용해 기본적인 연산을 수행하는 계산기 만들기
- 사칙 연산을 수행 후 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스 생성
- 사칙 연산을 수행 후 결과 값을 반환하는 메서드 구현
- 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스 생성
- Lv.1 에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정
연산 수행 : Calculator 클래스, 연산 결과 Calculator 클래스의 연산 결과를 저장하는 필드에 저장 - App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에
직접 접근하지 못하도록 수정 : 캡슐화 Getter : 필드에 접근해서 가져오기 Setter : 필드에 접근하여 수정 - Calculator 클래스에 저장된 연산 결과 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현 후
App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정
어려웠던 점.problem 회고.
현재 3번까지 진행한 상태이고, 클래스를 상속을 시키는 것은 구현하지 못하였다.
상속의 개념과 추상클래스, 인터페이스를 적용하는 부분이 어렵다. 100%까지 이해하지 못하였다.
github를 연동하는 것에도 문제가 많았다. intellij에서 github 계정을 연동하는 것은 성공했으나,
github 브라우저에서 repository를 생성하여 생성된 repository에
내가 짠 코드를 push하는 것에 오류가 생겨서, github 링크에 아무 코드도 push되지 않았다.
오류가 났던 방법.
1. 로그인 된 개인 github 브라우저에서 생성된 repository 의 링크를 복사해서 터미널에 복사 붙여넣기로 push하기
그랬더니, authentication faild for git이 뜨면서 개인 계정 로그인, 연동 실패 오류가 발생하였다.
해결한 방법.
2. 오른쪽 git에 push 누르고 아무 branch 클릭해서 push anyway를 클릭해서 push를 해준다!
둘다 push하는 방법인데, github에서 보안상의 문제로 1번 방법을 막아놓아서 2번 방법으로 push를 해준다.
중간에 시험으로 만들었던 브랜치를 삭제하고 삭제를 위해서는 삭제할 브랜치에서 벗어나야 한다.
브랜치 이동을 해준다. (git checkout & git switch)
main 브랜치를 잘못 만들어서 main을 삭제했고, 다시 main branch를 만들어줬다.
동일한 메뉴창에 New Branch 누르고 브랜치 명을 main으로 해주면, 현재 branch를 intellij가 알아서 복사해서 main branch로 만들어준다. creat!
협업할 때 dev 브랜치 생성하고 최종으로 배포할 때 main으로 합치기 때문에, dev 브랜치로 default 값을 지정하는 것이 좋다고 알게 되었다.
본 과제는 개인 과제라서 따로 dev 브랜치를 만들어주지 않았지만, 연습으로 만들어도 좋았을 것 같다.
또한 새로운 기능을 구현할 때마다 브랜치를 새로 만들어주는 게 좋은데,
버전이 달라지는 등(기능 업그레이드) 새로운 기능을 구현하는데도 계속 하나의 브랜치로 끌고 간 점이 아쉽다.
추가로, 수정 코드를 입력할 때마다 git commit을 해주는 것을 습관 들이면 좋겠다.
처음에 프로젝트 git 연동하는 것이 헷갈리는데 많이 해서 익숙해져야겠다.
추상클래스, 인터페이스의 개념은 알게 되었는데 실제 코드에 적용하는 부분이 많이 어렵게 느껴져서 Lv2 과제를 완료하지 못했고,
캡슐화 개념도 이해가 잘 안되서 다시 공부를 해야할 것 같다.
트러블슈팅에서 문제를 발견하고 해결하는 과정을 담고 싶었는데, 특별하게 복잡한 코드를 짠 것이 아니라
예를 들면
경로설정, 혹은 중괄호가 필요 이상 갯수를 초과하거나 부족한 경우에 생기는 오류들이 발생하였으나,
차근히 오류의 내용을 읽고 해결한 정도가 전부다.
마지막으로
Lv.1에서 구현한 기능중에서 연산과 관련이 없는 값이 들어오거나 나눗셈 연산에서 두번째 정수에 0이 들어왔을 때,
다시 첫번째 정수로 입력하는 문자열로 넘어가게 하고 싶은데 기능 구현을 못했다. 이 부분도 최대한 빨리 수정해야할 것 같다...
*과제 피드백 받은 후, 트러블 슈팅을 제외한 내용은 모두 KPT로 옮겨질 예정이다.
TIL 10월 16일
'TIL (ToDay I LearNEd) > K P T (keeP, pRoBlem, Try) & 트러블슈팅' 카테고리의 다른 글
뉴스피드 프로젝트_트러블 슈팅.TIL (0) | 2024.11.21 |
---|---|
순환 참조란? Circular Dependency (일정 관리 앱 서버 DEVELOP 트러블 슈팅) (1) | 2024.11.15 |
일정 관리 앱 서버 만들기_트러블 슈팅.TIL (1) | 2024.11.08 |
숫자 야구 게임_트러블 슈팅.TIL (0) | 2024.10.24 |
[KPT] 첫 미니 프로젝트 (0) | 2024.10.07 |