ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래밍을 위하여 - 0x00 "사전 준비"
    Legacy/C&C++ 2015. 6. 10. 08:44
    728x90

    프로그래밍을 위한 사전 준비


    Java 같은 객체 지향적(object-oriented) 언어들도 마찬가지겠지만, C로 프로그램을 만들 때에는 무작정 코드를 작성하기 전에 먼저 프로그램을 설계하는 과정이 필요하다. 언어를 새로 배우는 과정에서 접할 수 있는 예제들처럼 쉽고 간단한 문제들은 설계가 별로 필요가 없지만, 조금만 규모가 커지거나 알고리즘 대회 문제 같은 복잡한 문제를 프로그래밍하려면 대개 설계가 꼭 필요하다. 설계가 상세할 수록 프로그램이 주어진 문제를 빠르고, 정확하게 풀 '가능성'도 높아진다. 또한 설계를 잘 해두면 비교적 버그가 적고 유지보수도 쉬운 프로그램이 만들어진다. 프로그램을 설계할 때 생각해 봐야할 첫 번째는 '내가 풀고자 하는 문제가 무엇인가?'이다. 만약 다음과 같은 경우를 생각해보자. 


    어느날 준형이가 '메르센 소수'에 대한 글을 읽었다. 그리고 거기 나와있던 소수 중 하나인 2147483647가 정말로 소수인지 궁금했다.


    이 경우 준형이가 직면한 문제는 무엇일까? 바로 2147483647가 소수인지 아닌지이다. 그럼 이 수가 소수인지 아닌지를 확인해보기 위해선 어떻게 해야할까? 당연히 입력받은 수가 소수인지 아닌지 확인하는 프로그램을 작성해서 실행시켜보면 될 것이다. 예가 조금 억지스러울 수도 있다. 하지만, 실제 코딩을 하다보면 '내가 원래 어떤 문제를 해결하려고 했지?' 라는 의문이 들 때가 있다. 사실 소수인지 아닌지 판단하는 문제는 너무 간단해서 이런 의문이 들기 어렵겠지만, 꽤 복잡한 문제를 해결해 본 사람은 공감할 수 있을 것이다. 두 번째로 생각해봐야할 것은 '문제를 어떻게 해결할 것인가?' 이다. 위의 소수를 판별하는 문제의 경우 많이들 알고 있을 것이다. 하지만 이런 문제를 처음 풀어본다고 생각하고 접근해보자. 우선 '소수'의 정의에서 출발해보자. 소수는 '1과 자기 자신으로만 나누어지는 양의 정수'이다. 다시 말해, 약수로 1과 자기 자신만이 존재하는 수를 말한다. 아주 간단하게 5가 소수인지 아닌지 확인해보자.


    5 % 1 = 0

    5 % 2 = 1

    5 % 3 = 2

    5 % 4 = 1

    5 % 5 = 0


    (%는 나머지 연산)


    5는 1과 자기 자신인 5로만 나누어지므로 소수가 맞다. 조금더 생각을 해보자. 양의 정수 중에 1로 나누어 떨어지지 않는 수가 있을까? 당연하게도 없다. 또한 자기 자신으로 나누어 떨어지지 않는 수가 있을까? 이것도 당연히 없다. 즉, 1로 나누는 것과 자기 자신으로 나누는 것은 소수를 판별하는데 아무 의미가 없다는 것이다. 결과적으로 우리는 소수를 판별하기 위해 다음과 같은 범위의 수로 나누어봐야 한다는 것을 할 수 있다.


    2 ~ (자기 자신 - 1)


    다시 2147483647을 판별하는 것으로 돌아와서 준형이는 이제 2 ~ 2147483646로 2147483647을 나누어 볼 것이다. 2 ~ (자기 자신 - 1)로 나누어 보는 방법을 통해 소수를 문제를 해결할 것이다. 여기까지 생각을 해봤다면 대개는 코딩을 시작해도 된다. 설계 단계에서는 가급적 많은 부분에 있어서 고민을 해봐야 한다. 2 ~ (자기 자신 - 1)로 나누는 과정에서는 while문을 사용할까 for문을 사용할까, 변수명은 무엇을 사용할까 같은 사소한 문제도 좋다. 하지만, 꼭 했으면 하는 생각은 이거다. '더 나은 방법은 없을까?'이다. 요즘 컴퓨터 성능이 좋아졌다고는 하지만 2 ~ 2147483646를 모두 나누어 보는 연산은 제법 시간이 걸린다. 좀 더 나은 방법에 대해 생각해 봐야한다. 더 나은 방법은 분명 있다. 이 문제에서 뿐만 아니라도 다른 문제들에서도 말이다. (더 나은 방법 - 링크)


    프로그래밍을 하기위한 사전 준비 중 설계에 대해서 아주(사실은 너무) 간단한 예시를 가지고 이야기를 해보았다. 사실 설계의 필요성은 이렇게 글로 보여주는 것 보다도 체득해 보는 것이 더 좋은 것 같다. 이 글을 쓰고 있는 나도 아직 폭포수 모델(Waterfall Model) 같은 모델을 적용해서 개발을 해본 적은 없지만, 이곳 저곳에서 들어본 수업과 읽어본 책에서 수도 없이 '프로그램은 유지보수가 어렵다.'라는 말을 너무 많이 들었다. 당장 내가 3달 전에 짠 소스도 수정하기가 여간 어려운 것을 느끼며 조금이나마 무슨 얘기인지 알 수 있었다. 이야기는 여기까지 하고 다음 글에는 ANSI C와 C POSIX를 가지고 C 표준에 대한 글을 써보겠다.

Designed by Tistory.