본문 바로가기
언어/C++

[C++ 기본 공부정리] 4-2. 제어문-반복문

by 민-Zero 2019. 11. 19.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

반복문 또한 조건문과 마찬가지로 조건이 주어지고 해당 조건이 true일 경우에 {} 안의 코드를 실행하게 된다.

다만 조건문은 한번 실행하고 종료되지만 반복문의 경우 조건을 만족하지 않을 때까지 반복하게 된다.

반복문의 경우 크게 while, do while, for 문 총 3가지로 나뉜다.

 

1. while 문

문법)

while (조건문) {

    실행 코드;

}

while을 만나게 되면 조건문을 만나 참 거짓을 판단하고 참일경우 해당 반복문의 {} 안의 코드를 실행하고 끝이 나게 되면 다시 조건 문으로 돌아오게 된다. 따라서 조건문이 계속 참일 경우 반복문이 끝나지 않는 무한루프에 빠지므로 반복문이 종료될수 있도록 조건문을 잘 조절해야 한다.

 

위의 경우 while의 조건문에 count 변수 즉 1의 값이 들어갔다. 0 이외의 값은 모두 참을 뜻하므로 반복문이 계속 무한히 반복되어 프로그램이 종료되지 않으므로 ctrl + c를 눌러 강제 종료한 모습이다.

무한루프는 시스템상의 메모리를 계속해서 잡아먹기 때문에 최대한 지양해야 하지만 계속 실행하다 사용자가 원하는 타이밍에 종료될수 있도록 응용할 수 있기 때문에 잘 알아 두어야 한다.

 

무한루프에 빠지지 않게 하기 위해 조건문을 원하는 횟수까지만 진행되도록 수정하고 원하는 실행코드 뒤에 while의 조건문 안에 들어있는 count의 값을 증감식을 통해 1씩 증가시켜 총 10회 반복시킨 모습이다.

처음 count의 값은 1이므로 10보다 작거나 같을때 참이 되는 조건문을 만족 해당 반복문이 실행되고 count++;로 값이 2로 증가된다. (위의 경우에서 후치로 증가시키던 전치로 증가시키던 상관은 없다) 다시 조건문을 확인하게 되고 2 또한 10보다 작거나 같기 때문에 다시 반복, 10이 되었을 경우까지 조건문을 만족함으로 한 번 더 실행한 뒤 증감식으로 인해 11로 값이 증가된 뒤 다시 조건문을 확인 이때는 11이 10보다 크므로 조건문이 false가 되어 반복문이 실행되지 않고 넘어가게 되는 것이다.

다른 방법으로 조건문과 break; 를 이용하여도 반복문의 횟수를 조절할 수 있다.

앞서 정리한 switch문에서 빠져나올 때 사용한 break는 반복문에서도 사용될 수 있는대 내가 원하는 횟수일 때 조건문을 사용하여 break;가 동작하도록 한 모습이다. 이때 주의할 점은 실행시킬 코드와 증감식 조건식의 위치가 중요한데 만약 여기서 count ++;을 if문 위로 올릴 경우 9회 반복 뒤 count++;로인해 10으로 변한 상태에서 if를 만나 조건식이 참이 되어 버리므로 9회 반복한 뒤 반복문이 종료되어 버린다.

 

2. do while 문

문법)

do {

    실행 코드;

} while(조건문);

while과의 차이점은 실행될 코드가 do와 함께 조건문보다 먼저 쓰였다. 따라서 while 문의 경우 조건문을 먼저 확인하고 참일 경우에 {} 안의 코드를 실행했지만 do while의 경우 do안에 있는 반복될 코드를 무조건 먼저 한번 실행한 뒤 조건문을 확인 참일 경우 반복하는 특징을 지니고 있다.

따라서 조건문을 만족하지 못하여도 무조건 1번은 코드를 실행하는 모습을 확인할 수 있다.

 

3. for문

문법)

for (초기식; 조건문; 증감식) {

    실행 코드;

}

while, do while에서 따로 횟수를 위한 변수를 선언하며, 증감식의 위치나 조건문을 이용하지 않는 종료를 사용할 경우 코드의 위치 또한 잘 조정해야 하는 등 고려해야 할 점이 존재했다. 하지만 for문을 사용할 경우 조건문의 위치에 for문에서 횟수에 사용할 지역변수를 선언할 수 있는 초기식, 조건식, 변수에 대한 증감식을 결정할 수 있어 while문 보다 간결하게 사용할 수 있다.

앞의 while문과 같은 동작을 하는 코드를 for문으로 훨씬 간결하게 작성할 수 있음을 확인할 수 있다. 

count 변수를 따로 선언하여 반복 문안에 서 count++; 을 통해 증가시켰다면 for문은 한 번에 초기식과 조건문 증감식을 선언하여 한눈에 보기 편하게 선언 가능하다.

 

이때 초기식 안에서 선언한 반복 횟수에 대한 i변수는 for문 안에서만 사용 가능한 지역변수 이므로 for문이 종료될 경우 소멸하므로 for문 외부에서는 호출할 수 없다.

 

for문을 사용하는 또 하나의 방법으로 range based for(범위 기반 for문)라는 방법이 존재한다.

문법)

배열 선언;

for (배열의 값을 받을 변수 : 선언한 배열){

    실행 코드;

}

범위 기반 for문은 배열을 인식하여 배열 안의 값을 for에서 선언한 변수에 복사하여 사용한다. 배열 안의 모든 값에 대해 실행 되기 때문에 배열안의 원소의 개수만큼 반복되게 된다.

이 방법에서는 배열을 이용해야 하는데 간단히 정리하면, 배열은 같은 데이터형의 여러 값을 한 번에 저장하는 방법이다. 그냥 일반 변수가 서랍 1칸이라면 배열은 서랍장 자체라고 생각하면 된다. 배열은 뒤에서 자세히 정리 하자.

홀수 값만 담고 있는 배열을 선언한 뒤 for문 표현식 안에서 odd변수를 선언하여 배열의 첫 번째 원소를 복사하여 출력한 뒤 다시 표현식으로 돌아가 두 번째 원소를 복사하여 사용 이를 배열의 원소 전부를 사용할 때까지 반복하는 것이다.

 

4. 반복문 제어

반복문의 경우 조건문의 참, 거짓을 판단한 뒤 {} 안의 코드를 모두 실행하고 다시 조건문으로 돌아가게 된다. 이때 코드 실행의 흐름을 사용자가 직접 제어하는 방법을 제공하는데 위의 while에서 사용했던 break와 continue, goto가 존재한다.

 

continue

이 코드가 진행되다 이 명령을 만날 경우 나머지 코드를 실행하지 않고 바로 조건식으로 건너뛰게 된다. 따라서 반복 중에 예외를 처리하기 위해 많이 사용된다.

if문과 continue를 이용하여 5로 나눈 나머지가 0이 아닐 경우에 나머지 코드인 cout을 실행하지 않는 방법으로 1부터 100중에 5의 배수만 출력한 경우이다.

 

break

위의 while문에서 사용한 것처럼 반복문의 조건에 관계없이 해당 루프를 종료시킬 수 있게 해 준다. 반복문을 종료시킨 뒤 반복문 다음 코드로 진행된다.

break와 return을 혼동하기 쉬운데 break는 switch나 반복문을 사용한 함수 내에서 switch 나 반복문을 종료시키고 그 뒤에 코드가 남아있다면 마저 진행되고 return을 사용하게 되면 switch나 반복문을 포함한 함수 자체가 반환되기 때문에 그 뒤에 코드가 진행되지 않고 함수가 종료된다.

 

goto

사용법)

goto label명;

label명:

goto의 경우 아무런 제약 없이 cpu가 지정된 label로 점프하도록 하여 프로그램 실행의 흐름을 변경할 수 있다. 

 

굉장히 유용해 보이지만 goto의 경우 스파게티 코드(스파게티 코드는 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현이다. 스파게티 코드는 작동은 정상적으로 하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기는 어렵다.)가 될 수 있으므로 사용에 대해 부정적이다. 따라서 디버깅용으로만 사용된다.

댓글