C와 객체지향 – 01 – 시작

C언어에 대한 글을 쓰고 있다. 리눅스 환경에서 동작하는 C언어를 쓰면서 C언어의 기본적인 내용을 작성하였고, 리눅스 환경에서 C언어를 개발하는데 이용하는 라이브러리들, 그리고 gcc와 make에 관한 글을 작성하고 있습니다.

그런데 문득 작업 진행이 제대로 이루어지고 있지 않는다는 것을 깨달았다. 이젠 리눅스 환경에서의 사용이 중점이기 때문에 그쪽 자룔 정리해서 올리는 작업이다 보니 언어에 관한 작업이 더뎌지고 해서 그런지 작업 속도가 늘지 않았다. 졸업논문 쓰고 난 후의 피로감도 있고…

그래서 이와는 별개로, C에 대한 내용을 작성하였으니 이젠 C 자체만에 추가적인 내용을 적어보고자 합니다. 그게 바로 고급지게 쓰는 C입니다.

그 중에 첫번째로 바로 C와 객체지향에 대해서 작성해 보려고 합니다.

C는 절차지향적 언어라고 기본적으로 배우죠. 따라서 프로그램의 흐름이 중요하고, 그에 맞도록 함수를 잘 써서 분할하고 하는 작업에 대해서 중요하게 여깁니다. 그러다 보니 아무리 몇만 라인의 코드를 작성하더라도 코드 자체가 상당히 평평한 구조를 가지게 됩니다. 함수 하나만 해도 몇백 라인이 되기 일쑤고, 비슷한 기능 하는 함수들 미친듯이 만들고, 그런 함수들이 뒤에 숫자 2,3,4 이런 식으로 막 붙은 그런 함수들… 양산하기 무지 쉽습니다. (이 글을 읽어야 할 수준이라면 내 이야기 아니라고 생각하는 분 없을겁니다.)

내부 처리 로직 중에서는 공통으로 처리할 수 있는 부분은 공통으로 처리할 수 있지만, 동작 제어 함수들은 좀 사정이 다릅니다. 다양한 인자가 필요한 함수, 사용하는 데이터가 전역 변수로 연결, 독립성 결여된 함수들, 서로 의존관계가 너무 깊어 개별적인 테스트 할 수 없는 함수들….

사실 C에서는 특정 내용을 처리하기 위해 함수라는 것이 존재하고 이를 이용해 프로그램을 구조화할 수 있어야 한다고 가르치는데 왜 이런 현상이 발생할까요?

바로 디자인 패턴의 부재 때문입니다. 소프트웨어 개발에서 말하는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙이고, 이를 재사용하기 좋은 형태로 특정 규약을 묶어서 정리한 내용을 말합니다. 문제 해결을 위해 해결 방법을 제시하고, 이를 사용 가능한 구조로 묶고 코드로 만들 수 있는 단계를 알고리즘이라고도 하기 때문에 알고리즘을 가르치는 것인가를 생각하기 쉽지만 디자인 패턴에서는 구조적으로 이미 정의된 문제를 해결하는 방식을 알려줍니다. 이미 정형화된 패턴을 문제에 적용하는 점이 아무것도 없는 상태에서 하나 하나 설계하는 중에 최적화 작업을 하는 알고리즘과는 접근 방법이 조금 다르죠.

그리고 이런 디자인 패턴의 많은 부분이 객체 지향 언어에서 사용하는 것을 전제로 하기 때문에 C랑은 상당히 무관하다는 듯이 배우고, 가르치는 분들 또한 그렇게 가르칩니다. 컴퓨터공학 전공한 분들을 아시겠지만, 객체 지향 프로그래밍 과목을 수강한 후에 디자인 패턴에 대한 강의를 들을 수 있다는 것을 알 수 있습니다.

그러나, C에서도 객체지향을 실현할 수 있습니다. 객체 지향을 잘 활용하면 프로그램의 구조가 기존의 C 프로그램들과는 달리 크게 변하게 됩니다. 또한 각 함수들이 독립적으로 작동하게끔 만들 수 있습니다. 이를 위해서는 C로 객체 지향을 염두해 두고 설계하고 프로그래밍할 수 있어야 합니다. 특히, 현대의 임베디드 시스템들과 C 프로그래밍에서는 이런 사고가 상당히 많이 적용되어 있기 때문에 C를 할 수 있다고 하려면 이런 수준까지 할 수 있어야 합니다.

그래서, C로 객체 지향과 같은 설계와 프로그래밍을 할 수 있는 방법을 포스팅하려 합니다.

p.s. 기존의 리눅스 환경에서의 C 프로그래밍과 별도로 활동합니다.