카테고리 없음

22년 3월 14일

hyrule 2022. 3. 17. 16:56

#include <iostream>

//오늘의 수업 내용: 열거체, Switch문

//TIP)프로그래밍에는 왕도가 없다. 무조건 해봐야 실력이 는다.
/*
* 가독성도 코드의 중요한 요소 중 하나이다.
* 열거체: enum. 사용자 정의 변수 타입을 만들어 줄 수 있는 기능중에 하나이다.


형태는 두 가지이다.
enum 원하는 이름 //옛날버전
{
};

enum class 원하는 이름 //최신버전
{
};

예제)버프 만들어보기
enum NUMBER
{
Number_1, //0
Number_2, //1
Number_3, //2
Number_4 //3
}
*/



enum ENUMBER //다른 변수와의 구별을 위해 앞에 E를 붙여주는 경우가 많다.
{
Number_1, //0
Number_2, //1
Number_3, //2
Number_4 //3 0부터 시작해서 순차적으로 저장됨.
};

enum class EBUF
{
Attack = 1, //이와 같이 원하는 값을 별도로 지정이 가능
Armor, //2
HP, //3
MP, //4
Critical //5 값을 따로 지정하지 않으면 마지막 값에서 하나씩 더해감.
};

enum class EJob
{
Knight =1,
Archer,
Magician
};

int main()
{

int Number = 100;

std::cout << Number_1 << std::endl;
std::cout << Number_2 << std::endl;
std::cout << Number_3 << std::endl;
std::cout << Number_4 << std::endl;

//enum문은 enum문의 이름 자체가 변수 타입이 된다.
//이렇게 선언된 변수는 해당 enum문의 값의 범위만을 가질 수 있다.
ENUMBER eNumber = Number_1;
std::cout << eNumber << std::endl;

//이런 방식으로 사용하는 것은 가능. 암시적 형변환이 된다.
Number = (ENUMBER)Number_2;

/*CF
* 형변환: 일시적으로 다ㅇ른 타입으로 변환해주는 것을 말한다.
명시적 형변환, 암시적 형변환 2가지의 형변환 방식이 있따.
* 명시적 형변환: 형변환 시키는 것을 정확하게 표기해 주어야 한다.
(int)이런 식으로 변환하고자 하는 타입으로 지정해주면 된다.
* 암시적 형변환: 컴파일러가 타입을 구분하여 해당 타입으로 자동으로 형변환 시켜주는 기능을 말한다.
주의)float 타입 변수의 형변환은 주의해야 한다.
*/

//float 타입과 int 타입의 암시적 형변환 주의 예시
float Number1 = 3.14f;
Number = Number1;
std::cout << "float 타입 3.14를 int형으로 암시적 형변환한 결과: " << Number << std::endl;
/*
* 1>\main.cpp(67,11): warning C4244: '=': 'float'에서 'int'(으)로 변환하면서 데이터가 손실될 수 있습니다.
* 위의 경우 float 타입 값을 int타입으로 암시적인 형변환이 일어나게 된다. 이때 float 타입에 들어가있는 값에서 소수점자리를 제거하고 정수부분만을 int에 대입해준다.
주의)실무에서는 코드에 warning이 절대 나오면 안된다!!
*/

//int Buf = Attack; //식별자 Attack이 정의되어 있지 않습니다.
//enum class는 열거체이름::원하는요소이름 으로 반드시 범위를 지정해서 접근해주어야 한다.

//int Buf = EBUF::Attack; //에러 뜸. Enum class는 암시적 형변환이 불가능하다.
int Buf = (int)EBUF::Attack;
//회사바다 예전 Enum 또는 Enum class 사용에 차이가 있다. 둘다 알아둘 것.

Buf = 0;
Buf |= (int)EBUF::Attack;
Buf |= (int)EBUF::HP;
Buf |= (int)EBUF::Critical;
//저번에 배웠듯이 이런 식으로 사용이 가능.

EBUF Buf1 = EBUF::Attack;
//Buf1 |= EBUF::HP; //enum 사이에서는 기본 연산이 지원되지 않는다. 위같이 대입은 가능.


/*
* switch문: 분기문의 한 종류이다.

switch ('변수')
{
case 체크하고자 하는 '상수':
원하는 코드
break;
case 체크하고자 하는 '상수':
break;
case 체크하고자 하는 '상수':
break;
case 체크하고자 하는 '상수':
break;
}

체크하고자 하는 상수의 값은 모두 달라야 한다.
변수의 값이 무엇인지를 체크해서 체크하고자 하는 상수에 변수의 값이 있다면 해당 case 밑의 코드가 동작이 된다.
break를 만나면 switch문을 빠져나간다.

*/
std::cout << "Input Number : ";
std::cin >> Number;

switch (Number)
{
case 1:
std::cout << "입력한 숫자는 1 입니다." << std::endl;
break;
case 2:
std::cout << "입력한 숫자는 2 입니다." << std::endl;
break;
case 3:
std::cout << "입력한 숫자는 3 입니다." << std::endl;
break;
case 4:
std::cout << "입력한 숫자는 4 입니다." << std::endl;
break;
default: // 위에서 체크되는 상수중에 값이 없다면 동작한다.(if문의 else와 같은 기능)
std::cout << "그 외의 숫자입니다." << std::endl;
break;
}


/*
switch문 배우기 전에 enum문을 배운 이유
switch문의 조건 판별문에는 상수가 들어가야 하는데,
enum은 '상수'이다.
*/
int Job = 0;
std::cout << "직업을 선택하세요." << std::endl;
std::cout << "1.전사" << std::endl;
std::cout << "2.궁수" << std::endl;
std::cout << "3.마법사" << std::endl;
std::cin >> Job;

switch ((EJob)Job)
{
case EJob::Knight:
std::cout << "기사를 선택했습니다." << std::endl;
break;
case EJob::Archer:
std::cout << "궁수를 선택했습니다." << std::endl;
break;
case EJob::Magician:
std::cout << "마법사를 선택했습니다." << std::endl;
break;
default:
break;
}
//break문이 없으면 switch문이 중단되지 않는다. 만약 break문이 없으면 다음 코드로 진행됨.
/*
* switch문 만드는 꿀팁
switch 치고 탭 누르면 자동완성됨.
그 상태에서 그대로 원하는 enum문의 이름을 적고, 탭 엔터를 누르면 자동으로 완성이 됨.
*/


//sizeof: 선언된 변수나 변수 타입의 바이트 수를 얻어오는 기능이다.
std::cout << "int Size : " << sizeof(int) << std::endl;
std::cout << "enum EJOB Size : " << sizeof(EJob) << std::endl;




/*
* 반복문: 특정 코드를 반복해서 수행할 때 사용한다.
for문, while문, do while문 3가지가 제공된다.

for (초기값; 조건식; 증감값)
{
반복해서 실행할 코드
}

초기값: for문으로 진입할 때 1번만 동작이 된다.
조건식: 매번 반복할 때마다 동작이 된다.
증감값: 매번 반복할 때마다 동작이 된다.

초기값 -> 조건식 -> true일 경우 코드실행 -> 증감값 ->
조건식 -> true일 경우 코드 실행 -> 증감값 -> 조건식 ->
....... -> 조건식 -> false일 경우 for문 종료
즉, for 문은 조건식이 false가 될 떄까지 계속 반복해서 실행한다.

cf)아래처럼 사용하면 무한반복을 한다.
for (;;)
{
}
*/
for (int i = 0; i < 10; ++i)
{
std::cout << "i : " << i << std::endl;
}

printf("\n");
//std::cout << "i : " << i << std::endl;
//cf)i 변수는 for문의 초기값에서 변수를 선언했다.(지역변수)
//이 경우에서는 i는 for문 안에서만 사용이 가능한 변수가 된다.
//for문 바깥에서도 사용하고 싶다면 for문 바깥에서 int i라고 선언을 해 주어야 한다.

//for문 안에서도 여러가지 구문을 사용할 수 있음.
//if, for, break, continue
//예제 - 짝수 또는 홀수만 출력하기
for (int i = 0; i < 100; ++i)
{
if (i % 2 == 0)
std::cout << "i : " << i << std::endl;
}

for (int i = 0; i < 100; ++i)
{
if (i % 2 == 0)
continue; //continue를 만나면 증감값 코드로 바로 이동한다.
std::cout << "i : " << i << std::endl;
}


//break를 활용한 원하는 값 까지만 출력하기.
std::cout << "Break Number : ";
std::cin >> Number;

for (int i = 0; i < 100; ++i)
{
if (i == Number)
break;

std::cout << "i : " << i << std::endl;
}


return 0;
}