삶의 공유
[C++] C++와 표준 라이브러리 초단기 속성코스(조건문) 본문
출저 : 책, 전문가를 위한 C++
조건문을 사용하면 어떤 값이 참 또는 거짓인지에 따라 주어진코드를 실행할지 결정할 수 있다.
C++ 에서 지원하는 조건문 중에서도 대표적인 세 가지 구문인 if/else문, switch문, 조건 연산자를 소개 한다.
1) if/else문
가장 흔히 사용하는 조건문은 if문이며, else문과 함께 쓸수 있다. if문에 나온 조건이 참이면 if문에 속한 코드를 실행한다. 조건이 참이 아니면 if 블록을 빠져나와 그 뒤에 나오는 문장을 실항하거나, else문이 명시돼 있다면 else문에 속한 코드를 실행한다.
if(i > 4) {
// 뭔가 작업한다.
} else if ( i > 2) {
// 다른 일을 한다.
} else {
// 다른 일을 한다.
}
if 문 뒤에 소괄호 안에는 반드시 bool 타입의 값을 지정 하거나 평가 결과가 bool 값인 표현식을 지정해야 한다.
여기서 0은 false를 의미 하고, 0이 아닌 값은 true를 의미한다.
예를 들어 if(0)은 if(false)와 같다.
if문의 이니셜라이저 ※ C++17부터 if문 안에서 이니셜라이저(초기자)를 넣는 기능이 추가 됐다.
//if (<이니셜라이저>; <조건문>) { <본문> }
if(Employee employee = GetEmployee(); employee.salary > 1000) {...}
여기서는 <이니셜라이저>로 직원 정보를 가져와서 조건문이 그 직원의 급여가 1000이상인지 확인하고, 이를 만족하면
본문에 나온 코드를 실행한다.
2) switch문
또 다른 조건문인 switch문은 조건으로 지정한 표현식의 결과에 따라 수행할 동작을 선택한다.
C++에서 switch문에 지정할 수 있는 표현식을 결괏값이 반드시 정수 타입이거나, 정수 타입으로 변환할 수 있는 타입이거나, 열거 타입 이거나, 엄격한 열거타입이어야 하며, 상수와 비교 할 수 있어야한다.
switch문 안에는 다양한 경우를 표현하는 상숫값들을 case문으로 지정할 수 있다. switch문에 지정한 표현식의 결과와 일치하는 case가 있으면 그 아래에 나오는 코드를 실행하다가 break문이 나오면 멈춘다.
또한 상수 자리에 default란 키워드가 나오는 case문도 작성할 수 있는다. 이 구문은 case문에서 일치하는 것이 하나도 발견되지 않을때 실행 된다.
switch (menuItem) {
case OpenMenuItem:
// 파일을 여는 코드
break;
case SaveMenuItem:
// 파일을 저장 하는 코드
break;
default:
// 에러 메시지를 출력하는 코드
break;
}
switch문은 모두 if/else문으로 변환 할 수 있다. 예를 들어 앞의 코드를 다음과 같이 변환할 수 있다.
if (menuItem == OpenMenuItem) {
// 파일을 여는 코드
} else if (menuItem == SaveMenuItem) {
// 파일을 저장하는 코드
} else {
// 에러 메시지를 출력하는 코드
}
switch문은 표현식을 테스트 결과가 아닌, 하나의 표현식에서 나오는 여러가지 값에 따라 동작을 결정한느 용도로 주로 사용한다. 이럴 때는 if/else문을 연달아 쓰기 보다는 switch문을 작성하는 것이 훨씬 깔끔하다.
동작을 나눌 기준 값이 하나 뿐일 때는 if나 if/else문이 나을 수 있다.
switch문의 조건으로 지정한 값과 일치한느 case문이 있다면 그 아래 나오는 문장을 break문이 나타날때까지 실행한다.
break문이 없다면 다음에 나오는 case문도 계속 실행하는데, 이렇게 실행되는것을 fallthrough(폴스루) 라 부른다.
다음 코드는 여러 case문에 대해 동일한 코드 블록을 실행하도록 폴스루 방식으로 작성한 예를 보여주고 있다.
switch (backgroundColor) {
case Color::DarkBlue:
case Color::Black:
// 배경 색이 진청 혹은 검정일때 실행될 코드
break;
case Color::Red:
// 배경 색이 빨강일때 실행될 코드
break;
}
폴스루 방식으로 작성하면 버그가 발생하기 쉽다. 예를 들어 중간에 break문을 깜빡잊고 빠뜨렸을 경우가 그렇다.
컴파일러가 switch 문에서 폴스루 구문을 발견했는데 위 예제 처럼 해당 케이스가 비어있지 않으면 경고 메시지를 발행한다.
Switch문의 이니셜라이져
C++17부터 if문 처럼 switch 문도 이니셜라이저를 지정할 수 있다.
switch(<이니셜라이저>; <표현식>) { < 본문 > }
조건 연산자
조건 연산자는 C++에서 인수 세개를 받는 유일한 삼항 연산자다.
[조건] ? [동작1] : [동작2] → 의미 : 조건을 만족하면 동작1 수행, 그렇지 않으면 동작2 수행
예제
std::cout << ((i>2) ? "Yes" : "No"); // i > 2를 소괄호로 묶는 것은 선택사항이다.
if문이나 switch문과 달리 조건 연산자는 코드 블록을 실행할 수 없다, 그 대신 앞의 예제처럼 코드 안에서 사용할 수 있다는 장점이 있다. 즉, +, -와 같은 연산자의 일종이다.
논리 연산자.
> 연산자가 논리 연산자 중 하나 이다. 이 연산자는 두 값을 비교해서 왼쪽 값이 오른쪽 값보다 크면 '참'이란 결과를 낸다. 다른 논리 연산자도 모두 이 패턴에 따라 최종결과는 true나 false가 된다.
C++는 논리 표현식을 단락 논리(축약 논리) 방식으로 평가 한다. 다시 말해 표현식을 평가하는 도중에 최종 결과가 확정 되면 나머지 부분은 평가하지 않는다.
bool result = bool1 && 0 && (i > 7) && !done;
다음 코드는 &&를 사용하는 문장을 보여주는데 &&의 두번째 항 이후는 단락 된다. 0은 항상 false가 되기 떄문이다.
이 처럼 단락 기능은 프로그램 성능을 높이는데 도움 된다. 단락 되는 논리식을 작성할 때는 가볍게 검사할 수 있는 부분은 앞에두고, 시간이 좀 걸리는 부분은 뒤에 둔다. 또한 포인터 값이 올바르지 않을때 그 포인터를 사용하는 표현식을 실행되지 않게 할때도 단락을 활용하면 좋다.
'Programing > C++' 카테고리의 다른 글
[C++] C++와 표준 라이브러리 초단기 속성코스(반복문, 스트링, 스택 & 힙) (0) | 2021.02.03 |
---|---|
[C++] C++와 표준 라이브러리 초단기 속성코스(함수, 배열, 벡터) (0) | 2021.02.01 |
[C++] C++와 표준 라이브러리 초단기 속성코스(연산자, 타입, 구조체) (0) | 2021.01.28 |
[C++] C++와 표준 라이브러리 초단기 속성코스(리터럴(literal) & 변수) (0) | 2021.01.28 |
[C++] C++ 기초(주석, 전처리 지시자, main()함수, I/O Stream) (0) | 2021.01.26 |