C - 1.3. 두번째 예제의 개선

1. 개선한 코드

같은 동작을 하는 코드도 다양한 방식으로 짤 수 있다. 가령 아까와 똑같은 동작을 하는 코드를 for문을 이용하여 짜 보자.

#include <stdio.h>

/* 섭씨 - 화씨 온도 변환 표를 출력하는 코드 */

main() {
    int fahr;

    for (fahr = 0; fahr <= 300; fahr = fahr + 20) {
        printf("%3d %6.1f\n", fahr, (5.0 / 9.0) * (fahr - 32.0));
    }
}
#include <stdio.h>

/* 섭씨 - 화씨 온도 변환 표를 출력하는 코드 */

main() {
    int fahr;

    for (fahr = 0; fahr <= 300; fahr = fahr + 20) {
        printf("%3d %6.1f\n", fahr, (5.0 / 9.0) * (fahr - 32.0));
    }
}

이를 컴파일러를 통해 실행시켜 보면 1.2에서 작성했던, while문을 이용하는 코드와 같은 결과를 출력한다. 그러나 몇 가지의 변화가 있다.

일단 화씨 온도를 나타내는 fahr변수를 제외하고는 모든 변수가 다 사라졌다. lowerupper변수를 for문에 집어넣고, 환산식도 계산해서 변수에 대입하는 것이 아니라 printf문의 인수로 직접 넣어 주었다.

여기서 알 수 있는 하나의 사실은, 특정 타입의 변수의 값을 사용할 수 있는 곳에서는 그 결과가 같은 타입이면 어떤 복잡한 계산식이라도 들어갈 수 있다는 것이다. 가령 위 코드의 printf의 세번째 인수에는 실수형 값이 들어갔는데, 이게 단일 실수형 변수이든 아니면 여러 변수들을 조합하고 계산해 나온 실수형 값이든 상관없다.

변수 개수를 줄인 것은, 이 정도로 메모리를 절약해야 하는 일은 거의 없기 때문에 성능상으로는 큰 의미가 없다. 하지만 코드가 많이 간단해졌다.

물론 변수명에는 숫자의 용도를 나타내는 역할도 있다. 만약 upper=300 이라고 한다면 코드를 읽는 사람은 쉽게 300이 어떤 상한의 역할을 한다는 사실을 알 수 있다. 그런 부분을 생각하면 위와 같이 쓴 코드는 오히려 알아보기 힘들어졌다고 할 수도 있다.

하지만 이 또한 뒤에서 나올 #define 을 사용하면 해결할 수 있는 문제이다.

2. for문에 대한 설명

위 코드에서 마지막으로 설명할 부분은 for 문에 관해서이다. for문은 또다른 반복문의 형태이다. for문의 의미는 다음과 같다.

for(초기화;지속조건;증가){
    스텝마다 실행시킬 코드
}
for(초기화;지속조건;증가){
    스텝마다 실행시킬 코드
}

하나하나 살펴보면, 초기화 부분에서는 반복문의 초기 조건을 설정해 준다. 위에서는 fahr=0으로 화씨 온도를 0으로 설정한 부분이다

지속조건에서는 반복문이 지속될 조건을 넣는다. 위에서는 fahr<=300인데, 이 조건이 거짓이 되면 중괄호 속의 코드는 실행되지 않는다. 다르게 말하면 이 조건이 참인 동안은 계속 중괄호 내의 코드가 반복되어서 실행된다는 것이다.

만약 증가 파트에서 무언가 제대로 해주지 않아서 fahr이 계속 300 이하라면(가령 fahr이 아닌 엉뚱한 변수를 증가시켜 주고 있다거나, fahr을 도리어 감소시켜주고 있다거나 하는 경우) 중괄호 내의 코드는 무한히 반복되어 실행된다.

증가 부분에서는 스텝이 한번 실행될 때마다 어떤 동작을 해줄 것인지를 정한다. 위에서는 fahr=fahr+20 이다. 이는 스텝(즉, 중괄호 내부의 코드 1번 실행)마다 fahr변수를 20씩 증가시켜준다는 의미이다.

증가라고 했지만 increment를 직역한 추상적인 용어일 뿐이고 실제로는 스텝이 한번 실행될 때마다 해줄 어떤 동작이든 상관없다. fahr를 감소시켜 준다거나 2를 곱해 준다거나 다른 변수를 대입해 준다거나 어떤 것이든 들어갈 수 있다. 다만 보통 반복문은 언젠가 종료되도록 짜는 것이 일반적이므로 언젠가는 종료 조건을 만족하게 될 수 있도록 코드를 짜야 할 것이다.

정리하면 변수를 초기화시켜주고, 중괄호 내부의 코드가 1번 실행될 때마다 어떤 동작을 취해주고, 그 동작을 취하면서 종료조건에 가까워지도록 하는 것이 for반복문인 것이다.

whilefor중 어느 것을 쓸 것인지는 무조건 적용되는 원칙은 없다. 그저 더 명확하게 읽히고 이해되는 쪽으로 쓰면 된다.