Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++17 초기화 구문이 포함된 if 문 완벽 정리


C++17에서는 기존 if 문의 문법이 확장되었습니다. 이제 if 문 자체 안에 초기화 구문(initializer)을 직접 작성할 수 있으며, 이 새로운 문법은 "초기화 구문이 포함된 if 문(if statement with initializer)"이라고 불립니다. 이 기능은 흔히 사용되는 코드 패턴을 단순화하고 변수의 스코프(scope)를 좁게 유지하도록 도와줍니다. 그 결과 변수가 스코프 밖으로 노출되어 발생하는 문제를 효과적으로 방지할 수 있습니다.

기존 방식(C++17 이전)의 예제

예를 들어, 주어진 숫자가 짝수인지 홀수인지 확인하는 코드를 작성한다고 가정해 보겠습니다. C++17 이전에는 다음과 같이 코드를 작성해야 했습니다.

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    srand(time(NULL));
    int random_num = rand();
    if (random_num % 2 == 0) {
        cout << random_num << " is an even number\n";
    } else {
        cout << random_num << " is an odd number\n";
    }
    return 0;
}

실행 결과

위 코드를 컴파일하여 실행하면 다음과 비슷한 출력이 생성됩니다.

1555814729 is an odd number

위 예제에서 볼 수 있듯이, 변수 "random_num"이 if-else 스코프 밖까지 노출되어 있습니다. 즉, 조건 검사에만 필요한 변수임에도 불구하고 main 함수 전체에서 접근 가능한 상태로 남게 됩니다. 새로운 "초기화 구문이 포함된 if 문" 문법을 사용하면 이러한 스코프 누수를 손쉽게 피할 수 있습니다.

"초기화 구문이 포함된 if 문"의 기본 문법은 다음과 같습니다.

if (init; condition) {
    // 불리언 조건이 참(true)일 때 실행할 코드
} else {
    // 불리언 조건이 거짓(false)일 때 실행할 코드
}

세미콜론(;) 앞에 위치한 init 부분에서 변수를 선언하고 초기화하며, 세미콜론 뒤의 condition에서 해당 변수를 활용해 조건을 검사합니다.

C++17 새 문법 적용 예제

이제 앞서 살펴본 동일한 코드를 새로운 초기화 구문이 포함된 if 문으로 작성해 보겠습니다.

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    srand(time(NULL));
    // C++17 초기화 구문이 포함된 if 문
    if (int random_num = rand(); random_num % 2 == 0) {
        cout << random_num << " is an even number\n";
    } else {
        cout << random_num << " is an odd number\n";
    }
    return 0;
}

위 예제에서 변수 "random_num"의 스코프는 if-else 블록 내부로 한정됩니다. 따라서 이 변수는 해당 블록 외부에서 접근할 수 없습니다. 놀랍게도 실제 출력 결과에는 아무런 영향을 주지 않으면서도 변수 스코프를 훨씬 깔끔하게 관리할 수 있습니다.

이러한 패턴은 특히 임시 객체의 생명 주기를 관리할 때 유용합니다. 대표적인 활용 사례로는 컨테이너의 find() 결과 검사나 map::insert() 반환값 처리 등이 있으며, 임시 변수가 불필요하게 오래 살아남아 이름 충돌이나 의도치 않은 재사용을 일으키는 것을 막아줍니다.

실행 결과

위 코드를 컴파일하여 실행하면 다음과 비슷한 출력이 생성됩니다.

943513352 is an even number

참고: 매 실행 시마다 난수를 새로 생성하기 때문에, 같은 머신에서 실행하더라도 출력 결과는 실행할 때마다 달라집니다.