OOP

Similar documents
JAVA PROGRAMMING 실습 08.다형성

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

PowerPoint Presentation

슬라이드 1

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

JAVA PROGRAMMING 실습 05. 객체의 활용

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++ Programming

JVM 메모리구조

C# Programming Guide - Types

 메소드 오버로딩

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint Presentation

제11장 프로세스와 쓰레드

Microsoft PowerPoint - 2강

PowerPoint Presentation

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - Chap12-OOP.ppt

슬라이드 1

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

17장 클래스와 메소드

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

PowerPoint Template

설계란 무엇인가?

Microsoft PowerPoint 장강의노트.ppt

C++ Programming

Microsoft PowerPoint - additional08.ppt [호환 모드]

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

Microsoft PowerPoint - additional01.ppt [호환 모드]

C++ Programming

슬라이드 1

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

Design Issues

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Template

C++ 기본문법 정리

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

Microsoft PowerPoint - chap06-2pointer.ppt

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

<342EBAAFBCF620B9D720B9D9C0CEB5F92E687770>

No Slide Title

Microsoft PowerPoint - java2 [호환 모드]

Microsoft PowerPoint - chap11

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - Chapter 6.ppt

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

Cluster management software

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Chapter 6 Objects and Classes

No Slide Title

Microsoft PowerPoint - Lect04.pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

Slide 1

슬라이드 1

윤성우의 열혈 TCP/IP 소켓 프로그래밍

9장.예외와 단정

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - additional03.ppt [호환 모드]

Slide 1

Slide 1

Network Programming

1

PowerPoint Presentation

Microsoft PowerPoint - 02-Class Review.pptx

JAVA PROGRAMMING 실습 07. 상속

11장 포인터

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

ThisJava ..

OCW_C언어 기초

쉽게 풀어쓴 C 프로그래밍

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - 2-Objective-C 기초

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

제 1 강 희망의 땅, 알고리즘

금오공대 컴퓨터공학전공 강의자료

쉽게

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

PowerPoint 프레젠테이션

Transcription:

오브젝트파스칼, C++ 그리고자바의특징 (Characterisitcs of Object Pascal, C++ and Java) 자바는가장일반적인인터넷용언어이며, C++ 은아마도가장흔하게사용되는 OOP 언어일것이다. 이들과델파이에서사용되는오브젝트파스칼의언어적인측면에서의비교를해보면서 OOP 언어에대한감을조금더높여보자. OOP 언어의특징 객체지향프로그래밍 (OOP) 라는것은일종의프로그래밍테크닉으로, 가장최초로구현된것은스몰토크에서였다. 그러다가, 80 년대에들어서면서 C++, Objective-C, 터보파스칼, 에펠, Ada, 자바등에적용되면서프로그래밍언어에서가장중요한기법으로각광받게되었다. OOP 언어의특징은앞장에서도언급한바있지만, 다시한번이를간단하게정리해보도록하겠다. 1. 클래스라는추상적인데이터형의개념을도입한다. 이를이용해서캡슐화, 모듈화, 데 이터추상화등을구현하게된다. 2. 이미존재하는요소에서그기능을상속할수있다. 이를이용해서몇가지기능을수 정하거나, 추가만하면새로운형태의데이터형을정의할수있게된다. 이를통해 데이터의세분화와일반화가가능해진다. 3. 마지막으로다형성이라는특징을들수있다. 이특징을이용하면같은방법으로서로 다른클래스의객체를참조할수있다. 다형성을이용하면클래스의재사용성이보다 높아지고, 프로그램을보다쉽게확장, 유지할수있게된다. 위의클래스, 상속성, 다형성의 3 가지특징은 OOP 언어라고불려지는언어라면모두지원해야한다. 참고로, 위의 3 가지특징중상속성과다형성을지원하지않는언어를 객체기반 (class-based) 언어라고한다. OOP 언어들은위의 3 가지특징을모두지원하지만, 데이터형을검사하는방법과프로그래밍모델, 객체모델등에서서로차이가있게된다. 여기에대해서좀더심층적으로알아보기로하자. 컴파일 vs 런타임형검사 (Compile-Time vs. Runtime Type Checking) 프로그래밍언어를구별할때, 얼마나데이터형을검사하는방법이까다로운가에대한것 을많이고려하곤한다. 그러니까호출된메소드의존재여부, 파라미터의데이터형, 배열

의범위측정등을얼마나정확하고까다롭게하는지등의여부가각언어들끼리조금씩차이가있다. C++, 자바, 오브젝트파스칼모두컴파일시에주로데이터형을검사한다. 그중에서도자바가가장엄격하게컴팔일시에데이터형을검사하며, C++ 은가장덜하다. C++ 은 C 언어와의호환성을위해서데이터형간의구별이덜엄격한편이다. C 를많이써본독자들은아마도 float 형으로선언한변수의값과 int 로선언한변수의값을혼용하는것을많이경험했을것이다. 그에비해오브젝트파스칼이나자바에서는정수형은어디까지나정수형이며, 실수형은어디까지나실수형이다. 이들간의호환성을위해서는엄격한형변환이필요하다. 자바가상기계 (VM) 는바이트코드를런타임에서해석할수있기때문에, 자바언어가컴파일시에형검사를하지않는다고생각하기쉽지만, 그와반대로훨씬더엄격하게형검사를한다는것은잘못알기쉬운사실이다. 하이브리드 vs. 순수 OOP 언어 순수한 OOP 언어는 OOP 라는하나의프로그래밍모델만을지원하는언어이다. 즉, 개발자는클래스와메소드를선언할수있지만, 과거에사용해왔던일반적인함수나프로시저, 전역변수등은사용할수없다. 자바는 OOP 프로그래밍모델만을지원하는순수 OOP 언어이다. 자바외에에벨 (Eiffel) 과스몰토크등을순수 OOP 언어라고말할수있다. 일반적으로이러한순수 OOP 언어는프로그래머로하여금반드시 OOP 모델을사용하게만들기때문에 OOP 를처음시작하는사람에게 OOP 를익히게하는데유리하다. 그에비해 C++ 과오브젝트파스칼은 OOP 프로그래밍모델이외에전통적인 C 와파스칼프로그래밍모델을같이지원하는하이브리드언어이다. 하이브리드언어는호환성을유지해야하기때문에, 원시적인데이터형들이클래스및객체들과혼용되는형태를가질수밖에없다. 또한, 기존의컴파일러언어의특성상정적으로프로시저나함수를사용할수있어야하며, 사실상이것이주로사용되는방법이기때문에순수객체지향언어와같이동적으로다형성을지원하는언어에비해다소복잡한함수호출과구현방식을가질수밖에없다. 이렇게서로다른프로그래밍모델을지원해야하는하이브리드언어는다소몸집이크고, 복잡하지만유연성이라는측면에서는장점을가지고있다. 단순객체모델 vs. 객체참조모델 (Plain Object Model vs. Object Reference Model) 전통적인 OOP 언어는프로그래머가객체를스택과힙, 정적인저장소에생성할수있도록

허용하고있다. 이러한언어에서는클래스데이터형의변수가메모리에있는객체와직접적으로연관된다. C++ 이이러한단순객체모델을따르는예가된다. 그에비해, 오브젝트파스칼과자바는각각의객체는힙에동적으로메모리를할당받게되며, 클래스데이터형의변수는실제로메모리상의객체가아니라객체에대한메모리의핸들을담고있게된다 ( 포인터와비슷한개념이다 ). 클래스와객체, 그리고참조 (Classes, Objects and References) 클래스란일종의데이터형이며, 객체는클래스가실제로메모리에서인스턴스화된것이다. 오브젝트파스칼과 C++, 자바는모두클래스에바탕을둔언어이다. 각각의객체들은직접정의되지않고, 일단클래스로정의된후객체는클래스에대한하나의인스턴스로나타나는형태를가지고있다. 클래스는객체와 1:n 의관계를가지게된다. 클래스는코드를메소드의형태로저장하며, 여러객체들과이를공유하게된다. 어쨌든각객체는자신의데이터필드를저장하게되며, 이것으로클래스와객체가구별된다. 객체내의필드는원시적인데이터형이거나객체일수있다. 정상적으로각객체는클래스에서선언된데이터필드의복사본을자신의것으로가지고있다. 이들의관계가각각의언어에서어떻게특징지워지는지살펴보도록하자. C++ 에서 MyMethod 라는메소드를가진 MyClass 란클래스가있다고하면, 다음과같이 객체를사용할수있다. MyClass Obj; Obj.MyMethod(); 첫째줄의선언으로 Obj 라는 MyClass 형의객체를얻게된다. 이때이객체에대한메모 리는전형적으로스택에서할당받게되므로, 바로그다음줄에서이객체를사용할수있 게된다. 자바에서는객체에해당하는핸들에대한메모리를할당받기때문에, 다음과같이사용해야 한다. MyClass Obj;

Obj = new MyClass(); Obj.MyMethod; 이처럼객체를사용하기전에 new 키워드를이용해서객체에대한메모리를할당받아야 한다. 물론, 위의문장을아래와같이 2 줄로줄여쓸수있다. MyClass Obj = new MyClass(); Obj.MyMethod(); 오브젝트파스칼도근본적으로는자바와비슷하지만, 문법의구조가다음과같이다소차이 가날뿐이다. var Obj: MyClass; begin Obj := MyClass.Create; Obj.MyMethod; 위의비교에서, 객체참조모델과단순객체모델의차이점을이해할수있을것이다. 프로그래머의입장에서보면객체참조모델이다소복잡해보인다. 그렇지만, 단순객체모델에서는각변수가직접객체를가리키기때문에, 객체를지정하거나참조하기위해서포인터를사용해야하는빈도가늘어날수밖에없다. 그에비해객체참조모델을사용하는언어에서는객체를참조할때포인터를쓰지않아도되며, 각각의객체를직접제어할필요도없다. 이런이유로자바에서는포인터를지원하지않는다. 메모리모델 오브젝트파스칼과 C++ 은모두기존의 record( 오브젝트파스칼 ), struct(c++) 데이터형에다가클래스의 VMT 에대한포인터를추가한것을클래스로메모리에서관리하고있다. C++ 의경우프로그램변수를할당하는데 static, automatic, dynamic 의 3 가지저장클래스를지원한다. Static 객체는프로그램의데이터세그먼트에생성되며, automatic 객체는스택에, dynamic 객체는힙에생성된다. Static storage 는전역객체에사용되며, automatic storage 는로컬객체에, dynamic storage 는런타임에서생성된객체에사용된다.

C++ 은객체를생성하는프로세스를메모리의할당과초기화하는크게두과정으로나눈다. 메모리할당은 new 메소드를이용해서이루어진다. C++ 의경우에는 new 메소드를오버라이드하는경우도많은데, 이를통해사용자가메모리를할당하는저수준프로그래밍루틴을직접작성할수있다. 오브젝트파스칼은 dynamic 객체만을지원한다. 로컬, 전역객체가선언될수있지만, 이들은단지레퍼런스로서데이터세그먼트나스택에저장된다. 객체자체는반드시직접생성해서항상힙에저장해야한다. 오브젝트파스칼은기본적으로사용자정의메모리할당루틴을제공하지는않는다. 그렇지만, 오브젝트파스칼과 C++ 은모두자동 garbage collection 은지원하지않으므로, 프로그래머가각객체를동적으로생성한경우이를제거할필요가있다. 자바의경우는 dynamic 객체와메모리관리를동적으로해준다. 또한, garbage collection 을해주므로동적으로생성한객체에대해언어차원에서관리를해준다. 생성자 (Constructors) 그러면, 각언어의생성자에대해서알아보자. 이를이용해서객체를초기화하게된다. C++ 은클래스와같은이름의생성자를가진다. 만약에프로그래머가클래스에생성자를정의하지않으면, 컴파일러가디폴트생성자를클래스에추가한다. 메소드오버로딩을이용해서여러개의생성자를가질수있다. C++ 과비슷하게사용하지만, initializer 라고도불린다. 이것의의미는객체를실제로생성하는것은자바의 VM 이하는일이고, 생성자에써넣은코드는단순히새롭게생성된객체를초기화하는역할을한다는의미이다. 오브젝트파스칼에서는 constructor 라는키워드를사용해서생성자를정의한다. 메소드오버로딩을지원하지않지만, 생성자가여러가지이름을가질수있기때문에여러개의생성자를가질수있다. 오브젝트파스칼에서는각각의클래스가디폴트 Create 생성자를가지고있게되는데, 이생성자는기본적인기초클래스에서상속받게된다.

파괴자 (Destructor) 파괴자는생성자와반대되는일을한다. 자에의해할당된리소스를해제하는역할을하게된다. 즉, 객체가메모리에서해제될때호출되며생성 C++ 의파괴자는객체가범위를벗어나거나, 동적으로할당된객체를삭제할때자동으로 호출된다. 모든클래스는오직하나의파괴자를가지게된다. 자바는파괴자를가지지않는다. 참조되지않는객체는백그라운드에서실행되고있는가비지컬렉션 (garbage collection) 알고리즘을통해자동으로파괴되며, 객체가파괴되기전에 finalize() 메소드를호출한다. 오브젝트파스칼의파괴자는 C++ 과비슷한역할을한다. 오브젝트파스칼에서는표준가상파괴자인 Destroy 를이용하는데, 이파괴자는 Free 메소드에의해호출된다. 모든객체가동적으로처리되기때문에, 일단객체가생성되면그객체의소유주 (owner) 객체가파괴될때자동으로 Free 메소드가호출된다. 이론적으로여러개의파괴자를선언할수있다. 클래스캡슐화 클래스캡슐화의레벨을지정하는지시어로 private, protected, public 이사용된다. 그러 나, 약간의차이가있으니이를살펴보자. C++ 에서 friend 키워드를사용하면캡슐화의범위를벗어날수있다. 의캡슐화정도는 private 에준하며, 구조체의경우에는 public 에준한다. 기본적으로클래스

자바에서는디폴트로각요소들이 friend 로간주된다. 즉, 각요소들은같은패키지안에있거나같은소스코드파일내에있으면다른클래스에서도접근할수있다. protected 키워드로지정한경우에서브클래스와같은패키지내의다른클래스에서접근할수있다. 즉, private proteced 를복합적으로사용할때 C++ 의 protected 와같은의미가된다. 자바와비슷하다. private, protected 키워드는다른유닛일경우에는접근할수없지만, 같은유닛 ( 같은소스코드파일 ) 에있으면접근이가능하다. 델파이의경우에는 published 키워드를제공하는데, 이키워드를이용하면그요소에대한 RTTI 정보가생성된다. 그밖에, 오브젝트파스칼은디자인시에필드의값을보고, 편집할수있는프로퍼티를제공한다. 프로퍼티는간접적으로객체의필드에접근하기때문에, 캡슐화개념을충실하게지키고있다. 프로퍼티는데이터필드에대한단순한레퍼런스일수도있고, 참조무결성을유지하는등의보다여러가지조작을가할수있는함수를호출하는것일수도있다. 파일, 유닛그리고패키지 파일에소스코드가조직되어있는방법에많은차이점이있다. C++ 컴파일러는파일에대한정보를무시하는데비해, 자바와오브젝트파스칼의경우에는파일단위가일종의모듈단위로인식된다. C++ 프로그래머는클래스의정의부분을헤더파일에저장하고, 실제메소드의정의는분리된코드파일에저장하는경향이있다. 이런파일들은대부분같은이름을가지고, 다른확장자를가지게된다. 이와같이 C++ 에서는파일단위에대한특별한제한점이존재하지않는다. 이는다르게말하면, 컴파일러가서로다른파일에존재하는여러가지선언들에대해서별로신경을쓰지않고컴파일을하기때문에, 링커가많은일을해야한다는것을의미하며이것이 C++ 의링킹속도가저하되는원인이라고할수있다. 자바에서는각각의소스코드파일이나컴파일단위가서로분리되어있다. 그렇기때문에, 컴파일유닛을하나의그룹으로묶을수가있는데, 이를패키지라고한다. 클래스를선언하면클래스의메소드에대한코드도같이써주어야한다. import 키워드를이용해서다른파일의내용을읽을수있는데, 이때에는그파일에서 public 으로선언된부분만을읽

어올수있다. 오브젝트파스칼의경우에는각각의소스코드파일을유닛이라고한다. 이러한유닛은크게나누어 interface, implementation 이라는 2 개의파트로이루어져있다. Interface 섹션은클래스의정의와메소드에대한선언부분을포함하며, implementation 섹션에는 interface 섹션에서선언한메소드의구현부분이위치하게된다. 다른파일에서선언된 interface 부분을 uses 키워드를통해접근할수있다. 또다른특징을언급하자면, 자바나오브젝트파스칼의컴파일러는컴파일이된파일 ( 델파이 의경우.dcu 파일 ) 에서선언부분의내용을읽어올수있는데비해, C++ 에서는이러한모 듈구조를허용하지않는다. 클래스메소드와데이터 OOP 언어는일반적으로특정객체에만해당하지않고, 클래스에전반적으로적용시킬수있는메소드와데이터를허용한다. 클래스메소드는클래스의객체와클래스자체에서호출할수있으며, 클래스데이터는각각의객체에의해복제되지않고, 공통으로사용되는데이터를말한다. 이들을다른말로정적메소드 (static method), 정적데이터 (static data) 라고도한다. C++ 의클래스메소드와데이터는 static 키워드에의해지정된다. 클래스데이터는특정 한선언문에의해서초기화되어야한다. 자바는 C++ 과마찬가지로 static 키워드를이용해서클래스메소드와데이터를지정할 수있다. 클래스메소드는매우자주사용되는데, 이는자바가전역함수를허용하지않기 때문이다. 클래스데이터는클래스의선언부에서직접초기화될수있다. 오브젝트파스칼은클래스메소드만지원한다. 클래스메소드는 class 키워드에의해지

정될수있다. 클래스데이터는직접지원하지않고, 대신클래스를정의한유닛에 private 전역변수를추가해서이기능을대치한다. 전체클래스의조상 일부의 OOP 언어에서는최소한하나의기초클래스를가지는경우가있다. 이러한클래스는모든클래스에서동일하게가져야하는기본적인특징들을가지고있다. 즉, 다르게말하면모든클래스는가장기본적인기초클래스를상속받는것이다. 이러한개념은스몰토크에서부터시작된것으로비교적많은 OOP 언어에서채택되고있는방식이다. C++ 은기본적으로이러한개념을지원하지않는다. 그렇지만 C++ 에기초한많은어플리케이션프레임워크 (MFC. OWL 등 ) 에서는이러한기초클래스개념을받아들이고있다. 예를들어, MFC 의경우 CObject 클래스가기초클래스로사용된다. 자바의모든클래스는 Object 클래스에서상속받는다. 오브젝트파스칼은 TObject 클래스를공통의조상으로가진다. 오브젝트파스칼은기본적 으로다중상속을지원하지않기때문에, 상당히커다란상속트리를가지게된다. TObject 클래스는 RTTI 를사용할수있으며, 그밖에몇가지기본적인특징을가진다. 하위형호환성 (Subtype Compatibility) 모든 OOP 언어가형검사를엄격하게하는것은아니지만, 우리가지금논의하고있는세가지언어는비교적형검사가엄격한편이다. 이는기본적으로서로다른클래스의객체들간의형-호환성 (type-compatibility) 이보장되지않는다는것이다. 이러한규칙의예외가있는데, 특정클래스를상속한클래스의객체는부모클래스와데이터형의호환성이인정된다 ( 역은성립하지않는다.). 이러한하위형호환성은다형성 (polymorphism) 과 late binding 을지원하는데중요한역할을한다.

C++ 의경우에는이러한하위형호환성이포인터와참조 (reference) 에대해서만허용된다. 서로다른객체는서로다른크기의메모리를사용하기때문에, 이들객체에대한직접적인 하위형호환성을보장할수가없다., 오브젝트파스칼 이들은모든객체에대해서하위형호환성을지원한다. 이것이가능한이유는앞에서도설 명했듯이이들이모두객체참조모델을사용하기때문이다. 오브젝트파스칼의예를들면, 모든객체는 TObject 클래스와호환된다. 다형성 (Polymorphism) 과 late 바인딩 오브젝트파스칼과 C++ 은메소드를디스패치할때정적, 동적바인딩을모두지원한다. 정적바인딩은다형성을지원하지않으며, 컴파일시에동작하며전통적인함수호출에서사용되는방식이다. 정적메소드의주소는링커에의해코드세그먼트에직접저장된다. 이에비해동적바인딩또는가상메소드는다형성을지원한다. 이를위해객체의정확한데이터형을모르는런타임에서동작하게된다. 오브젝트파스칼과 C++ 은모두가상메모리테이블 (VMT) 를통해가상메소드의주소를저장한다. 각클래스는자신의 VMT 를가지게되며, VMT 에있는함수주소의배열을이용한다. 가상메소드는이주소를직접이용하므로동작하는속도는그렇게느리지않다. 오브젝트파스칼과 C++ 은모두명시적으로 virtual 로선언한메소드만다형성을지원한다. 이는하이브리드언어라면조상언어의호환성을유지해야하며, 성능상의문제때문에어쩔수없는것이라고생각된다. 부모클래스의메소드를새롭게정의한클래스가있을때, 일반적인객체에대하여그메소드를호출할때적절한클래스의메소드가호출된다면무척편리할것이다. 이러한특징을다형성이라고한다. 이를지원하려면, 위에서지원한하위형호환성이매우중요한역할을하게된다. 컴파일러는다형성을지원하기위해서 late binding 이라는기법을사용하게되는데, 이것은특정함수를호출하지않고런타임에서객체가실제로어떤클래스의함수를호출하게될지를알아낸후에호출될함수를결정하는방식이다. C++ 에서는이러한 late binding 이가상메소드에대해서만허용된다. 가상메소드가아닌 메소드는 late binding 을지원하지않는다.

자바의경우에는 final 키워드로지정하지않는한모든메소드가 late binding 을지원한다. Final 메소드는재정의될수없고, 이들은다른메소드보다빠르게동작한다. 그러니까, 기본적으로 C++ 은 early binding 이디폴트이며, 자바는 late binding 이디폴트인것이다. 다르게말하자면, C++ 은효율성을위해서 OOP 모델을희생하는경우가많다. 오브젝트파스칼의경우에는 C++ 과마찬가지로디폴트는 early binding 이다. 그런데, 오브젝트파스칼은 virtual 키워드로지정하는가상함수외에 dynamic 키워드로지정하는동적함수가지원된다. 그러나, 이들은기본적인개념으로보아서는동일한것이다. 오브젝트파스칼의경우에는 override 키워드를사용해야만이들가상함수를재정의할수있다. 이러한 override 키워드의의미는이키워드로지정한메소드만컴파일러가다시검사하게된다는것이다. 이런방법으로비교적효율적인퍼포먼스를유지할수있다. 또한, 오브젝트파스칼에서는가상생성자 (virtual constructor) 를정의할수있다. 오브젝트파스칼은가상메소드이외에동적메소드를지원한다. 이메소드는원래윈도우의메시지를사용하기위해고안된것이다. 즉, 수백개가넘은윈도우메시지를처리할때에는이들각각에대한 VMT 를관리한다는것은메모리공간의낭비가될수있으므로, 동적메소드테이블 (Dynamic method table, DMT) 을통해오버라이드된메시지핸들러에대한주소만관리함으로써이러한오버헤드를줄일수있다. 그렇지만, 아무래도수행능력이라는측면에서는다소핸디캡을가지고있다고보면된다. 추상메소드와클래스 비교적복잡한클래스구조를만들때에는, 프로그래머가다형성을지원하는데유리하도록실제로구현되지않는메소드를선언할필요가있을수있다. 이러한메소드를추상메소드 (abstract method) 라고하며, 이러한추상메소드를하나이상가지고있는클래스를추상클래스라고한다., 자바 C++ 의추상메소드는순수한가상함수라고생각하면된다. 추상클래스는하나이상의추상메소드를가진클래스로, 이러한추상클래스객체는생성할수없게되어있다. 즉, 이런추상클래스를상속받아서추상메소드를실제로구현한클래스만객체를생성할수있다. 자바의경우에도 C++ 과마찬가지로추상클래스의인스턴스는생성할수없다.

오브젝트파스칼의경우에는추상메소드를가지고있는추상클래스의인스턴스를생성하는것이가능하다. 그렇기때문에, 프로그램이추상메소드를호출할가능성도있는데이렇게되면런타임에러가발생하게된다. 다중상속과인터페이스 (Interfaces) 일부의 OOP 언어는하나이상의기초클래스를상속받을수있다. 이를다중상속 (multiple inheritance) 라고한다. 그에비해다른언어에서는오직하나의클래스만상속받을수있지만, 옵션으로다중인터페이스나순수한추상클래스 ( 클래스의순수한추상함수로만이루어진경우 ) 들을상속받아다중상속의기능을대치한다. C++ 은다중상속을지원하는언어이다. 이점은장점도단점도될수있다. 다중상속의장 단점에대한논의는이책의범위를넘기때문에생략하도록하겠다., 오브젝트파스칼 자바와오브젝트파스칼은공히다중상속을지원하지않고, 다중인터페이스를지원한다. 이를이용해서다형성을구현할수있으며, 이런특징을바탕으로 COM 모델에적합한언어환경이지원된다. 오브젝트파스칼은자바보다더욱 COM 에가까운인터페이스모델을가지고있다. RTTI (Runtime Type Identification/Information) 형검사가엄격한 OOP 언어는컴파일러가이러한형검사를해주어야한다. 그러므로, 실행중인프로그램에는클래스와데이터형에대한정보가별로필요가없다. 그러나, 어떤경우에는이러한데이터형에대한정보가필요한경우가있는데, 이런경우를위해각언어들은정도에차이는있지만 RTTI 를지원하고있다. C++ 언어는본래 RTTI 를지원하지않는다. 그러나, 이개념의지원을위해 downcast

(dynamic_cast) 라는형태로일부기능이추가되었다. 이를이용해서각객체에대한데이 터형을확인하거나, 2 개의객체가같은클래스인지검사할수있다. 자바는기본적인기초클래스로 Object 클래스가제공된다. 이클래스를통해클래스에대한정보를추적할수있다. Object 클래스의 getclass() 메소드를사용해서메타클래스 ( 클래스를설명하는클래스의객체 ) 정보를얻을수있고, getname() 함수를사용해서특정문자열을클래스의이름으로지정할수있다. 또한, instanceof 연산자를사용할수도있다. 자바의 1.0 버전은클래스에대한 RTTI 를광범위하게지원하고있지않지만, 컴포넌트와비주얼환경의발달로이러한 RTTI 를많이지원하게되었는데, 이것이자바빈스 (Java Beans) 이다. 오브젝트파스칼은가장광범위한 RTTI 정보를제공한다. 이를이용해서단순한데이터형검사와 downcast 를할수있으며 (is 와 as 연산자를사용한다 ), 더나아가서는 published 로선언된요소들을새로운 RTTI 정보로등록할수도있다. 프로퍼티와스트리밍메커니즘 ( 폼파일등의 ) 과오브젝트인스펙터로표현되는델파이의환경은기본적으로이런 RTTI 가있기에가능한것이다. 델파이클래스의기초클래스인 TObject 클래스에는 ClassName, ClassType 메소드가있는데, ClassType 메소드를사용해서특정객체의클래스에대한참조값을돌려받을수있다. 이메소드를통해서반환되는클래스형은 TClass 로이클래스는 TObject 의클래스로선언되어있는데, 이는이렇게 TClass 형으로반환된클래스는반드시사용되기전에특정클래스로형변환되어야한다는것을의미한다. 예외처리 예외처리란프로그램의에러처리부분을보다손쉽게하기위해, 언어에서제공하는표준 메커니즘을말한다. 예외처리방식은언어들마다비슷하지만, 내부동작에는다소간의차 이가존재한다. C++ 에서는 throw 라는키워드를사용해서예외를발생시키며, try 키워드로예외를처리하 게될블록을설정하고, catch 키워드로실제로예외를처리할루틴을작성하게된다. C++ 은예외처리를할때파괴자를호출해서스택에할당된객체의메모리를해제한다.

자바는 C++ 과같은키워드를사용한다. 자바에는 finally 키워드가있는데, 이키워드는객체참조모델을지원하는언어에는대부분존재한다. 자바는기본적으로가비지컬렉션을하기때문에이러한 finally 키워드를사용해서메모리이외에리소스를해제하는것을제한한다. 자바는예외를일으킬수있는모든함수와예외클래스가기본적으로잘대응되어야하며, 이를컴파일러가일일이검사한다. 프로그래머에게는다소부담되는일이지만, 오류가적은프로그램을만드는데에는상당히강력한무기가된다. 모든자바의예외객체들은 Throwable 클래스에서상속받는다. 오브젝트파스칼은 raise, try, except 키워드를사용한다. C++ 과의차이점은기본적으로스택에객체에대한메모리가할당되어있지않기때문에, 스택을처리할필요가없다는것이다. 또한, 자바와마찬가지로 finally 키워드를지원한다. 델파이의모든예외클래스는 Exception 클래스를상속한다. 그밖의특징들 C++ 은연산자오버로딩 (operator overloading) 을지원한다. 또한, 메소드오버로딩도지원하지만이것은자바와델파이 4 에서도지원된다. 그리고, C++ 은프로그래머가전역함수를오버로드할수도있으며, 형변환을담당하는메소드를정의해서형변환연산자도오버로딩할수있다. 그리고, 템플릿이라는개념을지원하여일반적인클래스의재사용성을높일수있다. 자바는멀티쓰레딩을언어에서지원한다. 객체와메소드는동기화 (synchronization) 메커니즘을지원하는데, 2 개의동기화된메소드는같은클래스에서동시에수행될수없다. 이렇게새로운쓰레드를생성하려면단순히 Thread 클래스를상속받아서 run() 메소드를오버라이드하거나, Runnable 인터페이스를구현하면된다. 그리고, 백그라운드에서가비지컬렉션을해주기때문에, 다소간의퍼포먼스의희생을감수해야하지만보다완벽한메모리관리가가능하다. 그밖에자바는포터블바이트-코드아이디어를채용했기때문에, 여러

가지플랫폼에적용되기적합한형태를가지고있다. 오브젝트파스칼은클래스참조를지원하기때문에, 메소드포인터를아주쉽게사용할수있다. 이러한메소드포인터는이벤트모델의기초가되며, 이를프로퍼티로사용할수있다. 프로퍼티는메소드가데이터에접근하는방법을숨겨주는방법으로사용되는데, 데이터를직접읽거나쓸수도있고, 접근메소드 (access method) 를사용해서데이터를조작하는방법도가능하다. 데이터에접근하는방법을바꾸더라도코드를호출하는방법을바꿀필요가없기때문에, 재사용성이라는측면에서대단히유용하다. 다르게말하면, 다른어떤 OOP 언어보다도강력한캡슐화방법을지원하는것이다. 또한, 델파이 4 에서는그동안지원하지않았던메소드오버로딩과파라미터의디폴트값도지원하므로보다강력한언어적특성을가지게되었다. 정리 (Summary) 이번장에서는 OOP 언어로는가장많이사용되는대표적인세가지언어에대해서비록수박겉핡기에가까운방법으로나마살펴보았다. 이들언어는기본적으로는 OOP 의개념을공통적으로구현하고있지만, 그구현의목적과방향성에다소간의차이가있다는것을알수있을것이다. C++ 은다소간의복잡성을가지고, OOP 의기본적인개념에배치되는여러가지모습을가지고있지만파워와유연성이라는측면에초점을맞춘언어라고할수있고, 델파이는쉽고, 비주얼환경과윈도우환경에적합하도록설계되었지만파워도포기하지않은언어이다. 자바는이식성에주안점을두고, 스피드를다소희생하도록설계되었다. 오브젝트파스칼과 C++ 에대한차이를설명할때에는앞에서둘러본여러가지항목들의차이도중요하겠지만, 보다중요한것은기본적으로이들언어의조상이된파스칼과 C 가디자인되고사용된배경과목적에서차이점을찾아볼수있다. 파스칼은명확하고, 안전하며동시에모듈화가용이하도록디자인된언어인데비해, C 는노력을적게들이면서도가능한저수준의메모리를쉽게접근할수있도록디자인되었다. 파스칼은데이터추상화와다중레벨의모듈화를직접지원하는고수준의언어이지만, C 는중간레벨로서기계와고수준언어의중간수준을목표로만들어졌다. 파스칼은프로그래머를보호하기위해서만들어진언어인데비해 C 는최대한프로그래머를믿고만들어진언어이다. 이러한파스칼과 C 의바탕에서객체지향언어의장점을접합시킨것이바로오브젝트파스칼과 C++ 인것이다. 자바는여기에비해직접적인조상이되는언어가없는순수한객체지향언어이다. 여기서확실히말할수있는것은이러한언어의특장점들이실제세계에서사용되는개발

환경을좌우하지는않는다는것이다. 실제로중요한것은운영체제와최근에불어닥치는인터넷세계, 그리고 Win32API, 액티브 X 등의모든주변환경들과이들의관계, 개발자들이선택한마켓쉐어등이라고할수있다. 아무리훌륭한언어라도실제로사용되지않는경우는부지기수이다. 예를들어, 오브젝트파스칼과자바의모델인에펠 (Eiffel) 은대단히훌륭한 OOP 언어이지만대학에서나학문적으로사용될뿐실제시장에서는외면받고있는언어이다. 결국, 어떤언어가좋은가? 하는소모적인논쟁보다는실제로사용할언어의특징을잘파악하고, 이를잘이용하는것이좋은프로그램을만들수있는기반이될것이다. 그런측면에서이번장의소기의목적이달성되었으면하는것이필자의소박한바램이다.