33.4 논리 연산자를 사용하지 않고 3과 5의 공배수 처리하기
논리 연산자 &&를 사용하지 않고 3과 5의 공배수를 검사하려면 어떻게 해야 할까요? 3 * 5 = 15는 3과 5의 최소공배수이므로 15로 나눴을 때 나머지가 0인 값들은 3과 5의 공배수입니다.
fizzbuzz_without_logical_operator.c
#include <stdio.h> int main() { for (int i = 1; i <= 100; i++) // 1부터 100까지 100번 반복 { if (i % 15 == 0) // 15의 배수(3과 5의 공배수)일 때 printf("FizzBuzz\n"); // FizzBuzz 출력 else if (i % 3 == 0) // 3의 배수일 때 printf("Fizz\n"); // Fizz 출력 else if (i % 5 == 0) // 5의 배수일 때 printf("Buzz\n"); // Buzz 출력 else printf("%d\n", i); // 아무것도 해당되지 않을 때 숫자 출력 } return 0; }
실행 결과
... (생략) FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
i를 15로 나눴을 때 나머지를 구하여 3과 5의 공배수를 구했습니다. 이때는 15라는 숫자 안에 3과 5의 최소공배수라는 뜻이 숨어 있습니다. 따라서 주석에 적절한 설명이 없다면 코드를 읽는 사람이 15의 속 뜻을 알아내야 합니다.
FizzBuzz는 문제가 간단해서 15가 3과 5의 최소공배수라는 것을 쉽게 알 수 있습니다. 하지만 실무에서는 값의 속 뜻을 최대한 줄여서 i % 3 == 0 && i % 5 == 0처럼 계산식과 논리 연산자를 사용하여 뜻을 명확하게 드러내는 것이 좋습니다.
요즘은 컴파일러가 사람보다 최적화를 훨씬 잘해주고, CPU도 매우 빨라졌으므로 사소한 부분에 신경쓰기 보다는 가독성을 높이는 쪽으로 코드를 작성합니다.
읽기 쉽고 이해하기 쉬운 코드를 가독성이 좋다고 말합니다. 코드를 복잡하게 작성할수록 프로그래밍 실력이 뛰어나다고 착각하기 쉽지만 정반대입니다. 즉, 복잡한 로직을 간단하고 쉽게 작성할수록 프로그래밍 실력이 뛰어나다고 할 수 있습니다.
프로그래밍은 만드는 것으로 끝나지 않고, 항상 유지보수가 뒤따릅니다. 특히 규모가 큰 프로젝트는 여러 사람이 협업하여 기능을 구현하고 내가 만든 코드를 다른 사람이 수정하거나, 내가 다른 사람의 코드를 수정하기도 합니다(실무에서는 내가 다른 사람의 코드를 수정해야 하는 일이 대부분입니다). 따라서 다른 사람이 내 코드를 유지보수하기 쉽도록 코드를 작성해야 하고, 내가 만든 코드를 나중에 내가 봤을 때도 이해하기 쉽도록 작성해야 합니다.