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));
}
}
이를 컴파일러를 통해 실행시켜 보면 1.2에서 작성했던, while문을 이용하는 코드와 같은 결과를 출력한다. 그러나 몇 가지의 변화가 있다.
일단 화씨 온도를 나타내는 fahr
변수를 제외하고는 모든 변수가 다 사라졌다. lower
와 upper
변수를 for문에 집어넣고, 환산식도 계산해서 변수에 대입하는 것이 아니라 printf
문의 인수로 직접 넣어 주었다.
여기서 알 수 있는 하나의 사실은, 특정 타입의 변수의 값을 사용할 수 있는 곳에서는 그 결과가 같은 타입이면 어떤 복잡한 계산식이라도 들어갈 수 있다는 것이다. 가령 위 코드의 printf
의 세번째 인수에는 실수형 값이 들어갔는데, 이게 단일 실수형 변수이든 아니면 여러 변수들을 조합하고 계산해 나온 실수형 값이든 상관없다.
변수 개수를 줄인 것은, 이 정도로 메모리를 절약해야 하는 일은 거의 없기 때문에 성능상으로는 큰 의미가 없다. 하지만 코드가 많이 간단해졌다.
물론 변수명에는 숫자의 용도를 나타내는 역할도 있다. 만약 upper=300
이라고 한다면 코드를 읽는 사람은 쉽게 300이 어떤 상한의 역할을 한다는 사실을 알 수 있다. 그런 부분을 생각하면 위와 같이 쓴 코드는 오히려 알아보기 힘들어졌다고 할 수도 있다.
하지만 이 또한 뒤에서 나올 #define
을 사용하면 해결할 수 있는 문제이다.
2. 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
반복문인 것이다.
while
과 for
중 어느 것을 쓸 것인지는 무조건 적용되는 원칙은 없다. 그저 더 명확하게 읽히고 이해되는 쪽으로 쓰면 된다.