본문 바로가기
Unreal/C++

[C++ 01.10]계좌 개설 클래스로 알아보는 enum 열거형, switch ~ case 문, while문

by 우타미 2025. 1. 10.
728x90

미리 못 박아두지만

이 글은 switch ~ case문, while문, enum을 알아보기 위한 글이다.(클래스는 거들뿐)

클래스를 알고 싶다면 뒤로 가기를 누르고 다른 블로그를 참고하시라 

 

 

1. switch ~ case문

여러 개의 상수 중 조건에 해당하는 하나를 골라 실행하는 switch ~ case 문에 대해 알아보자
일반적인 형식은

switch (조건식)

{
case 상수식 1:

실행문 1;

break;

case 상수식 2:

실행문 2;

break;
default:

실행문 3;

break;

}

이렇게 구성된다. 바로 예제코드를 확인해 보자

#include <iostream>

using namespace std;
int main(void)
{
    int rank = 2, m = 0; //2등급, m 점수는 0 선언과 동시에 초기화

	switch (rank) // rank의 값 확인
	{
	case 1: // rank 가 1이면 
		m = 100; // 점수는 100
		break;
	case 2: // rank 가 2이면 
		m = 90;// 점수는 90
		break;
	case 3:// rank 가 3이면 
		m = 80;// 점수는 80
		break;
	case 4:// rank 가 4이면 
		m = 70;// 점수는 70
		break;
	default:// rank 와 일치하는 값이 아닌 나머지
		m = 60; // 점수 60
		break;
	}

	cout << m; // 출력되는 값 90

    return 0;

학생 등급에 따라 점수를 주고 싶을 때 1등급은 100점 2등급은 90점... 5등급 이하는 전부 60점으로 채점한다는 가정하에
(조건식==상수식) 참이면 해당 case의 싱행문을 실행한 후 break를 통해 switch ~case문을 빠져나온다.

아래의 그림을 참고하면 더 쉽게 이해할 수 있을 듯하다. 

이처럼 case 1번의 조건 rank==1 이 맞지 않아 case 2로 넘어가 rank ==2를 충족하고 
실행문을 돌리고 break를 통해 빠져나와 출력을 하게 된다.

 

2. while문

일정 조건을 만족할 때까지 실행문을 반복하는 while문 

while (조건식)

{

실행문;

}

이렇게 구성되어 있다. 바로 예제코드를 확인해 보자

#include <iostream>

using namespace std;
int main(void)
{
    int a = 1; // a를 선언과 동시에 값 1로 초기화

    while (a < 10) // a가 10 보다 작을 때까지 반복문을 돌림
    {
        a *= 2; // a= a*2 a에 2를 곱해 다시 저장
    }

    cout << a; // 반복문이 종료된 후 a의 값은 16 출력됨

    return 0;
}
a <10 1회  (참/1) 2회 (참/1) 3회 (참/1) 4회 (참/1) 5회 (거짓 / 0)
a*=2 1 X 2 2X2 4X2 8X2 실행하지 않음
a 값 2 4 8 16 실행하지 않음

while 문이 도는 과정이다. 조건이 만족할 때까지만 돌기 때문에 4번만 돌고 16의 값을 출력하게 된다.

 

그럼 의문이 들 것이다. 계속 참이면 어떻게 되는가? 

무한하게 반복된다. 이를 무한반복문이라 한다. 이를 다루는 방법은 나중에 나올 계좌개설 클래스를 통해 설명하겠다.

3. enum 열거형

switch ~case를 공부하다가 조금 더 가독성 있는 코드를 위한 열거형이라는 것을 찾았다!

앞에서 우리는 case 가 1일 때 또는 2일 때 이렇게 만든 것을 기억하는가? 옆에 하나씩 주석을 달면 1이 뭐고 2가 무엇인지 알 수 있으나 코드로 직관적으로 알 수 있게끔 만드는 열거형을 사용해 보자 아래의 예시코드를 확인해 보자

#include <iostream>
using namespace std;

	enum animal {LION, DOG, CAT, RAT};// 열거형 선언 앞에서 부터 0,1,2,3
    
int main(void)
{
	int a, b;
	cin >> a; // a값 입력받기

	switch (a)
	{
	case LION: // 사자면 b는 5
		b = 5;
		break;
	case DOG: // 개면 4
		b = 4;
		break;
	case CAT: // 고양이는 3
		b = 3;
		break;
	case RAT: // 쥐는 2
		b = 2;
		break;
	}
	cout << b; //b값 출력
	return 0;
}

case다음엔 상수식이 오는 거 아닌가요?라고 묻는다면 맞다 저기에 있는 LION, DOG, CAT, RAT은 각각 0,1,2,3을 뜻한다.

열거형은 변수에 저장할 수 있는 정수 값을 기호로 정의해서 나열한다. 

enum 열거형 이름 {기호, 기호, 기호}

이렇게 선언을 한다. 컴파일러는 멤버를 0부터 1씩 증가해 큰 정수로 바꾼다. 
위의 예시처럼 아무런 값을 설정하지 않으면 자동은 0, 1, 2, 3... 이런 식으로 설정해줌

만약 enum animal {LION = 2, DOG, CAT, RAT =8} 이렇게 저장한다면 
LION =2, DOG =3, CAT =4 RAT=8의 값으로 설정된다.

이걸 사용하니 switch ~ case문이 좀 더 직관적으로 변하지 않았는가!!! 맘에 든다.

4. 계좌 개설 클래스

이 밑의 어마무시하게 긴 코드는 그냥 눈으로 읽어보면서 오늘 배운 switch ~case문, while문, enum열거형이 어떻게 쓰였는지 확인만 하는 코너이다. 

 

주요 포인트

 1. enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE , EXIT }; 

MAKE부터 1, 2, 3, 4, 5를 설정했다.

 2. while (1)

무한반복문인 while(1) 조건식이 항상 참(1)이라 프로그램 종료될 때까지 반복한다. 

 3. switch ~ case 문에 열거형으로 만든 기호를 넣어 가독성을 높였다.

 

전부 이해하지 않아도 된다. 아 그렇게 썼구나~ 정도만 이해가능하면 오케

//계좌 개설 프로그램
#include <iostream>
#include <cstring>
using namespace std;


void ShowMenu(void); //메뉴출력 함수
void MakeAccount(void); //계좌생성 함수
void DepositMoney(void); //입	금 함수
void WithdrawMoney(void); //출	금 함수
void ShowAllAccInfo(void); //잔액조회 함수

enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE , EXIT };



class Bank
{
public:
	int accID; //계좌번호
	int balance; //잔액
	string cusName;// 고객이름
};
Bank accArr[100];
int accNum = 0;

int main(void)
{
	int choce;

	while (1) //항상 돌아감
	{
		ShowMenu();
		cout << "선택: ";
		cin >> choce;
		cout << endl;
		switch (choce) // switch case 문
		{
		case MAKE:
			MakeAccount();
			break;
		case  DEPOSIT:
			DepositMoney();
			break;
		case WITHDRAW:
			WithdrawMoney();
			break;
		case INQUIRE:
			ShowAllAccInfo();
			break;
		case EXIT:
			cout << "[프로그램 종료]" << endl;
			return 0;
			break;
		default:
			cout << "illegal selection.." << endl;
		}
	}
	return 0;
}
void ShowMenu(void)
{
	cout << "----- Menu-----" << endl << "1. 계좌개설 " << endl << "2. 입금" << endl <<
		"3. 출금" << endl << "4. 계좌정보 전체 출력" << endl << "5. 프로그램 종료" << endl;
}
void MakeAccount(void)
{
	int id;
	string name;
	int balance;
	cout << "[계좌 개설]" << endl;
	cout << "계좌 ID: "; cin >> id;
	cout << "이름: "; cin >> name;
	cout << "입금액: "; cin >> balance;

	accArr[accNum].accID = id;
	accArr[accNum].balance = balance;
	accArr[accNum].cusName = name;
	accNum++;

}
void DepositMoney(void)
{
	int id;
	int money;

	cout << "[입	금]" << endl;
	cout << "계좌ID :" << endl; cin >>id;
	cout << "입금 금액 :"; cin >> money;
	for (int i = 0; i < accNum; i++)
	{
		if (accArr[i].accID == id)
		{
			accArr[i].balance +=money;
			cout << "입금완료" << endl;
			return;
		}
	}
	cout << "유효하지 않은 ID입니다." << endl;
}
void WithdrawMoney(void)
{
	int id;
	int money;

	cout << "[출	금]" << endl;
	cout << "계좌ID :" << endl; cin >> id;
	cout << "출금 금액 :"; cin >> money;
	for (int i = 0; i < accNum; i++)
	{
		if (accArr[i].accID == id)
		{
			if (accArr[i].balance < money)
			{
				cout << "잔액부족" << endl;
				return;
			}
			accArr[i].balance -= money;
			cout << "출금완료" << endl;
			return;
		}
	}
	cout << "유효하지 않은 ID입니다." << endl;
}
void ShowAllAccInfo(void)
{
	cout << "[계좌정보 전체 출력]" << endl;
	for (int i = 0; i < accNum; i++)
	{
		cout << "계좌ID : " << accArr[i].accID << endl;
		cout << "이	 름 : " << accArr[i].cusName << endl;
		cout << "잔	 액 : " << accArr[i].balance << endl;
	}
}

 

728x90