[C++] 조건문(Conditional Statements), 삼항 연산자

2024. 2. 29. 17:18Programming Language/C++

아래 링크 클릭 시 해당 본문으로 이동

제어문(Control Flow Statement)

조건문(Conditional Statements)

삼항 연산자(Ternary Operator)


제어문(Control Flow Statement)

• 프로그램에서 원하는 결과를 얻기 위해 순차적인 흐름을 제어하는 구문이다.

• 코드는 위에서 아래로 순차적으로 진행되는데, 제어문은 코드의 실행 순서를 제어할 수 있다.

• 제어문 종류 : 조건문, 반복문


조건문(Conditional Statements)

• 주어진 조건에 따라 코드의 실행 여부를 결정할 수 있게 하는 문장

`if` : 만약 ~라면

`else if` : 그게 아니고 ~라면

`else` : ~가 아니라면, 다 아니라면


1. if문

if(조건식1)
{
	// 조건식1이 참이면 실행
}

 

▷ 예시 1

#include <iostream>

int main()
{
    int a = 0;
    // &&은 둘 다 참이면 참이고, 논리식에서 0이 아닌 모든 수는 참이다.
    if (100 && 200)
    {
        a = 100;
    }
    
    cout << a;  // 100
    
    return 0;
}

▽ 출력 결과

100

 

▷ 예시 2

#include <iostream>

int main()
{
    int a = 0;
    // `&&`은 하나라도 거짓(false)이고, 논리식에서 0은 거짓(false)이다.
    if (0 && 200)
    {
        a = 100;
    }
    
    // a는 100이 아니기 때문에 아래 if문은 실행되지 않는다.
    if (a == 100)
    {
    	a = 300;
    }
    
    cout << a;  // 0
    
    return 0;
}

▽ 출력 결과

0

실행되지 않는 조건식은 Debug 모드일 때는 문제가 없지만 Release 모드일 때는 존재하지 않는 코드가 될 수도 있다.

솔루션 구성

솔루션 구성 (Debug / Release)

• Debug 모드 : 하나씩 다 수행시켜 준다.

• Release 모드 : 최적화 옵션이 켜진다. ➜ 코드가 존재하지 않게 될 수도 있다.


2. if - else문

if (조건식1)
{
	// 조건식1이 참이면 실행
}
else
{
	// 조건식1이 거짓이면 실행;
}

 

▷ 예시

#include <iostream>

int main()
{
	int a = 0;
    // if문
	if (0 && 200)  // 거짓
    {
    	a = 100;
    }
    // a는 0이다.
    
    // if - else문
    if (a == 100)  // 거짓
    {
    	a = 300;
    }
    else
    {
    	a = -10;
    }
    
    cout << a;  // -10

	return 0;
}

▽ 출력 결과

-10

3. if - else if - else문

if (조건식1)
{
	// 조건식1이 참이면 실행
}
else if (조건식2)
{
	// 조건식1이 거짓이고 조건식2가 참이면 실행
}
else
{
	// 조건식이 모두 거짓이면 실행
}

• `else if`는 여러 개 사용 가능

만약 `else`가 아예 없다면 모든 조건이 거짓일 때 아무것도 실행되지 않는다.

 

▷ 예시

#include <iostream>

int main()
{
	int a = 0;
    // if문
	if (0 && 200)  // 거짓
    {
    	a = 100;
    }
    // a는 0이다.
    
    // if - else if - else문
    if (a == 100)  // 거짓
    {
    	a = 300;
    }
    else if (a == -50)  // 거짓
    {
    	a = -10;
    }
    else
    {
    	a = 60;
    }    

    cout << a;  // 60

	return 0;
}

▽ 출력 결과

60

4. switch문

switch (조건값)
{
	case x1:
        // 조건값이 x1이면 실행
        break;
    
	case x2:
        // 조건값이 x2이면 실행
        break;
    …
    case xn:
        // 조건값이 xn이면 실행
        break;
    
    default:
        // 조건값에 맞는 case가 하나도 없으면 실행
        break;
}

• `break` : switch문의 중괄호를 벗어나 switch문을 탈출한다.

 

▷ 예시

#include <iostream>

int main()
{
	int a = 10;
    // switch문
    switch (a)  // 조건값은 10이므로 case 10에 해당한다.
    {
    	case 10:  // 실행
        	a = 5;
            break;  // switch문 탈출
        case 20:
        	a = -2;
            break;
        default:
        	a = 0;
            break;
    }

    cout << a;  // 5

	return 0;
}

▽ 출력 결과

5

모든 case에 `break;`가 없어도 오류가 발생하지 않고, `default`까지 쭉 코드가 진행이 되고 switch문이 끝난다.
조건값에 맞는 case에 `break;`가 없어도 오류가 발생하지 않는 이유는 case끼리 묶을 때처럼 의도적으로 break를 안 쓰는 경우가 있기 때문이다.

▷ 조건값이 10, 20, 30 중에 있다면 해당 case 실행

#include <iostream>

int main()
{
	// switch문
    int a = 30;
    switch (a)	// 조건값은 30이기 때문에 case 30이 실행된다.
    {
    	// case가 10 또는 20 또는 30일 때
        case 10:
        case 20:
        case 30:  // 실행
            a = 100;
            break;  // switch문 탈출
        
        default:
            a = -80;
            break;
    }
    
    cout << "a = " << a << endl;  // a = 100
    
    // if - else문
    int b = 30;
    if (b == 10 || b == 20 || b == 30)  // 실행
    {
        b = 100;
    }
    else
    {
        b = -80;
    }
    
    cout << "b = " << b;  // b = 100
    
    return 0;
}

▽ 출력 결과

a = 100
b = 100

switch문if - else if - else문

▷ 예시

ⓐ switch문

#include <iostream>

int main()
{
	// switch문
    int a = 20;
    switch (a)	// 조건값은 20이기 때문에 case 20이 실행된다.
    {
        case 10:
        	a = 5;
            break;
            
        case 20:  // 실행
        	a = -2;
            break;
            
        default:
            a = 0;
            break;
    }
    
    cout << a;  // -2
    
    return 0;
}

ⓑ if문 (if - else if - else)

#include <iostream>

int main()
{
    // if - else if - else문
    int a = 20;
    if (a == 10)
    {
        a = 5;
    }
    else if (a == 20)  // 실행
    {
        a = -2;
    }
    else
    {
    	a = 0;
    }
    
    cout << a;  // -2
    
    return 0;
}

switch문에서 if문으로, if문에서 switch문으로 바꾸는게 항상 가능한 것은 아니다.

switch문과 if문은 문법적으로 큰 차이가 없지만 서로 바꿀 수 없는 상황이 있다.

(변수나 특정 값을 넣는 등) 복잡한 경우 ➜ switch문으로는 표현이 힘든 경우가 있다.

조건이 길어지는 경우 ➜ if문은 조건이 너무 길어지면 switch문보다 가독성이 떨어진다.

무조건 무엇을 써야 되는 것은 아니므로 프로그래머의 코딩 방식과 특정 상황에 맞게 쓰면 된다.


삼항 연산자(Ternary Operator)

조건식 ? 참이면 반환 : 거짓이면 반환

if - else문을 간략하게 쓰고 싶을 때 사용

삼항 연산자if - else문

▷ 예시

ⓐ 삼항 연산자

#include <stdio.h>
int main()
{
    d = 30;
    d == 30 ? d = 100 : d = -80;  // 100(변수 d는 30으로, 참이다.)

	return 0;
}

 

ⓑ if - else문

int d = 30;
if (d == 30)
{
	d = 100;
}
else
{
	d = -80;
}

 

삼항 연산자는 코드를 한 줄로 줄이는 등의 특별한 목적이 아니라면 가독성이 좋지 않기 때문에 굳이 삼항 연산자를 쓸 필요는 없다.

※ 코드가 길어져도 가독성 있게 쓰는 것이 더 좋다.