c++

20210709 연산자 축약형 ~ 조건문 feat enum문

TIN9 2021. 7. 10.
반응형

안녕하세요 틴구입니다~!!

오늘도 수업 들은 내용을 글로 써 보려고 합니다!!

한번 코드를 분석해 가면서 가 볼까요!!

연산자축약형

우선 어제 연산자에 대해 배웠었는데 오늘은 연산자 축약형에 대해 설명드리도록 하겠습니다.

연산자축약형이란 말 그대로 연산자를 줄여서 사용한다는 뜻입니다.

ex) int Number = 10;

이라고 가정을 했을 때

Number = Number + 5;

라고 식을 추가할 때

Number += 5; 이렇게 축약을 해서 사용할 수가 있습니다!

여기서

std::cout << "Number = " << Number << std::endl;

코드를 치게 되면 Number의 값을 확인할 수 있습니다.

 

한번 다른 코드를 쳐 볼까요

이번엔

Number = 3; 이라고 할 때

Number ^= 5;

라는 연산자축약형을 넣어볼게요

std:;cout << "Number = " << Number << std::endl;

를 치면

Number = 6이라고 나옵니다!

한번 맞는 결과인지 식을 계산해볼까요?

3을 2진수로 변경하면

3 / 2 = 1 --- 1       0b11이 나옵니다.

 

5를 2진수로 변경하면

5 / 2 = 2 ---- 1

2 / 2 = 1 --- 0       0b101이 나옵니다.

 

  101

^011

------

  110   =  6이 나오게 되네요!!

 

아 또 선생님께서 주의해야 할 연산자를 알려주셨는데 바로 나누기 연산자랍니다.

나누기 연산자의 경우 정수 / 정수를 하게 되면 소수점 자리는 사라지고 정수부 분만 남게 됩니다.

ex) Number = 11 / 3;

을 하게 됐을 때

std::cout << "Number = " << Number << std:;endl;

코드를 작성하여 값을 확인해 보면 3이라는 정수 값만이 나오게 됩니다.

여기서 결과를 실수로 나오게 하려면 두 개의 값 중 하나를 반드시 실수여야 합니다.

ex) float fNumber = 11 / 3.f

위의 식처럼 .f를 넣게 되면

std::cout << fNumber << std::endl;

결괏값이 3.33333이 나오게 된다.

또 실수를 정수에 대입할 경우 형변환이라는 것을 해야 합니다.

int iNumber = 0;

iNumber = 11 / 3.f;

를 하게 되면 warning이 뜨는 것을 확인할 수 있는데 이 warning 때문에 추후에 버그가 생길 수 있어 형변환을 해야 합니다.

iNumber = (int)(11 / 3.f);

이렇게 말이죠!

증감연산자

다음으로는 증감연산자에 대해서 알아볼 건데

증감연산자는 ++, -- 두 종류가 있습니다.

++ 는 1을 증가시킨다

-- 는 1을 감소시킨다라는 개념을 갖고 있는데

 

여기서 중요한 게 전치 연산이냐, 후치 연산이냐가 중요합니다.

전치 연산이란 : 변수 앞에 증감연산자를 부여하는 것을 의미하고 값을 먼저 1 증가 or 1 감소를 시키고 해당 연산을 진행합니다.

후치 연산이란 : 변수 뒤에 증감연산자를 부여하는 것을 의미하고 연산을 진행한 후 값을 1 증가 or 1 감소를 진행합니다.

iNumber = 10;이라고 가정했을 때

// 전치 연산
std::cout << "iNumber = " << ++iNumber << std::endl;
// 후치 연산
std::cout << "iNumber = " << iNumber++ << std::endl;
// 후치 연산으로 인한 결과 값
std::cout << "iNumber = " << iNumber << std::endl;

의 결과를 확인해보면

iNumber = 11

iNumber = 11

iNumber = 12

의 순서인 것을 확인할 수 있다.

처음에 전치 연산을 해서 iNumber += 1의 형태가 되어 11이 된 거고

두 번째 후치 연산의 경우에는 iNumber에 연산을 진행한 후 값을 증가시키기 때문에 그대로  11인 것을 확인할 수 있다.

마지막으로 iNumber의 경우는 아무것도 진행하지 않았지만 위에서 후치 연산을 진행했기 때문에

12로 바뀐 것을 볼 수 있다. 

삼항연산자

삼항연산자는 조건 ? 값1 : 값2의 형태로 사용이 된답니다.

앞의 조건이 true라면 값1의 형태가 되고 조건이 false면 값2가 되는 형태입니다.

ex) Number = 10; 이라고 값을 부여한 뒤

int Number1 = Number < 5 ? 15 : 30;

이렇게 식을 나열하고

std::cout << "Number1 = " << Number1 << std::endl;

의 코드를 치게 되면

Number1 = 30

가 나오게 됩니다.

Number라는 변수를 10이라고 정했는데 5보다 크니깐 false고

false가 되면 값 2에 해당하는 값을 얻기 때문에 Number1 = 30이 되는 방식입니다.

삼항연산자를 배우면서 sizeof라는 것도 배웠는데

이 sizeof는 해당 메모리의 크기를 알 수 있습니다.

ex) std::cout << "int변수의 크기 = " << sizeof(int) << std::endl;

이렇게 검색을 하면 결괏값이

int변수의 크기 = 4

로 나오는 것을 알 수 있습니다.

조건문

if문

조건문이란 특정한 조건을 측정하여 true인지 false인지에 따라서 특정한 동작을 할 것인지 판단할 때 사용합니다.

영어 if랑 비슷한 거 같아요 만약에 ~라면??

 

식의 구조는

if (조건)

{

    조건이 true일 때 동작되는 코드

}

로 구성되어 있습니다.

 

예로 저의 몸무게로 예시를 들어볼게요

int weight = 69; 저의 몸무게가 69kg이라고 가정을 했을 때 이걸 if변수로 표현을 해볼게요

 

if (weight < 70)

{

    std::cout << "내 몸무게는 70kg 이하다." << std::endl;

}

 

이런 식으로 작성을 하게 되면 괄호 안에 있는 조건식이 true가 되어

내 몸무게는 70kg 이하다.라고 출력이 되는 것을 확인할 수 있습니다.

또 조건식에서 {} 중괄호를 코드 블록이라고 하는데

이 코드 블록은 괄호 안에 있는 코드만을 인식해 그 코드를 동작시키는 블록입니다.

 

또 코드 블록에 있는 내용이 한 줄이라면 코드 블록을 생략할 수 있습니다.

ex)

if (weight < 70)

    std::cout << "내 몸무게는 70kg 이하다." << std::endl;

이런 식으로 사용할 수 있습니다.

 

또 if구문에는 else와 else if란게 있는데

우선 else부터 설명드릴게요

else의 경우에는 독단적으로 사용할 수 없는 구문이에요. 반드시 if와 함께 사용해야 합니다.

if 조건식이 true 일 때 코드 블록을 실행시킨다면 else 같은 경우는

if 조건식이 false 일 때 else의 코드 블록 코드를 실행시킨다고 생각하면 됩니다.

이번엔 else구문을 설명하기 위해 논리연산자를 이용해 퀴즈를 만들어 보겠습니다.

ex)

// 논리연산자를 이용한 if구문 활용

// AND연산자의 경우 둘 다 참일 경우에만 참이기 때문에 조건식이 true 이면 if 구문의 코드 블록을 실행시키고

// false라면 esle 구문의 코드 블록을 실행시킨다.

#include <iostream>


int main()
{
    int weight = 0;
    // 내 몸무게를 69이라고 가정
    weight = 69;
    // 코드 실행 시 처음에 나오는 문제 및 설명
    std::cout << "퀴즈 : 내 몸무게는 몇 kg 일까?" << std::endl;
    std::cout << "몸무게를 입력하세요." << std::endl;
    // 입력 변수를 만들기 위해 Number란 변수를 생성
    int Number;
    // cin을 이용해 숫자 입력
    std::cin >> Number;
    // 논리연산자를 활용한 if구문
    if ((68 < Number) && (Number < 70))
    {
        std::cout << "내 몸무게는 " << weight << " 이다." << std::endl;
    }
    else
    {
        std::cout << "틀렸습니다." << std::endl;
    }

return 0;
}

 

이렇게 코드를 작성하고 출력을 하면

 

퀴즈 : 내 몸무게는 몇 kg 일까?

몸무게를 입력하세요.라는 문구가 나오게 되고

(몸무게를 입력할 수 있다)

 

여기서 몸무게를 69를 입력을 하면 조건식이 둘 다 참이 되어 if구문으로 들어가

내 몸무게는 69kg이다. 가 출력이 되고

다른 숫자를 입력했을 경우 조건식이 false가 되어 else 구문의 코드 블록을 실행해서

틀렸습니다. 라는 문구가 나오게 된다.

 

다음은 else if란 것에 대해서 설명드리겠습니다

else if 도 마찬가지로 독립적으로 사용할 수 없고

if의 조건식이 false일 경우 else if의 조건식을 순차적으로 검사 후

그 조건식 중 true가 나오면 해당 코드 블록을 실행 후 종료하는 개념입니다.

 

위의 코드를 참고해서 하나 더 만들어볼게요.

#include <iostream>

 

int main()
{
    int weight = 0;
    // 내 몸무게를 69이라고 가정
    weight = 69;
    // 코드 실행 시 처음에 나오는 문제 및 설명
    std::cout << "퀴즈 : 내 몸무게는 몇 kg 일까?" << std::endl;
    std::cout << "몸무게를 입력하세요." << std::endl;
    // 입력 변수를 만들기 위해 Number란 변수를 생성
    int Number;
    // cin을 이용해 숫자 입력
    std::cin >> Number;
    // 논리연산자를 활용한 if구문
    if ((68 < Number) && (Number < 70))
    {
        std::cout << "내 몸무게는 " << weight << " 이다." << std::endl;
    }

    else if ((60 < Number) && (Number < 66))
    {
        std::cout << "조금 근접합니다." << std::endl;
    }

    else if ((65 < Number) && (Number < 69))
    {
        std::cout << "완전 근접합니다" << std::endl;
    }

    else if ((69 < Number) && (Number < 75))
    {
        std::cout << "완전 근접합니다" << std::endl;
    }

    else if ((74 < Number) && (Number < 80))
    {
        std::cout << "완전 근접합니다" << std::endl;
    }
    else
    {
        std::cout << "틀렸습니다." << std::endl;
    }

return 0;
}

 

뭔가 내용이 이상하긴 한데 어쨌든!! 이런 식으로 활용할 수가 있습니다!

switch문

if문에서는 조건식이 참인지 거짓인지를 판단해 동작을 시켰는데

switch문은 어떤 값인지를 판단해서 동작시킬 때 활용을 합니다.

switch문 형태는

switch(변수(값))

{

case 체크하고자하는 값(상수):

    break;

}

의 형태로 이루어져 있습니다.

 

여기서 중요한 게 case 뒤에 변수를 넣으면 안 된다는 점입니다.

무조건 상수를 넣어야 합니다.

 

예를 들어서

int Number = 1;

int Number1 = 5;

 

switch (Number1)

{

case Number: <-- 이렇게 사용할 수 없습니다.

    break;

}

 

또 여기서 중요한 게 있는데 case구문 끝나는 시점에 break; 가 없으면 해당 구문 이후의 구문까지 한 번에 출력이 된다

 

int Number1 = 4;  // 라고 가정했을 때

 

switch (Number1)
{
case 1:
    std::cout << "Number1 의 값은 1입니다." << std::endl;
    break;
case 2:
    std::cout << "Number1 의 값은 2입니다." << std::endl;
    break;
case 3:
    std::cout << "Number1 의 값은 3입니다." << std::endl;
    break;
// case 4: 구문 끝나는 시점에 break;가 없으면 그 뒤에 구문까지 출력이 된다.
case 4:
    std::cout << "Number1 의 값은 4입니다." << std::endl;
case 5:
    std::cout << "Number1 의 값은 5입니다." << std::endl;
    break;
}

이렇게 코드 구성을 하게 되면 switch의 조건의 값이 4이기 때문에

case 4: 의 구문의 코드를 수행하는데 마지막에  break; 가 없어

case 5:의 코드까지 수행을 하게 된다.

ex)

Number1 의 값은 4입니다.

Number1 의 값은 5입니다.

 

또 switch문에는 if문의 else처럼 default란게 있는데 이 default는

조건이 case 구문중에 하나도 없을 경우 default 코드 블록을 실행하게 된다.

 

int Number1 = 7

 

switch (Number1)
{
case 1:
    std::cout << "Number1 의 값은 1입니다." << std::endl;
    break;
case 2:
    std::cout << "Number1 의 값은 2입니다." << std::endl;
    break;
case 3:
    std::cout << "Number1 의 값은 3입니다." << std::endl;

    break;
default:
    std::cout << "체크할 수 없는 숫자입니다." << std::endl;

    break;
}

 

조건의 값이 7인데 case 구문에 7이란 상수값이 없기 때문에 default의 코드를 수행하여

체크할 수 없는 숫자입니다. 라는 문구가 나오게 된다.

 

열거체

switch문을 배우면서 열거체 타입이란 것도 배웠습니다!

열거체란 상수에 이름을 부여해줄 수 있는 문법입니다.

열거체의 코드 구성은

enum 원하는 열거체 이름

{

};

입니다

여기서 열거체 이름은 없어도 상관이 없다고 합니다
만약에 열거체 이름을 작성해준다면 열거체 이름은 해당 열거체의 변수 타입이 됩니다.
즉, 사용자가 변수 타입을 만들 수 있게 되는 것이라고 합니다.

선생님께서 직업을 활용해서 설명을 해주셔서 저도 직업으로 한번 만들어 보겠습니다


#include <iostream>

// 가독성을 위해서 std::를 생략하겠습니다.
using namespace std;
// enum을 활용해 JOB종류 구성.
enum JOB
{
    JOB_NONE,         // 0   
    JOB_KNIGHT,       // 1
    JOB_ARCHER,       // 2
    JOB_MAGICION,     // 3
    JOB_ASSASSIN      // 4
};

int main()
{

// cout을 활용한 직업 선택 멘트 구성
    cout << "직업을 선택해주세요" << endl;
    cout << "1. 나이트" << endl;
    cout << "2. 아쳐" << endl;
    cout << "3. 매지션" << endl;
    cout << "4. 어쌔신" << endl;
// 스위치 값을 선택하기 위한 인트 변수 활용
    int jNumber = 0;
// cin을 활용해 본인이 원하는 직업을 선택할 수 있게끔 설정
    cin >> jNumber;
// 스위치문 값에 jNumber을 넣음으로써 본인이 원하는 직업 선택 가능.
    switch (jNumber)
    {
    case JOB_KNIGHT:
        cout << "당신은 나이트를 선택하였습니다." << endl;
        break;
    case JOB_ARCHER:
        cout << "당신은 아쳐를 선택하였습니다." << endl;
        break;
    case JOB_MAGICION:
        cout << "당신은 매지션을 선택하였습니다." << endl;
        break;
    case JOB_ASSASSIN:
        cout << "당신은 어쌔신을 선택하였습니다." << endl;
        break;

// 잘못 선택했을 경우의 default 값
    default:
        cout << "잘못 선택하였습니다." << endl;
        break;
    }


return 0;
}

이렇게 스위치문을 활용해서 직업을 설정하는 법도 만들어 보았습니다!!

아직은 cout으로 밖에 못하지만... 나중엔 더 잘해지겠죠??? ㅋㅋㅋㅋ

그럼 오늘은 여기까지 해보겠습니다!! 다음에 봬요!!

반응형

댓글