안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/컴퓨터의 개념 및 실습

[Chapter 13] Control Structures - 조건문, 반복문

피그브라더 2020. 2. 21. 22:19

이번 포스팅에서는 C 언어가 제공하는 조건문과 반복문이 어떻게 어셈블리어로 번역이 되는지를 한 번 다뤄볼 것이다. 물론 이는 C 언어 강좌 포스팅이 아니기 때문에 C 언어가 제공하는 조건문 및 반복문의 문법에 대한 내용은 따로 설명하지 않을 것이다. 문법은 이미 어느 정도 알고 있다는 가정 하에, 그러한 조건문과 반복문이 어떤 방식으로 번역이 되는지에 초점을 맞춰보도록 하자.

 

1. 조건문

계산되는 Expression의 값에 따라 실행할 코드를 선택하게 하는 구문이다. C 언어는 조건문으로서 if 문, if-else 문, switch 문을 제공한다. 각각에 대해 알아보도록 하자.


1-1. if 문

condition은 C 언어 Expression에 해당하며, 0으로 계산되면 거짓, 0이 아닌 값으로 계산되면 참으로 간주된다. condition이 참이면 action에 해당하는 Statement를 실행한다. action은 세미콜론으로 끝나는 하나의 단순한 Statement일 수도 있고, 여러 Statement가 중괄호로 둘러싸인 형태일 수도 있다.

 

 

그리고 if 문은 다음과 같은 방식으로 번역이 된다.

 

 


1-2. if-else 문

if 문이 condition이 참일 때 실행할 Statement만 명시한다면, if-else 문은 condition이 거짓일 때 실행할 Statement도 명시한다. 

 

 

그리고 if-else 문은 다음과 같은 방식으로 번역이 된다.

 


1-3. switch 문

expression은 C 언어 Expression에 해당하며, 그 계산 결괏값이 어떤 경우에 해당하느냐에 따라 특정 코드를 실행하는 구문이다. 각 case에 쓰는 값은 반드시 상수여야 하며, expression의 값에 해당하는 경우의 Statement를 실행한다. break 문이 따로 없다면 그대로 아래로 내려가면서 차례대로 Statement를 실행한다. break 문이 있다면 더 이상 아래로 내려가지 않고 현재의 switch 문을 탈출한다.

 

 

2. 반복문

계산되는 Expression의 값이 종료 조건을 만족하기 전까지 반복적으로 특정 코드를 실행하는 구문이다. C 언어는 반복문으로서 while 문, for 문, do while 문을 제공한다. 각각에 대해 알아보도록 하자.


2-1. while 문

test는 C 언어 Expression에 해당하며, 0으로 계산되면 거짓, 0이 아닌 값으로 계산되면 참으로 간주된다. condition이 참이면 loop_body에 해당하는 Statement를 실행한 뒤, 다시 test의 값을 검사한다. test의 계산 결괏값이 거짓이 될 때까지는 loop_body를 반복적으로 실행한다. 만약 loop_body 부분에서 break 문이 실행되면 현재의 반복문을 탈출하게 된다.

 

 

그리고 while 문은 다음과 같은 방식으로 번역이 된다.

 


2-2. for 문

while 문과 유사하게, end-test에 해당하는 Expression의 계산 결괏값이 거짓이 될 때까지 statement에 해당하는 Statement를 반복적으로 실행한다. 다만 루프를 시작하기 직전에 init에 해당하는 코드를 실행하고, statement의 실행이 마무리되어서 end-test의 값을 검사하러 가기 전에 re-init에 해당하는 코드를 실행한다는 차이점이 존재한다. 이것 역시 statement 부분에서 break 문이 실행되면 현재의 반복문을 탈출하게 된다.

 

 

for 문은 다음과 같은 방식으로 번역이 된다.

 


2-3. do while 문

while 문과 거의 유사하되, 최소한 한 번은 반드시 loop_body를 실행한다는 것이 다르다. 있다. 반복문 종료 조건 검사 시점이 loop_body의 실행을 마친 직후이기 때문이다. 이것 역시 loop_body를 실행할 때 break 문이 실행되면 현재의 반복문을 탈출하게 된다.

 


2-4. for 문 VS while 문

for 문은 주로 카운터에 기반한 루프를 구현할 때, while 문은 주로 센티넬에 기반한 루프를 구현할 때 많이 사용된다. 우선 카운터에 기반한 루프의 경우 카운터 변수를 선언하고 이를 마지막 부분에서 증가 혹은 감소시켜주는 코드를 작성해야 하는데, 한 줄에 그것들을 모두 작성할 수 있는 for 문이 이 경우에는 더 좋은 것이다. 그렇다면 센티넬에 기반한 루프라는 것은 무엇을 의미할까? 센티넬(Sentinel)은 루프를 종료시키기 위해 특정 변수가 가져야 하는 값으로, 예를 들어 루프의 매 iteration 마다 정수를 하나 입력받는데 0을 입력할 경우 루프가 종료된다면 0이 센티넬이 되는 것이다. 이렇듯 센티넬에 기반한 루프를 구현할 때는 for 문보다는 while 문을 주로 사용한다.

 

3. break, continue

3-1. break

switch 문 또는 반복문(while, for, do while)에서만 사용되는 구문이다. CPU의 제어를 자신을 감싸고 있는 가장 작은 switch 문 혹은 반복문 바깥으로 이동시키게 된다. 대개 종료 조건이 만족되기 전에 반복문을 탈출하고 싶거나, switch 문에서 특정 경우를 만족하는 경우 이에 해당하는 코드만 실행시키고 switch 문을 탈출하고 싶을 때 주로 사용된다.


3-2. continue

break와 달리 반복문에서만 사용되는 구문이다. 현재 실행 중인 iteration의 실행을 종료하고 CPU의 제어를 반복문 종료 조건을 검사하는 부분으로 제어를 이동시킨다. 단 for 문의 경우에는 re-init에 해당하는 코드를 먼저 실행하고 종료 조건을 검사한다.

 

4. if - else if 문의 정체는?

조건문을 설명할 때 if 문과 if-else 문만 설명을 하였는데, 그러면 if - else if 문은 무엇일까? 설명을 생략한 것이 아니다. 이를 설명하기 위해선 먼저 다음을 이해해야 한다. 위에서 설명한 여러 조건문들과 반복문들은 그 자체로 하나의 Statement이다. 앞서 살펴보았던 조건문들과 반복문들의 구조를 정리하면 다음과 같은데, 각각은 그 자체로 하나의 Statement라는 것이다. 그래서 if - else if 문은 if-else 문에서 else에 해당하는 Statement 자리에 또 다른 if-else 문이 들어간 형태일 뿐이다. if-else 문을 중첩한 것이 if - else if 문의 정체인 것이다.

 

   if (EXPRESSION) STATEMENT_1

   if (EXPRESSION) STATEMENT_1 else STATEMENT_2

   switch (EXPRESSION) { case CONSTANT_1: STATEMENT_1  . . .  default: STATEMENT_N }

   while (EXPRESSION) STATEMENT

   for ( . . . ; EXPRESSION ; . . . ) STATEMENT

   do STATEMENT while (EXPRESSION);

 

   → 그 자체로 하나의 STATEMENT