블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

'객체 지향 언어'에 해당되는 글 3

  1. 2009.12.19 객체 지향의 이해 1 - 클래스
  2. 2008.10.18 객체 지향 언어(C++) V.S. 비 객체 지향 언어(C)2
  3. 2008.01.11 왜 객체 지향인가?
2009. 12. 19. 05:50 프로그래밍
C++이나 C#은 매우 크고 방대한 언어다. 문법도 많고 외워야 할 것도 많으며 규칙도 정말 많다. 책을 사서 1장 부터 읽다보면 3장쯤 가면 복잡해지기 시작하면서 뭐가 뭔 말인지 모르겠다... @.@ 한숨을 푹쉬고 책을 덮는다... 그리고 속으로 '더 쉬운책이 없을까?' 라고 생각한다.

내가 많이 겪은 경험이다. 이것은 책이 자습서로서의 역활을 못하고 있다는 말과 같다. 거대한 개념이 있다면 그것의 핵심에 접근하기 위해서는 부분 부분이 아닌 전체의 맥과 흐름을 집어주는 역활을 자습서는 반드시 해야 한다.

내가 읽어본 많은 책들은 그렇지 못했지만 유일하게 김상형님이 쓰신 모든 저서는 이 흐름을 잡아준다. C++, C#이라는 거대한 것을 하나하나 분리해 서로를 유연하게 연결한 다음 독자가 충분히 어떤것을 이해할 단계에 도착하면 거기서 거대한 전체 지도를 보여주면서 내가 왜 여기에 왔는지 그리고 앞으로 어떤 길을 가야 하는지 정확하게 알려준다.

김상형님의 책을 보면서 깨우친 것을 나름대로 정리하고자 하는데 그 첫째가 바로 객체 지향의 기본인 '클래스'이다.

가장 단순하게 클래스를 정의하면 C 구조체의 확장형태라고 생각할 수 있다. 그냥 뭐 이런 저런 변수를 담는 통으로 생각하기 쉽다.

하지만 C#에 들어오면서 완전 객체 지향성을 강조하게 되면서 구조체와 클래스는 '상속'이라는 결정적 차이를 가지게 된다. 바로 이 상속이 가능해 지면서 클래스는 '계층'이라는 말에 더 가까워 졌다.

상속인터페이스를 이용한 뚜렷하고 명확한 계층 구조의 클래스 설계로 한눈에 들어오는 구조적 설계가 가능해 졌다. 바로 이것이 객체 지향 프로그래밍의 핵심이다. (인터페이스는 차후 설명하겠다.)

예전에도 언급했듯이 이제는 프로그램 개발자가 두 부류로 분류가 된다. 첫째는 라이브러리 개발자다. 대형 회사, 즉, microsoft와 같은 회사에서 최종 사용자가 사용할 수많은 라이브러리 함수와 클래스를 만들어내는 사람을 말한다. 둘째는 최종 개발자다. 이 사람은 나와 같은 사람으로 대형 회사 개발자가 만들어 놓은 수많은 라이브러리 함수를 불러와 사용하기만 한다. 

고로 나와 같은 최종 개발자들은 내가 쓸 함수를 처음부터 일일이 만들어 쓰는게 아니라 '잘 불러다가' 쓰면 그만이다.

바로 이 '잘 불러다가'가 '구조 설계'이며 이 '구조 설계'를 위해 가장 사람에게 직관적이고 적합한 분류 방식이 계단식 방식, 이른바 'Class (계급 혹은 계층) 구조' 이다. 

내가 판단하기로는 클래스의 의미가 바로 여기서 나왔다고 생각하지만 물론 아닐 수도 있다. ㅋㅋㅋ (아님 말고)

상속은 부모 클래스의 모든 것을 재사용하며 동시에 추가적인 것을 곁들여 새로운 자식 클래스를 만들어내는데,  이것은 계층적 구조 설계에 딱 맞아 떨어지는 방식이다. 

클래스를 문법적으로 설명하자면, 생성자, 파괴자, 가상함수, 추상함수, 멤버 변수, 정적변수, 정적클래스, 봉인클래스, 순수 가상함수, 추상클래스 등등등등 수많은 것들이 존재하지만, 내가 이 글에서 말하고자 하는 것은 클래스라는 단어가 객체 지향 언어에서 선택 되었는가이다. 

거대한 객체 지향 언어를 한 두발 떨어져서 그 의미와 구조, 근원을 볼 수 있게 되면 세세한 문법과 규칙들이 너무나도 당연하게 받아들여지는 순간이 있다. 내가 원하는 것은 바로 그것이다.





posted by 대갈장군
2008. 10. 18. 01:25 프로그래밍

내가 대학 다닐 시절에 처음으로 듣는 컴퓨터 관련 교양 과목은 아마도 '컴퓨터의 역사'나 '컴퓨터 개론' 뭐 이런거 였지 않나 싶다.

중요한 점은 그 과목들은 '어떻게' 컴퓨터가 발전해 왔는가에 대한 대답은 해주지만 '왜' 그렇게 발전해 왔는가에 대한 대답은 주지 않는다.

프로그래밍 언어에 대한 첫 수업을 들었을 때에도 마찬가지였다. C가 무엇인지는 가르쳐 주었지만 프로그래밍 언어의 큰 '흐름' 이나 '관계'에 대해서는 전혀 듣지 못했다.

이런 '개념'에 대한 부족은 사실 큰 그림으로 보면 한 가족인 COM, MFC, .NET Framework, JAVA 에 대한 '이해'를 매우 어렵게 만들었다. 이해가 힘들다 보니 배우기도 어렵고 '공포'스런 존재로 다가왔다.

이런 문제는 나에게도 어김없이 나타났다. 하지만 이것을 이겨내기 위한 나의 첫 단계는 C와 C++의 정복이었다. 나에게는 격하게 아끼는 책 두권이 있다. 바로 김상형님이 지은 혼자 연구하는 C/C++이라는 책인데 이책들이 나에게는 프로그램으로 향하는 길을 열어주었다.

이 책을 읽기 전에는 그저 C++은 C를 모태로한 발전된 형태의 언어라는 어렴풋한 개념을 가지고 있었는데 두 권을 읽으면서 확실한 개념적 차이를 알게 되었다. 이제부터 그책에서 얻은 지식과 잡다한 나의 지식을 모아 모아 최대한 쉽게 C와 C++에 대해서 이야기 하고자 한다. (수업에서는 얻을 수 없었던 그 이야기를)

사실 C와 C++는 '서로 틀리다'라고 말하는 것보다는 '프로그램을 구현(작성)하는 방식이 서로 틀리다' 라고 말해야 정확하다.

바로 '객체 지향 언어'와 '비 객체 지향 언어'의 차이에서 오는 '프로그램 작성 방식의 차이'가 C와 C++의 결정적 차이점이다.

비 객체 지향 언어라는 말은 객체 지향의 개념이 없으면 이해가 안되므로 다른 말로 바꿔서 '구조적 언어'라 할 수 있다.

과거 C로 작성된 언어들의 특징을 보면 '단일 프로그램'으로써 하나 혹은 몇개의 파일안에 하나의 프로그램을 돌리기 위한 함수들과 코드들이 모조리 들어가 있다.

이들의 연결 구조와 호출 관계는 프로그래머가 정의하는 것이 곧 '원칙'이요 '룰' 이기 때문에 서로 복잡하게 엉켜 있다. 즉, 프로그램을 구성하는 함수들이 '독립적'이지 못하고 서로가 서로에게 의존적이며 이곳 저곳에 난무 하는 전역 변수들이 전체 프로그램을 컨트롤 했다.

이런 방식의 프로그램 작성 기법을 '구조적' 이라 표현했는데 사실 적당히 어울리는 단어가 생각이 안난다. 아무튼... 그건 그렇고.. -_-

바로 이렇게 작성된 프로그램은 '재사용성'이 거의 없었다. 재사용성이라 함은 내가 짜놓은 코드를 다른 프로그램에서 가져다 사용하는 건데 '프로그래머 맘대로' 작성한 C 프로그램들은 필요한 일부의 코드만 가져다 쓸 수가 없었다. 왜? 전역 변수와 이곳 저곳에 흩어진 많은 다른 함수들이 서로 엉켜 있기 때문이다.

바로 이런 문제가 '소프트웨어의 위기'로 찾아온다. 80년 이후 하드웨어의 기술은 급격히 빨라져 자고나면 하드웨어 값이 떨어지고 하드디스크 용량이 2배로 뛰어 오를 그 시기에 소프트웨어의 발전은 더뎠다.

그 원인으로 지적된 것이 바로 C의 구조적 언어 작성법이었다. 지 맘대로 짜다보니 내가 짜 놓고도 몇 개월 지나서 보면 멍~ 때리게 되는 것이다.

그래서 이것을 해결하기 위해 C++, '객체 지향 언어'가 등장했다. 이 객체 지향 언어의 목표는 요약해서 말하자면,

1. 전역 변수를 쓰지말라! (프로그램의 독립성을 심히 훼손하므로)
2. 재사용 가능한 클래스로 모든 것을 구현하라!

이 두가지 룰을 지키게 되면 C++로 작성한 프로그램은 사용하는 모든 함수들이 클래스의 멤버 함수로 정의되고 전역변수를 전혀 사용할 필요가 없게 된다.

이 말을 쉽게 하면 프로그램을 블럭으로 나누어 작성하라는 말이다. 이 각각의 블럭이 바로 클래스 이고 이 클래스는 완전한 '독립체'로써 그냥 가져다 다른 프로그램에 쓸수가 있다. 바로 '재사용성'의 확보다.

그렇다면 왜 '재사용성'이 그리도 중요한가 궁금하지 않은가? :) 일단 '효율' 때문이다. 잘 만들어 놓은 클래스 하나는 어디서도 다시 사용이 가능하므로 개발자의 효율을 급격히 증가 시킨다.

이 효율의 장점은 곧바로 '돈'과 직결되므로 많은 개발자들이 이 방법을 따르기 시작했다.

이런 객체 지향 언어의 등장은 과거와는 다른 프로그래머와 사용자간의 계층을 만들게 되었다. 원래 과거에는 '개발자'와 '사용자' 딱 두개의 구분만 존재 했다. 개발자가 만들고 사용자가 사용하고. 간단하다.

지금은 '상위 개발자', '중급 개발자', '사용자' 이렇게 나뉜다. 상위 개발자는 중급 개발자에게 자신들이 공들여 안전하게 만든 수많은 클래스와 함수들을 라이브러리로 제공한다.

중급 개발자들은 바로 이 제공되는 아름답고 완벽한 클래스와 함수를 이용해서 자신이 원하는 프로그램을 작성해서, 사용자에게 유통하게 된다.

다시 말해서 객체 지향 언어는 프로그램을 작성하는 일종의 '표준적인 방식 또는 틀' 제시해 줌으로써 언어의 '재사용성'과 효율을 높여 소프트웨어 개발에 큰 도움을 주는 놈이다.

여기서 '표준적인 방식'이라 함이 바로 클래스와 클래스를 구성하는 멤버 함수 및 변수 작성법 그리고 생성자와 파괴자 규칙, 순수 가상 함수와 동적 연결, 추상 클래스와 상속 및 구현등 수많은 C++의 문법이다.

고로 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
posted by 대갈장군
2008. 1. 11. 07:32 프로그래밍
C++를 예전부터 알아왔지만 그저 외워야 할, 알아야 할 언어라고 생각했을뿐 그 진정한 필요성과 효용에 대해서는 통감한 적이 없었다.

하지만 현재 여러사람이 하는 프로젝트를 하다보니 이게 왜 필요한가 그리고 왜 C++같은 객체 지향적 언어가 필요한가를 심히 알것 같다.

우선 객체 지향 언어의 대표적인 특징이 캡슐화가 꼭 그룹 프로젝트에서는 필요하다고 본다.

물론 코드가 적고 간단한 경우는 오히려 이놈의 객체 지향 언어가 짜증난다. 생성자, 파괴자, 멤버 함수, 공개, 보호, 등등... 이거 뭐 제대로 작동하게 만들기 부터 쉽지가 않다.

하지만 제대로 만들어진 클래스 한개의 파워는 상상을 초월하는 것 같다.

진정한 부품 조립형 프로그래밍의 파워가 바로 클래스에서 출발하는 것이다.

우리 연구실에서 주로 사용하는 TCP/IP 통신을 누군가가 멎진 클래스로 만들어서 배포했다... 사용을 어떻게하는지 읽어보는데 시간이 좀 소모되겠지만 그 사용 효과는 끝내준다.

마치 우리가 C를 처음 배울때 printf 하나만으로도 놀랬던 그 시절로 돌아가는 기분을 느끼게 해준다.

수업들으면서 C로 프로그래밍 할때는 한번 짜놓고 나면 6개월 정도 지나서 다시 볼려고 하면 골이 띵 해온다... 하지만 객체 지향으로 짜 놓고 약간의 주석과 사용방법 등만 기술해 놓으면 언제든지 부품처럼 가져다 와서 쓸수 있으니 이 얼마나 좋은가?

비록 이번 학기에 들었던 교수님의 말에 의하면 객체 지향 언어는 곧 망할거라는데... 글쎄? 프로그래밍에 아직 무지한 나로써는 아닌거 같은데요? =.=
posted by 대갈장군
prev 1 next