내가 대학 다닐 시절에 처음으로 듣는 컴퓨터 관련 교양 과목은 아마도 '컴퓨터의 역사'나 '컴퓨터 개론' 뭐 이런거 였지 않나 싶다.
중요한 점은 그 과목들은 '어떻게' 컴퓨터가 발전해 왔는가에 대한 대답은 해주지만 '왜' 그렇게 발전해 왔는가에 대한 대답은 주지 않는다.
프로그래밍 언어에 대한 첫 수업을 들었을 때에도 마찬가지였다. C가 무엇인지는 가르쳐 주었지만 프로그래밍 언어의 큰 '흐름' 이나 '관계'에 대해서는 전혀 듣지 못했다.
이런 '개념'에 대한 부족은 사실 큰 그림으로 보면 한 가족인 COM, MFC, .NET Framework, JAVA 에 대한 '이해'를 매우 어렵게 만들었다. 이해가 힘들다 보니 배우기도 어렵고 '공포'스런 존재로 다가왔다.
이런 문제는 나에게도 어김없이 나타났다. 하지만 이것을 이겨내기 위한 나의 첫 단계는 C와 C++의 정복이었다. 나에게는 격하게 아끼는 책 두권이 있다. 바로 김상형님이 지은 혼자 연구하는 C/C++이라는 책인데 이책들이 나에게는 프로그램으로 향하는 길을 열어주었다.
이 책을 읽기 전에는 그저 C++은 C를 모태로한 발전된 형태의 언어라는 어렴풋한 개념을 가지고 있었는데 두 권을 읽으면서 확실한 개념적 차이를 알게 되었다. 이제부터 그책에서 얻은 지식과 잡다한 나의 지식을 모아 모아 최대한 쉽게 C와 C++에 대해서 이야기 하고자 한다. (수업에서는 얻을 수 없었던 그 이야기를)
사실 C와 C++는 '서로 틀리다'라고 말하는 것보다는 '프로그램을 구현(작성)하는 방식이 서로 틀리다' 라고 말해야 정확하다.
바로 '객체 지향 언어'와 '비 객체 지향 언어'의 차이에서 오는 '프로그램 작성 방식의 차이'가 C와 C++의 결정적 차이점이다.
비 객체 지향 언어라는 말은 객체 지향의 개념이 없으면 이해가 안되므로 다른 말로 바꿔서 '구조적 언어'라 할 수 있다.
과거 C로 작성된 언어들의 특징을 보면 '단일 프로그램'으로써 하나 혹은 몇개의 파일안에 하나의 프로그램을 돌리기 위한 함수들과 코드들이 모조리 들어가 있다.
이들의 연결 구조와 호출 관계는 프로그래머가 정의하는 것이 곧 '원칙'이요 '룰' 이기 때문에 서로 복잡하게 엉켜 있다. 즉, 프로그램을 구성하는 함수들이 '독립적'이지 못하고 서로가 서로에게 의존적이며 이곳 저곳에 난무 하는 전역 변수들이 전체 프로그램을 컨트롤 했다.
이런 방식의 프로그램 작성 기법을 '구조적' 이라 표현했는데 사실 적당히 어울리는 단어가 생각이 안난다. 아무튼... 그건 그렇고.. -_-
바로 이렇게 작성된 프로그램은 '재사용성'이 거의 없었다. 재사용성이라 함은 내가 짜놓은 코드를 다른 프로그램에서 가져다 사용하는 건데 '프로그래머 맘대로' 작성한 C 프로그램들은 필요한 일부의 코드만 가져다 쓸 수가 없었다. 왜? 전역 변수와 이곳 저곳에 흩어진 많은 다른 함수들이 서로 엉켜 있기 때문이다.
바로 이런 문제가 '소프트웨어의 위기'로 찾아온다. 80년 이후 하드웨어의 기술은 급격히 빨라져 자고나면 하드웨어 값이 떨어지고 하드디스크 용량이 2배로 뛰어 오를 그 시기에 소프트웨어의 발전은 더뎠다.
그 원인으로 지적된 것이 바로 C의 구조적 언어 작성법이었다. 지 맘대로 짜다보니 내가 짜 놓고도 몇 개월 지나서 보면 멍~ 때리게 되는 것이다.
그래서 이것을 해결하기 위해 C++, '객체 지향 언어'가 등장했다. 이 객체 지향 언어의 목표는 요약해서 말하자면,
2. 재사용 가능한 클래스로 모든 것을 구현하라!
이 두가지 룰을 지키게 되면 C++로 작성한 프로그램은 사용하는 모든 함수들이 클래스의 멤버 함수로 정의되고 전역변수를 전혀 사용할 필요가 없게 된다.
이 말을 쉽게 하면 프로그램을 블럭으로 나누어 작성하라는 말이다. 이 각각의 블럭이 바로 클래스 이고 이 클래스는 완전한 '독립체'로써 그냥 가져다 다른 프로그램에 쓸수가 있다. 바로 '재사용성'의 확보다.
그렇다면 왜 '재사용성'이 그리도 중요한가 궁금하지 않은가? :) 일단 '효율' 때문이다. 잘 만들어 놓은 클래스 하나는 어디서도 다시 사용이 가능하므로 개발자의 효율을 급격히 증가 시킨다.
이 효율의 장점은 곧바로 '돈'과 직결되므로 많은 개발자들이 이 방법을 따르기 시작했다.
이런 객체 지향 언어의 등장은 과거와는 다른 프로그래머와 사용자간의 계층을 만들게 되었다. 원래 과거에는 '개발자'와 '사용자' 딱 두개의 구분만 존재 했다. 개발자가 만들고 사용자가 사용하고. 간단하다.
지금은 '상위 개발자', '중급 개발자', '사용자' 이렇게 나뉜다. 상위 개발자는 중급 개발자에게 자신들이 공들여 안전하게 만든 수많은 클래스와 함수들을 라이브러리로 제공한다.
중급 개발자들은 바로 이 제공되는 아름답고 완벽한 클래스와 함수를 이용해서 자신이 원하는 프로그램을 작성해서, 사용자에게 유통하게 된다.
여기서 '표준적인 방식'이라 함이 바로 클래스와 클래스를 구성하는 멤버 함수 및 변수 작성법 그리고 생성자와 파괴자 규칙, 순수 가상 함수와 동적 연결, 추상 클래스와 상속 및 구현등 수많은 C++의 문법이다.
사실 이제는 C로도 객체 지향을 흉내 낼수 있지만 그래도 원조인 C++ 사용하는게 맞다.
두서 없이 쓴거 같아 잘 쓴건지 모르겠지만 글을 읽는 사람이 C와 C++의 차이를 이해할 수 있었으면 좋겠다. :)
'프로그래밍' 카테고리의 다른 글
객체 / 클래스 / 객체화 / 추상 클래스 (0) | 2009.03.13 |
---|---|
프로그램, 프로세스, 스레드 (2) | 2008.10.22 |
왜 객체 지향인가? (0) | 2008.01.11 |
젠장할 Direct Show (0) | 2008.01.10 |
RPCGEN (0) | 2007.11.09 |