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도 매우 빨라졌으므로 사소한 부분에 신경쓰기 보다는 가독성을 높이는 쪽으로 코드를 작성합니다.

참고 | 가독성

읽기 쉽고 이해하기 쉬운 코드를 가독성이 좋다고 말합니다. 코드를 복잡하게 작성할수록 프로그래밍 실력이 뛰어나다고 착각하기 쉽지만 정반대입니다. 즉, 복잡한 로직을 간단하고 쉽게 작성할수록 프로그래밍 실력이 뛰어나다고 할 수 있습니다.

프로그래밍은 만드는 것으로 끝나지 않고, 항상 유지보수가 뒤따릅니다. 특히 규모가 큰 프로젝트는 여러 사람이 협업하여 기능을 구현하고 내가 만든 코드를 다른 사람이 수정하거나, 내가 다른 사람의 코드를 수정하기도 합니다(실무에서는 내가 다른 사람의 코드를 수정해야 하는 일이 대부분입니다). 따라서 다른 사람이 내 코드를 유지보수하기 쉽도록 코드를 작성해야 하고, 내가 만든 코드를 나중에 내가 봤을 때도 이해하기 쉽도록 작성해야 합니다.