오늘 정리할 내용은 클래스를 복습하는 차원에서 풀었던 사칙연산 계산기 코드다. 클래스의 복습이기 때문에 조건이 까다로웠다. 그럼 바로 조건 부터 만나보자.
1. 클래스 상속, 정적 멤버, 업 캐스팅, 가상 함수를 사용하는 계산기
2. 연산이 종료되면 연산을 계속할 것인지 물어보고 이때, Y를 입력하면 도출된 결과를 이용한 후속 계산을 진행하고 AC를 입력하면 이전기록을 초기화 하고 EXIT를 입력하면 프로그램이 종료되는 코드를 추가하라.
위의 2가지 조건을 충족하는 것이 생각보다 까다로웠다. 그럼에도 완성! 코드 먼저 보고 넘어가도록 하자.
#include <iostream>
using std::cout;
using std::cin;
using std::string;
using std::endl;
static double result;
static int cnt = 0;
class Operator{
protected:
string text;
bool next = false;
double num1 = 0.0, num2 = 0.0;
public:
Operator(double num1, double num2){
this -> num1 = num1;
this -> num2 = num2;
}
void Result(){
cout << "----------------------------------------------------------------------------" << endl;
cout << "결과값 : " << result << endl;
cout << "----------------------------------------------------------------------------" << endl;
}
virtual double calc(){ //가상 함수를 쓰면 다운캐스트를 하지 않아도 자식 클래스의 메소드 사용 가능하다(물론 원형이 같은 메소드에 해당).
return result;
}
};
class Add : public Operator{
public:
Add(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 + num2;
return result;
}
};
class Minus : public Operator{
public:
Minus(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 - num2;
return result;
}
};
class Multiply : public Operator{
public:
Multiply(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 * num2;
return result;
}
};
class Divide : public Operator{
public:
Divide(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 / num2;
return result;
}
};
int main(){
//while문을 만들어 숫자와 연산자를 입력 받고 결과 값을 출력하는 걸 만들 것이다.
double num1 = 1.0, num2 = 2.0, result = 0.0, result2 = 1.0;
int cnt = 0;
string text;
char operat;
bool next = false;
// Operator op = Operator(result, false);
Operator* cal;
cout << "----------------------------------------------------------------------------" << endl;
cout << "척척 학사가 만든 척척 계산기" << endl;
while(!next){
cout << "----------------------------------------------------------------------------" << endl;
//operat = cal->memo();
if(result != result2){
cout << "숫자를 입력해주세요 : ";
cin >> num1;
cout << endl;
cout << "연산자를 입력해주세요 : ";
cin >> operat; //text에 들어오는 연산자에 대응하는 클래스 소환할 것
cout << endl;
if(operat == '+' || operat == '-' || operat == '*' || operat == '/'){
cout << "숫자를 입력해주세요 : ";
cin >> num2;
cout << endl;
cnt++;
}
else cout << "잘못 입력하셨습니다. 다시 입력해주세요" << endl;
}
else if(result == result2){
//Add Minus Multiply Divide
cout << "연산자를 입력해주세요 : ";
cin >> operat; //text에 들어오는 연산자에 대응하는 클래스 소환할 것
cout << endl;
if(operat == '+' || operat == '-' || operat == '*' || operat == '/'){
cout << "숫자를 입력해주세요 : ";
cin >> num2;
cout << endl;
cnt++;
}
else cout << "잘못 입력하셨습니다. 다시 입력해주세요" << endl;
// cout << "숫자를 입력해주세요 : ";
// cin >> num2;
// cout << endl;
}
if(operat == '+'){
cal = new Add(num1, num2);
}
else if(operat == '-'){
cal = new Minus(num1, num2);
}
else if(operat == '*'){
cal = new Multiply(num1, num2);
}
else if(operat == '/'){
cal = new Divide(num1, num2);
}
result = cal->calc();
cal->Result();
result2 = result;
cout << "연산을 게속 하시겠습니까? (Y: 계속, AC: 초기화, EXIT: 종료) : ";;
cin >> text;
cout << endl;
if(text == "Y" || text == "y"){
result2 = result;
}
else if(text == "AC" || text == "ac"){
num1 = 1.0;
num2 = 2.0;
result = 0.0;
result2 = 1.0;
cout << "값이 초기화 되었습니다" << endl;
}
else if(text == "EXIT" || text == "exit"){
next = true;
cout << "프로그램을 종료합니다" << endl;
}
num1 = result;
}
cout << "총 " << cnt << " 회 계산하셨습니다!" << endl;
return 0;
}
먼저 상속 부분을 살펴보면, 나는 나눴을 때 소수점 이하도 남겨두고 싶어서 double 자료형으로 변수 num1, num2를 선언하고 초기화 해줬다. 그러고 나서 가상함수 double calc(){}를 만들었다. 그 후에 클래스 Operator를 상속받는 클래스 Add, Minus, Multiply, Divide를 선언해줬다.
class Operator{
protected:
string text;
bool next = false;
double num1 = 0.0, num2 = 0.0;
public:
Operator(double num1, double num2){
this -> num1 = num1;
this -> num2 = num2;
}
void Result(){
cout << "----------------------------------------------------------------------------" << endl;
cout << "결과값 : " << result << endl;
cout << "----------------------------------------------------------------------------" << endl;
}
virtual double calc(){ //가상 함수를 쓰면 다운캐스트를 하지 않아도 자식 클래스의 메소드 사용 가능하다(물론 원형이 같은 메소드에 해당).
return result;
}
};
class Add : public Operator{
public:
Add(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 + num2;
return result;
}
};
class Minus : public Operator{
public:
Minus(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 - num2;
return result;
}
};
class Multiply : public Operator{
public:
Multiply(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 * num2;
return result;
}
};
class Divide : public Operator{
public:
Divide(double num1, double num2) : Operator(num1,num2){
}
double calc(){
result = num1 / num2;
return result;
}
};
이제 부모 클래스인 Operator 클래스를 통해 업 캐스팅하는 과정이 남았다.
Operator* cal; //업캐스팅
cal = new Add(num1, num2); //동적바인딩
cal = new Minus(num1, num2); //동적바인딩
cal = new Multiply(num1, num2); //동적바인딩
cal = new Divide(num1, num2); //동적바인딩
result = cal->calc(); //업캐스팅한 cal을 활용하는 코드
cal->Result();
마지막으로 정적 멤버 result와 cnt를 사용해서 각각 결과 값과 계산 횟수를 저장해줬다.
static double result;
static int cnt = 0;
이런 과정을 거쳐서 탄생한 코드가 바로 오늘 정리한 클래스를 활용한 사칙연산 계산기 코드이다. 결과 출력 화면은 아래와 같다.
벌써 3주차 마지막 수업이 끝났다. C++에 골머리 썩히기 시작한지 3주가 지났다니... 시간 참 빠르다. 4주차 부터는 데이터 베이스에 대해 학습하기 때문에 마지막 수업에서는 여태까지 학습한 프로젝트를 본인이 발표하면서 직접 해설하고 다른 수강생들은 어떤 풀이를 했는지 알아보는 시간을 가졌다. 스스로의 실력을 돌아보며 '나는 얼마나 성장했는가' 생각해볼 수 있었던 유익한 시간이었다. 다음주에 새로 배우는 데이터 베이스에 대한 궁금증과 기대를 안고 3주차 회고를 마친다.
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 6주차 회고 | MYSQL - JOIN (0) | 2023.05.01 |
---|---|
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 4주차 1~2일차 회고 | 데이터베이스 (2) | 2023.04.15 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 3주차 회고 | 31게임, 마방진 만들기 (0) | 2023.04.09 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 8일차 회고 | 클래스의 상속과 오버라이드 (0) | 2023.04.05 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 6,7일차 회고 | 파일 입출력, 구조체, 클래스 (0) | 2023.04.01 |