3.12.객체지향 프로그램과 클래스
3.12.1.C++의 특징은 객체지향이 아니라 클래스의 추가입니다.
C에서는 모듈방식으로 프로그램을 짰지만 C++에서는 객체지향 방식으로 짭니다.
C++언어를 배우는 사람이 가장 어렵게 생각하는 내용이 객체와 클래스입니다. 기존의 모듈방식으로 프로그램을 짜던 분들이 객체지향이라는 말에서 더 이상 진전하지 못하고 막히는 경우를 많이 봤습니다.
모듈(module)에 관해서는 변수를 설명할 때 잠깐 설명을 드린 적이 있습니다. 일련의 작업을 수행하는 하나의 단위를 말하는 낱말입니다. 때문에 모듈은 작게는 하나의 명령어나 함수를 모듈의 단위로 사용할 수도 있고, 하나의 블럭이나 소스파일, 프로그램을 모듈로 사용할 수 있습니다.
성적관리 프로그램이 채점하는 과정, 합계를 내는 과정, 평균 점수를 계산하는 과정, 등수를 매기는 과정으로 구성된다고 할 때, 각 과정은 하나의 단위 즉, 하나의 모듈이 됩니다. 또한 이런 작은 단위의 모듈이 모여 성적관리 프로그램이라는 좀더 큰 단위를 이룹니다. 때문에 모듈 중심의 프로그램이라고 하면 어떤 작은 명령을 수행하는 단위들을 하나씩 만들어가면서 더 큰 단위를 완성시키는 방식을 말합니다. 주로 어떤 작업을 수행하는 함수를 만들어서 더 큰 기능을 가진 함수를 만드는 프로그램 방법을 모듈방식이라고 말합니다. 그러나 C++에 와서는 모듈방식보다는 객체지향 방식으로 프로그램을 짜야 합니다.
C++의 가장 큰 특징은 클래스 기능의 추가입니다.
책의 앞부분에서 저는 C++의 원래 이름은 'C with the Class'라고 말씀드렸습니다. 번역하면 '클래스를 가진 C'라는 뜻입니다. 다시 말해서 C++언어의 가장 큰 특징은 클래스라는 점입니다. 그리고 클래스는 객체지향 프로그램을 만들 때 매우 유용하게 사용할 수 있는 개념이자 도구입니다.
이름에서 알 수 있는 것처럼 C++이 C와 다른 최대 특징은 클래스가 추가되었다는 점입니다. 그리고 클래스가 추가됨으로 인해 프로그램을 만드는 방법에 큰 변화가 생깁니다. 객체를 중심으로 접근하는 방식으로 변화한 것입니다.
그렇다면 객체지향 프로그램은 C++만의 특징이고 C언어로는 불가능한가? 그렇지 않습니다. C언어나 다른 언어로도 객체지향 프로그램을 만들 수 있습니다. 객체지향 프로그램은 프로그래머가 어떤 방식으로 접근하느냐의 차이에서 비롯되는 것이지 언어의 기능에 따라서 달라지는 것이 아닙니다.
그렇다면 왜 C++언어 와서 객체지향 프로그램의 개념이 중시되었으며 왜 C++을 객체지향 언어라고 말하는 것일까요? 그 까닭은 C++에 클래스라는 개념이 추가되었는데 클래스가 이전의 언어와는 달리 객체지향 프로그램을 쉽게 만들도록 도와주기 때문입니다. 그러니까 기존의 C언어로도 객체지향 프로그램을 만들 수는 있지만 10이라는 노력이 필요한데 비해, C++을 이용할 경우 1이나 2 정도의 노력만 기울여도 손쉽게 객체지향 프로그램을 만들 수 있다는 뜻입니다. 따라서 C++언어의 특징으로 손꼽는 '객체지향 언어'적인 특징은 사실 다른 언어에도 가능하므로 C++만의 특징으로 내세울 수 없습니다. 정확한 C++언어의 특징은 '클래스의 추가'라고 말할 수 있습니다.
**요약: 다른 언어에서도 객체지향 프로그램이 가능하지만 C++에서 더욱 손쉽게 짤 수 있어 C++을 객체지향 중심의 언어라고 말합니다.
3.12.2. '나는 사과를 먹는다'에서 주체는 '나'이고 객체는 '사과'입니다.
주체가 바라보는 모든 대상이 객체입니다.
그렇다면 객체는 무엇일까요? 주체의 반대말입니다. 그럼 주체는 무엇이고 객체는 무엇일까요? 이는 이미 국어시간을 통해서 우리가 숱하게 익혀온 개념입니다.
'나는 사과를 먹는다'에서 주체는 무엇입니까? '나'입니다. 그럼 객체는 무엇입니까? '사과'입니다. 이 정도 내용은 국어시간을 통해서 숱하게 배운 것입니다. 내가 주체가 되어 객체를 바라보거나 객체를 다룹니다. 주체인 '나'가 사과를 보기도 하고, 던지기도 하고, 먹기도 합니다.
'나는 칼로 사과를 깎는다'에서 주체는 '나'입니다. 그렇다면 객체는 '사과'뿐일까요? '사과'와 '칼'이 객체가 되죠. 주체인 나를 제외한 모든 사물을 객체가 됩니다. 다시 말해서 주체가 인식할 수 있는 객관적인 사물은 모두 객체라고 부릅니다.
프로그램에서 주체는 프로그램이고 객체는 자료입니다.
그렇다면 프로그램에서 주체는 무엇이고 객체는 무엇일까요? 성적관리 프로그램을 예로 들어보겠습니다. 언어를 배우게 되면 가장 많이 짜보는 예제 프로그램이 성적 관리 프로그램입니다. 데이터베이스의 기초개념을 익힐 수 있으며, 파일입출력을 비롯한 대부분의 언어 개념을 응용해야 하기 때문입니다. 성적관리 프로그램에서 주체는 무엇이고 객체는 무엇일까요? 성적표 즉, 과목과 점수가 객체입니다. 그리고 이들 객체를 다루는 프로그램 즉, 함수 부분이 주체가 됩니다.
사람의 입장에서 생각해보시기 바랍니다. 선생님이 성적표를 관리합니다. 과거에는 선생님이 일일이 손으로 점수를 매기고 계산기를 두드려서 평균을 내고, 순위를 매겼죠. 이때 점수를 계산하고 등수를 매기는 일을 하는 선생님이 주체입니다. 그리고 모든 학생의 점수는 객체가 됩니다. 그래서 주체인 선생님이 객체를 다루게 되는 것입니다. 설마 선생님이 객체고 점수가 선생님을 다루어서 조정한다는 생각을 하시는 분은 없겠죠?
컴퓨터 프로그램에서도 마찬가지입니다. 선생님이 채점할 때 점수가 객체인 것처럼 컴퓨터 프로그램에서도 점수가 객체가 됩니다. 그렇다면 점수를 다루어 합계와 평균을 내고 등수를 내는 선생님 역할을 누가 합니까? 프로그램이 하죠. 따라서 성적관리 프로그램에서 주체는 점수를 계산하는 프로그램입니다.
객체 지향 프로그램은 객체 입장에서 생각하는 프로그램입니다.
과거에는 주체 위주로 프로그램을 만들었습니다. 따라서 어떻게 주체인 프로그램을 짜느냐가 주안점이었습니다. 어떻게 해야 합계를 내는 함수를 만들고 어떻게 해야 평균을 내고, 등수를 매기는 함수를 만들 것인가가 프로그래머가 고민하는 내용이었습니다.
그러나 객체지향 프로그램이 되면서 이런 개념이 완전히 뒤바뀝니다. 객체를 중심으로 프로그램을 짜게 되니까요. 객체지향 프로그램에서는 어떻게 합계를 내는 함수를 만들 것인지가 고민거리가 아닙니다. 어떻게 해야 점수를 잘 활용할 수 있을까? 어떻게 점수의 형태를 정할 것인가 하는 일이 고민거리입니다.
프로그램 역시 달라지겠죠? 과거에는 선생님이 점수를 합산하고 평균을 냈습니다만, 이제는 점수가 선생님으로 하여금 어떤 일을 시킬 것인가 고민하는 것입니다. 점수가 선생님을 부려먹는다는 개념이 이해가 안되죠? 한낱 자료에 불과한 점수가 거꾸로 주체인 사람의 행동을 결정하다니? 그러나 이것이 객체지향 프로그램의 특징입니다. 분명 객체는 점수이고 객체 위주로 프로그램을 짜는 것이 객체지향 프로그램이니까요.
사람 사는 세상에서도 객체지향 중심의 제도가 많이 활용되고 있습니다. 법을 예로 듭시다. 법이 처음 만들어질 때는 '주체인 사람들이 어떻게 해야 세금을 걷고, 국회의원을 만들며, 범죄를 예방하고, 자동차를 구입해서 활용하는가'를 생각합니다. 그러나 사람들이 많아지면 제각각 목소리가 달라집니다. 누구는 세금을 올리자 하고 누구는 내리자고 합니다. 그래서 사회가 복잡해질수록 주체 중심으로 법률이 만들어지지 못하고 객체 위주로 만들어집니다. 다시 말해서 사람이 법을 만드는 것이 아니라 법의 성격을 규정하고 사람이 그 법에 맞추어 움직이는 것입니다.
휴대폰 사용이 늘어서 교통사고가 증가할 경우, 사람들이 법의 적용을 마음대로 하여 형을 정하는 것이 아닙니다. 도로교통법의 성격을 바꾸고 여기에 운전중 휴대폰 사용에 관한 형벌이라는 함수를 추가합니다. 그래서 도로교통법은 운전중 휴대폰 사고에 관한 내용을 다룰 수 있는 자료가 되고, 또한 이를 처리할 수 있는 각종 조치(=함수)를 포함한 객체가 됩니다. 그리고 이렇게 정의된 객체에 맞추어 사람들의 행동이 변화해야 합니다. 성격이 변화된 도로교통법에 따라서 사람들은 운전중 휴대폰 사용을 금지해야 하는 것입니다. 이때 주체인 사람들의 개성이 모두 다르겠지만 예외 없이 통용됩니다. 주체의 성격이나 특징은 완전히 무시됩니다. 주체는 객체인 도로교통법에 의해서 좌우될 뿐입니다.
다른 법률, 다른 문화적인 문제들도 같은 맥락으로 변화합니다. 담배와 금연에 관해서 생각해봅시다. 10명의 사람이 있고 주체 중심일 때는 각 개인의 특성에 따라서 금연에 관한 조치를 만듭니다. 과거의 사고방식은 사람 위주였습니다. 그래서 금연에 관해서 다음과 같은 주체 중심의 사고가 있었습니다. '나는 성인 남자니까 아무 곳에서나 담배를 펴도 되지만, 미성년자는 절대 안되고, 여자도 담배를 피면 안되는 일이야.' 그러나 객체 중심으로 사고를 하면 담배 중심으로 사고를 펴야 합니다. '나는 담배야. 음... 나는 누구나 필 수 있어. 그러나 나는 몸에 해로운 성격을 지니고 있고, 반대로 스트레스를 해소하는 성격도 있지. 따라서 나를 필 수 있는 사람들의 조건을 제한할 필요가 있군. 어린아이나 여자들은 피지 않는게 좋겠군.'
이처럼 객체지향이란 객체의 관점에서 바라보는 프로그램 방식을 뜻합니다. 어렵게 생각할 필요 없습니다. 객체를 어떻게 규정할 것인가가 객체 지향 프로그램의 주안점이라고 생각하면 됩니다.
**요약: 객체지향이란 객체의 관점에서 프로그램을 어떻게 만들 것인가 고민하는 방식을 뜻합니다. 즉 객체를 어떻게 구성할 것이냐가 프로그램의 주안점입니다.
3.12.3.객체지향 프로그램의 활용과 장점
모듈방식은 주체중심적인 프로그램 제작방식입니다.
예를 들어서 성적관리 프로그램을 만든다고 합시다. 이때 모듈중심 방식으로 프로그램을 짤 때의 프로그래머의 생각은 다음과 같은 순서를 따라갑니다.
** 주체중심 또는 모듈방식으로 짤 때
우선 큰 메뉴를 몇 개로 만들지 결정해야지. 파일 다루는 메뉴, 성적을 계산하는 메뉴, 입력과 출력 메뉴, 도움말 메뉴로 만들면 되겠군. 그럼 4개의 메인메뉴를 화면에 보여주는 함수와 메뉴 사이를 이동하는 함수, 메인 메뉴 중 하나를 선택했을 때 서브 메뉴가 나타나도록 하는 함수를 만들어야지.
성적계산 메뉴를 선택했을 때는 합계점수 계산하기와 평균점수 계산하기 등수 계산하기 메뉴가 나오면 될테니 각각의 함수를 만들어야지.
그럼 성적관리 프로그램에서 필요한 자료의 항목은 국어점수 항목, 영어점수 항목, 수학점수 항목 3개에, 학생번호 항목, 함계점수 항목, 평균점수 항목, 등수 항목을 포함하여 모두 7개의 항목으로 구성되는군. 그리고 각 항목은 계산이 가능한 숫자형 자료를 사용하면 되고, 100 이하의 숫자만을 사용하니까 데이터형이나 변수형은 정수형을 써도 충분하겠군.
그럼 전체 데이터를 보자. 학생별로 7개의 항목으로 구분된 데이터를 차례대로 입력한 다음에 이를 일렬로 저장하면 되는군. 그렇다면 학생수와 학생수마다 7개의 항목을 지닌 2차원 배열로 데이터 파일을 구성하면 되겠구나.
데이터파일의 구조를 결정했으니 이제 학생번호와 국영수 점수를 입력받는 입력함수를 만들고, 이를 더해 합계를 내는 함수, 평균을 내는 함수, 등수를 매기는 함수를 만들고, 이상의 과정을 통해 얻은 결과를 파일에 저장하는 함수를 만들어야 하겠군.
......
이런 식으로 계속해서 메인메뉴를 생각해내고 서브 메뉴를 생각해내고, 데이터의 형태와 저장방법을 생각한 다음에 입출력, 계산하는 고정을 다룰 각종 함수를 하나씩 만들어 나가는 형태입니다. 그리고 이렇게 만든 프로그램에 점수를 입력하면 됩니다. 그래서 모듈방식에서는 점수라는 객체는 소외됩니다. 점수라는 객체는 정수형으로 정의된 1바이트의 자료형이라는 생각이 정리되는 것으로 더 이상 관심의 대상이 되지 않습니다. 프로그래머는 이제 정수형 자료를 입력하고 계산하고 출력하는 함수를 만드는데 골몰합니다. 프로그램 자체에 중점을 두는 것입니다.
객체중심 프로그램은 객체를 가장 우선적으로 생각합니다.
반면 객체중심으로 프로그램을 짤 때는 객체의 성격과 형태를 어떻게 만들 것이냐가 중요합니다. 그러니까 객체의 성격이 결정되면 프로그램이나 각종 함수는 저절로 결정되는 것입니다. 객체지향으로 프로그래을 짤 때는 다음과 같은 식으로 생각을 폅니다.
** 객체지향 방식으로 짤 때
성적관리 프로그램이니까 점수를 어떻게 활용할 것인가가 가장 큰 문제겠군. 그렇다면 이 프로그램의 가장 중요한 객체는 점수인데, 먼저 점수의 성격을 정해야겠군. 먼저 점수는 이름을 가질테지. 그리고 이름에 따라서 형태도 다르겠지. 점수는 국어, 영어, 수학 점수의 이름을 가지면 되겠고, 점수의 형태는 0~100점까지니까 정수형이면 되겠군. 여기에 학생번호, 합계점수, 평균점수, 등수도 국어점수와 같은 지위를 가지도록 설정해야 하는군.
자 이제 프로그램이 점수와 등수 등을 활용하려면 입출력이 가능해야하겠군. 이중에서 학생번호와 국영수 점수는 직접 입력하는 성격을 가졌으니 사람의 손을 통한 입출력을 이용해 수정이 가능해야하겠고, 합계와 평균점수 등수는 국영수점수를 이용하여 프로그램이 알아서 처리한 다음에 결과를 알려주니까 사람이 입출력하거나 수정할 필요는 없군. 대신 프로그램이 등수를 바꿀 수 있도록 만들어야겠군. 그리고 점수와 등수는 화면에 출력해야 하니까 프로그램에게 자료를 보내줄 필요가 있군. 그럼 이에 관한 입출력, 수정방법을 각 항목별로 정의해놓아야겠군. 그리고 입출력이 가능하도록 각 객체에 입출력을 다루는 함수도 만들어주어야겠고.
이렇게 해서 점수 데이터라는 객체의 형태와 구조가 결정되었으니 이 객체의 입출력방법을 이용해 자료를 입출력받고, 화면에 내용을 보여주고, 수정하는 함수와 파일에 저장하는 함수를 이 객체의 입출력함수와 연결시켜야겠군. 그리고 객체로부터 받은 자료에 합계, 평균, 등수를 내서 다시 돌려주는 함수를 만들어야겠군. 이렇게 하면 대충 프로그램의 기본적인 골격이 잡힌 셈이군.
객체지향 프로그램은 이와 같은 순서로 생각을 풀어갑니다. 일반적인 과정은 객체의 성격을 생각해내고 객체의 형태와 구조를 정하고, 객체를 다룰 함수를 객체 안에 포함시킵니다. 이런 과정을 통해 객체를 완성한다면 이 객체를 다룰 프로그램이나 함수를 만들기만 하면 됩니다.
객체지향 프로그램의 장점은 재활용성이 좋고, 안정적이라는 점입니다.
그렇다면 객체지향 프로그램의 장점은 무엇일까요? 자료나 소스코드의 재활용성이 좋아진다는 점입니다. 또한 좀더 안정적인 프로그램 제작이 가능합니다. 재활용성이 좋아진다는 말은 프로그램을 보수, 유지, 수정, 확장하는 일이 쉽다는 말과 같습니다. 간단하게 말해서 프로그램을 만들 때 노력이 덜 들어간다는 뜻입니다. 안정적이라는 말은 프로그램을 만들 때 벌레 그러니까 엉뚱한 결과가 나오도록 짤 확률이 줄어든다는 뜻입니다.
예컨대 모듈방식으로 프로그램을 짤 때는 100명이 일 년 걸릴 프로그램을 객체 지향 방식으로 짜면 10명이 일 년에 짤 수도 있습니다. 왜 그럴까요? 프로그래머가 신경 써야할 부분이 줄어들기 때문입니다.
모듈방식으로 프로그램을 짤 때는 프로그래머가 프로그램 전체를 파악하고 있어야 합니다. 성적관리 프로그램의 첫머리에서 수학점수를 입출력하기 위한 변수로 math라는 변수를 선언하고 사용했다고 합시다. 이 변수는 자료입력함수를 비롯하여 파일오픈, 합계내기, 평균내기, 출력하기, 파일에 저장하고 끝내기까지 계속적으로 사용되는 경우가 대부분입니다. 따라서 math 변수가 프로그램 내에서 어떻게 사용되는지 처음부터 끝까지 추적해가면서 소스파일을 분석해야만 math 변수의 역할을 겨우 파악할 수 있습니다.
소스파일이 몇 백 줄에 불과할 때는 그리 큰 문제가 아니지만 몇 백만 줄이 될 때는 이런 방식은 매우 심각한 문제가 됩니다. 몇 백만 줄을 한 번 읽어보고 분석하는데만 몇 년이 걸릴 수 있으니까요. 프로그램 제작에 매달린 모든 프로그래머가 이처럼 소스파일 전체 내용을 파악하면서 프로그램을 짜는 일은 매우 어려운 일이며 비용도 크게 들어갑니다.
객체지향 방식은 소스파일을 모두 통달하지 않아도 됩니다.
만약 새로 입사한 프로그래머에게 이전의 성적관리 프로그램에 없던 새로운 기능으로 인터넷을 통해 수학점수를 입력받고 등수를 알려주는 기능을 추가하라고 지시내렸다고 합시다. 이 경우 새로 들어온 프로그래머는 이전의 프로그램에서 수학점수를 어떻게 입력받고 출력하며, 어떤 함수로 어떻게 평균과 등수를 매겼으며, 어떤 식으로 파일에 저장하고 출력했는지를 알아야 합니다. 그래야만 통신으로 입력받는 점수를 변수와 데이터파일에 기록하고 평균과 등수를 낸 다음에 이를 다시 통신으로 알려주는 함수를 만들 수 있습니다. 한 마디로 프로그램 전체를 모두 파악하고 있어야 하는데 이는 매우 어려운 작업입니다. 통신으로 자료를 주고받는 함수만 만들어서는 활용할 수 있는 방법이 없습니다.
반면 객체지향 중심으로 짜게 되면 객체의 성격과 구조만 파악하면 됩니다. 그런 다음에 새로 입사한 프로그래머는 통신을 통해 자료를 주고받는 함수만 만들어 추가하면 됩니다. 입력받은 자료를 수학점수로 기록하고 평균을 내고 합계를 내며, 이를 다시 되돌려주는 기능과 함수는 객체 안에 이미 다 갖추어져 있습니다. 따라서 프로그래머는 객체의 구조만 알면 되며, 객체와의 입출력방법만 알면 됩니다. 어떻게 평균을 내고 등수를 내는지는 알 필요도 없습니다.
이처럼 객제지향 중심의 프로그램은 소스파일의 크기가 커질수록 빛을 발휘합니다. 다른 말로 하자면 간단한 프로그램을 만들기 위하여 객체지향 프로그램 방식을 고집할 필요는 없다는 뜻입니다. 간단한 프로그램이라면 오히려 모듈방식이 훨씬 효율적입니다.
객체지향 방식은 프로그래머의 실수를 줄여줍니다.
객체지향의 장점 중 또 하나는 프로그래머의 실수를 줄여준다는 점입니다. 예를 들어서 모듈방식으로 성적 관리 프로그램을 만들면서 num이라는 변수를 처음에는 학생번호 입력용으로 사용했습니다. 그런데 프로그램이 수 백 만 줄 되면 자신이 어떤 변수를 사용했는지도 까먹게 됩니다. 이를 깜박하고 중간에 num이라는 변수를 다시 선언하거나 또는 변수의 성격을 착각하여 등수를 뜻하는 변수로 사용했다고 합시다. 이럴 경우 프로그램을 실행시키면 이상한 오류가 발생합니다. 그리고 수 만 줄을 뒤져가면서 이런 오류를 찾기란 생각보다 쉽지 않습니다.
그러나 객체지향 방식은 이런 오류를 줄여줍니다. 모든 자료와 변수를 객체 안에서 철저하게 통제되기 때문에 잘못된 변수 사용으로 인하여 학생번호와 등수가 혼동되는 일이 발생하지 않습니다. 다시 말해서 같은 이름의 변수가 아무리 많더라도 혼동되어 사용될 일이 없습니다. 이에 대한 내용은 클래스에서 다시 다루겠습니다만, 하여간 객체지향 프로그램은 프로그래머의 오류를 줄여주는데 큰 효력을 발휘합니다.
이런 여러 가지 장점 때문에 요즘은 객체지향 프로그램이 큰 흐름을 형성하고 있습니다. 객제지향으로 프로그램을 만들건 모듈 방식으로 만들건 프로그램의 결과는 같습니다. 그러나 프로그램을 만드는데 들어가는 비용과 노력에는 큰 차이가 있습니다. 최근의 프로그램은 덩치가 커지기 때문에 과거처럼 모듈 중심의 프로그램으로는 너무 많은 비용이 지불됩니다. 이런 이유 때문에 객체지향을 외치는 것입니다.
**요약: 객체지향 방식의 프로그램은 적은 비용으로 대형 프로그램을 손쉽게 만들 수 있으며, 프로그램의 오류를 줄여주는 장점이 있습니다.
3.12.4.스프레드시트 파일의 객체 활용 사례
지금까지 우리가 배운 모든 자료, 변수, 함수는 객체가 될 수 있습니다.
컴퓨터언어에서 객체는 자료인데 그 자료의 형태는 변수일 수도 있고, 함수일 수도 있습니다. 또는 이러한 모든 것을 포함하는 형태일 수도 있습니다. 지금까지 변수와 함수를 구별해서 배웠던 분들에게 이 말은 매우 혼란스럽게 다가옵니다. 변수면 변수고 함수면 함수지, 변수이자 함수인 것은 도대체 어떤 형태란 말인가?
좀더 쉽게 설명드리자면 객체의 구성요인에 변수와 함수가 포함되는 것입니다. 객체의 형태는 변수와 함수가 복합적으로 얽힌 형태입니다. 그렇다면 지금까지 저희가 다룬 소스파일과 유사하지 않을까요? 지금까지 저희는 변수를 선언하고 함수를 이용하여 출력하는 연습을 했습니다. 이 예제 전체가 하나의 객체로 사용될 수 있다는 말과 비슷합니다. 다만 그동안의 소스파일과 다른 점은 변수와 함수가 서로 필수적인 관계로 밀착되어 있으며, 객체를 정의하는 방법을 따라야한다는 점이 다를 뿐입니다.
객체가 함수도 되고 변수도 된다는 개념이 혼란스러울 수 있지만 사실 함수도 되고 변수도 되는 객체는 우리가 지금도 자주 사용하고 있습니다. 객체가 중심인 프로그램은 주변에서 많이 볼 수 있습니다. 가장 대표적인 프로그램이 데이터를 다루는 데이터베이스 프로그램과 스프레드시트 프로그램입니다. 데이터베이스 프로그램에서 중요한 것은 데이터이지 프로그램이 아닙니다. dBASEIII+라는 프로그램에서 다루는 데이터는 클리퍼, 폭스프로, 패러독스 등의 다른 프로그램에서도 사용할 수 있습니다. 다시 말해서 데이터베이스 파일이라는 자료이 있고, 이 자료를 좀더 잘 활용하기 위하여 새로운 프로그램이 출현한 셈입니다. 로터스라는 프로그램에서 다루던 스프레드시트 파일 역시 데이터 즉, 객체덩어리인 셈입니다. 그러나 스프레드시트 파일을 다루기 위한 각종 프로그램이 계속 개발되고 있습니다.
데이터베이스 프로그램이나 스프레드시트 프로그램에서 가장 중요한 것은 자료구조와 자료의 성격을 어떻게 정할 것인가입니다. 또한 이들 자료를 외부 프로그램에서 어떻게 활용할 수 있도록 만들 것인가 하는 문제입니다. 그래서 데이터베이스 파일이나 스프레드시트 파일은 매우 복잡하면서도 유연한 구조를 가지고 있습니다.
엑셀과 같은 스프레드시트 프로그램은 객체지향적인 프로그램입니다.
많은 분들이 무심코 사용하는 스프레드시트 파일은 사실 객체지향의 성격을 잘 보여주는 예입니다. 많은 분들이 잘 아시는 마이크로소프트사의 엑셀은 스프레드시트 프로그램입니다. 이 엑셀 프로그램에서 다루고자 하는 자료는 주로 숫자입니다. 이들 숫자는 스프레드시트 파일에 기록되어 있습니다. 파일은 셀이라는 사각형의 기록공간을 가지고 있습니다. 이 셀에는 숫자를 기록할 수도 있고, 문자를 기록할 수도 있으며 더하기 명령을 뜻하는 sum함수를 입력할 수도 있습니다. 그러니까 셀 하나하나는 하나의 객체로 활용되는 것입니다. 이때 셀이라는 공간은 수학점수를 기록할 수도 있지만 함수로도 활용할 수 있습니다. 변수와 함수가 같은 공간에서 사용가능하다는 점을 엑셀의 셀은 잘 보여주고 있는 것입니다.
따라서 데이터베이스나 스프레드시트 파일을 자료를 테이블형식으로 펼쳐놓은 화면은 객체를 상하좌우로 펼쳐놓은 것과 같습니다. 위아래나 좌우로만 자료를 펼쳐놓았다면 1차원적인 객체의 나열이 되겠지만 브라우즈(browse) 화면처럼 상하좌우로 셀(데이터베이스에서는 필드라고 말함)을 펼쳐놓았다면 2차원 객체의 나열이 됩니다.
이는 이미 우리가 배운 1차원 배열, 2차원 배열의 형태와 다를 바 없습니다. 그렇다면 셀이 배열과 다른 점은 무엇일까요? 배열에서 하나의 배열은 하나의 변수 역할을 하며 하나의 고정된 자료형만을 다룰 수 있습니다. 그러니까 정수형 배열을 선언하면 각 배열 요소는 정수형 숫자를 하나씩 저장할 수 있는 변수로 활용됩니다. 그러나 엑셀 파일의 셀이나 데이터베이스 파일의 필드처럼 변수로도 활용할 수 있고 함수로도 활용할 수 있는 것이 차이점입니다. 또한 하나의 데이터베이스에 문자, 숫자, 함수, 논리, 메모 등의 다양한 형태의 자료를 기록하고 활용할 수 있다는 점이 다릅니다.
이처럼 다양한 형태의 자료를 하나의 자료 뭉치로 다루는 기술은 C언어의 구조체나 공용체에서 이미 선보인 기술입니다. 그러나 만약 이 책으로 C++언어에 처음 입문하신 분이라면 구조체나 공용체와 같은 개념을 배운 적이 없는 분입니다. 물론 이 책에서 구조체나 공용체를 다루지 않습니다. 사실 구조체나 공용체를 배운분이라면 객체의 구조를 이해하기가 한결 쉽습니다만 구조체를 모른다고 해도 상관 없습니다.
프로그래머는 객체와의 통신방법만 알면 새로운 프로그램을 만들 수 있습니다.
말씀드린 것처럼 스프레드시트 파일은 객체의 덩어리입니다. 자 새로운 프로그래머가 이 객체 덩어리를 다루기 위해서 엑셀이라는 프로그램 전체의 소스파일을 분석하고 파악해야 할까요? 아닙니다. 새로운 프로그래머는 스프레드시트 파일의 셀과 자료를 주고받는 방법만 배우면 됩니다.
만약에 모듈 중심의 설계로 만들어진 성적관리 프로그램 있다고 합시다. 보통 모듈방식으로 짠 수학관리 프로그램에는 수학점수라는 항목이 고정되어 있습니다. 다시 말해서 데이터의 형태를 바꿀 수가 없습니다. 수학점수 항목에는 숫자만 입력가능하고 문자나 그림파일, 함수를 입력할 수 없게 되어있습니다. 때문에 어떤 프로그래머가 성적관리 프로그램을 개선하여 PC통신 기능을 추가하고자 한다면 성적관리 프로그램에서 어떤 방법으로 수학점수를 입력받고 저장하는지, 이때 사용한 변수는 무엇인지 모두 알아야 합니다. 그래야만 그 함수를 이용하여 수학점수를 수정하고 입출력할 수 있습니다.
그러나 엑셀에서 사용하는 스프레드시트는 수학점수라는 고정된 항목이 없습니다. 단지 셀의 형태로 이루어진 구조가 있을 뿐입니다. 프로그래머는 이 쉘에 자료를 입력하고 쉘로부터 자료를 돌려받는 방법만 알면 됩니다. 나머지 기능이나 엑셀이라는 프로그램에 대해서는 알 필요도 없습니다. 프로그래머는 객체인 쉘에 수학점수나 그림파일을 집어넣고 다시 이를 꺼내 출력해주는 방법만 배우면 되며, 이 방법을 통해 입출력된 자료를 PC통신으로 주고받는 함수나 프로그램을 만들기만 하면 됩니다.
실제로 엑셀을 제외하고도 대부분의 개인일정 관리 프로그램, 워드프로세서, 데이터베이스, 인터넷 프로그램 등에서 엑셀의 스프레드시트파일을 가져와 활용할 수 있습니다. 이는 프로그램을 주고받는 것이 아니라 객체를 주고받는 것이기 때문에 가능합니다. 그러니까 아래아한글이라는 워드프로세서에서 엑셀의 데이터를 손쉽게 가져와 쓸 수 있는 까닭은 엑셀 파일의 셀과 입출력하는 방법만 알면 쉽게 자료를 가져와 쓸 수 있기 때문입니다. 엑셀 프로그램을 만들 능력은 없지만 엑셀의 데이터 파일을 다룰 수 있는 것은 가능한 이유는 엑셀 프로그램이 객체지향 위주로 설계되었기 때문입니다. 만약 엑셀 프로그램이 객체지향 프로그램이 아니라면 엑셀의 자료를 가져와서 활용하는 일은 쉬운 일이 아닙니다.
**요약: 스프레드시트 파일이 객체이며, 엑셀은 객체지향적인 프로그램입니다. 객체지향 프로그램은 객체를 상호 교환하여 사용할 수 있어 OLE 구현이 쉽습니다.
3.12.5.변수의 집합체인 배열에서 좀더 발전한 형태가 클래스입니다.
클래스는 객체를 만들기 위한 도구입니다.
자 이제 객체가 주체의 반대라는 말은 알겠고 컴퓨터언어에서 객체는 다양한 형태의 자료를 포함할 수 있는 변수의 개념으로 다룬다는 것도 아셨을 것으로 생각합니다. 이제는 실질적으로 객체를 다루는 몇 가지 방법에 대해서 알아봐야 할 차례입니다.
컴퓨터에서 객체는 변수와 같은 방식으로 다룹니다. 지금까지 배운 일반적인 변수와 다른 점은 배열, 구조체나 공용체, 클래스의 개념을 이용하여 좀더 확장된 변수로 다룬다는 점입니다. 앞서 배운 것처럼 정수형 변수는 정수형 숫자 하나만 다룰 수 있는 단일 객체입니다. 정수형 배열은 각 배열요소에 숫자를 입력할 수 있으니까 여러 개의 변수를 하나의 배열이름으로 다룰 수 있는 변수의 집합체라고 볼 수 있습니다.
구조체, 공용체는 배열이 좀더 확장된 개념으로 보시면 됩니다. 다시 말해서 정수형 배열과 문자형 배열을 합쳐서 하나의 집합체로 다루는 것이 구조체라고 보시면 됩니다. 클래스는 여기에 함수도 하나의 요소로 삽입된 것으로 보시면 됩니다.
C++에서도 간단한 객체를 다룰 때는 일반 변수를 사용합니다. 저희가 예제로 만들어본 구구단 프로그램은 2~3개의 정수형 변수만 가지고도 충분히 다룰 수 있었습니다. 그러나 인사관리 성적관리 프로그램 같이 복잡한 프로그램을 다루려면 변 수가 수 백개 필요합니다. 이 많은 변수를 일일이 제대로 활용되고 있나 추적하면서 프로그램을 짜는 일은 쉬운 일이 아닙니다. 그래서 이런 경우에는 클래스라는 개념을 이용합니다.
객체는 자료이며, 클래스는 자료형의 한 종류입니다.
여기에서 객체와 클래스를 정리하자면 '객체는 프로그래머가 다루고자 하는 대상(주로 자료)이며, 클래스는 객체를 다루기 위해 사용되는 자료형의 한 종류'라고 보시면 됩니다. 좀더 정확하게 설명하자면 C++언어에서 객체는 자료이고 클래스는 자료를 다루기 위한 문법규칙입니다.
그렇다면 좀더 구체적으로 클래스란 무엇인가? 클래스는 최소 단위인 객체의 집합입니다. 그러니까 우리가 배운 배열과 비슷합니다. int vat[10]이라는 배열은 10개의 요소를 가진 정수형 배열입니다. 그러므로 곧 10개의 변수를 가진 집합체입니다. 클래스 역시 배열과 같은 개념입니다. 차이점은 앞서 말씀드린대로 정수 뿐만 아니라 모든 자료형, 심지어 함수까지도 하나의 요소로 사용 가능하다는 점이 차이점입니다.
**요약: 클래스는 객체의 집합으로 모든 종류의 자료와 함수를 구성요소로 가질 수 있는 자료형입니다.