프로그래밍 언어론 제 9 장 객체 지향 개념 객체 지향 방법론 객체 모델링 객체 지향 언어 C++ 객체 지향 언어 CLOS 객체 지향 언어 Smalltalk 객체 지향 언어 Java
9.1 객체 지향 방법론 객체 지향 방법론 identity: 데이터는 객체라고 부르는 discrete entity들로 분류됨 classification: 동일한 데이터 구조와 동작을 가진 객체들이 하나의 클래스로 그룹화 polymorphism: 동일한 연산이 상이한 클래스 상에서 서로 다르게 동작 inheritance: 계층 관계를 기초로 클래스들간의 속성과 연산을 공유 방법론 분석:문제의 기술로부터 중요한 성질을 보여 주는 실세계의 모델링 설계: 각 클래스를 구현하는데 필요한 데이터 구조와 알고리즘 생성 구현: 객체 클래스들과 이들의 관계가 프로그래밍 언어로 변환
9.2 객체 모델링 객체와 클래스 속성과 연산 객체는 crisp 경계를 가진 개념, 추상화, thing 클래스는 객체의 그룹 속성: 데이터 값 연산: 객체에 혹은 객체에 의해 적용될 수 있는 함수 Car Co. 클래스 (Car Co.) Hyundai Daewoo Kia 객체 name: string date: integer location: string 1960 Ulsan 1970 Inchon 속성 name date location displaylogo File size Last-update print Stack push pop isempty 연산
9.2.1 association과 link link: 객체들간의 물리적 혹은 개념적 연결 Car Co. name Car Models (Car Co.) Hyundai Daewoo Kia (Car Models) Credos Tico Sonata has-CarModel from-CarCo. 결합과 링크 클래스 다이어그램 인스턴스 다이어그램 결합은 양방향이다.
association과 link (2) Circle은 Line과 0,1,2개의 점에서 접한다. Line Circle Intersects 결합 이름을 가지지 않는 3원 결합 Car Dealers CarModels Car Co. 다대다 결합과 링크 (Car Dealers) Yoon-Sung (CarModels) Sonata (Car Co.) Hyundai 객체 인스턴스들간의 관계
9.2.2 link 속성 link 속성: association 내에 있는 link의 특성 Owned by Cars Owners years of ownership 다대다 관계의 링크 속성 Car Co. name date location CarModels cylinders Manufactures Location volume 일대다 관계의 링크 속성 하나의 Car Co. 제작자(manufactures)는 여러 개의 CarModels을 가지므로 일대다 관계이다. Manufactures의 속성은 location과 volume이다.
9.2.3 aggregation aggregation: 부모 클래스가 자신의 component를 기술하는 서브 클래스를 갖는 관계 (PART-OF 관계) Automobile Engine Cooling System Steering System Drive Train Water Pump Thermostat Radiator Cylinder Aggregation 다단계(Multilevel) aggregation – 자동차의 구성요소
9.2.4 generalization과 inheritance generalization: 서브 클래스가 부모 클래스보다 더욱 specialize되는 관계 (IS-A 관계), 서브 클래스들은 부모 클래스들의 특성을 상속 받고, 이 특성을 변경하거나 새로운 속성을 추가 inheritance, generalization, specialization은 동일하거나 관련된 개념 autos jeeps sportscars sedans Musso Korando Tiburon Scoupe Accent Elantra 상속과 일반화
university members administrators faculty students classes advise grade teach attend 1 m n 수퍼클래스와 서브클래스
abstract class: 자신은 인스턴스를 가지지 않지만, 자신의 descendant 클래스들은 직접적인 인스턴스를 가짐 concrete class: 인스턴스를 가질 수 있는 클래스 concrete class abstract non-leaf instance leaf class has subclasses superclass has direct instances 1+ abstract 클래스와 concrete 클래스
multiple inheritance: 하나의 클래스가 둘 이상의 수퍼 클래스를 가지고 모든 부모로 부터 상속 받는 것을 허용 Car Models SportsCars Sedans 4-door hardtops 2-door hardtops Station Wagons 다중 상속 Staff Students teaching faculty support staff graduate student undergraduate assistant administration 분리된 클래스로부터의 다중 상속
9.3 객체 지향 언어 C++ C++의 특징 클래스들을 통해 데이터 추상화 기능 제공 사용자가 모델링하고자 하는 형의 구조와 연산을 정의하여 사용자 정의 형 지원 연산자들의 의미를 사용자가 정의하는 클래스에 맞게 재정의 할 수 있는 연산자 중복 정의 제공 Base class에서 derived class를 유도하여 상속 기능 지원 클래스에 대한 멤버에 대한 접근을 제한(public, protected, private) 하여 캡슐화 가능 C를 기반으로 하는 언어이므로 성능이 우수 정적 형 검사로 인터페이스 에러 방지 가상 함수를 이용한 동적 바인딩 제공
객체 지향 언어 C++ (2) 클래스와 상속 클래스: 멤버(데이터 구조)와 이 데이터들에 연산을 수행하는 멤버 함수로 구성 멤버: 기본 형, 포인터, 배열, 구조체, 클래스, 자기 포인터 멤버 함수의 몸체는 클래스 외부에 정의 가능 동일한 이름의 멤버 함수의 소속 클래스를 구분하기 위한 클래스 지정 기호 :: class vector { int size; int *p; public: int readsize( ); ... }; int vector::readsize( ) return size; 인라인 함수: 멤버 호출시 발생하는 비효율성을 막기 위해 함수의 몸체를 삽입 멤버 함수의 몸체가 포함되면 자동적으로 인라인 함수로 선언 멤버 함수의 몸체가 클래스 정의 외부에 위치하면 inline int vector::readsize( ) {return size;}
객체 지향 언어 C++ (3) 클래스와 상속 생성자(construct): 객체의 생성과 초기화를 하는 특수한 멤버 함수 소멸자(destruct): 사용을 다한 객체의 기억장소 영역을 반납 vector(int sz=10){size = sz; p = new int[10];} ~vector( ){delete[size] p;} 프렌드(friend) 함수: 한 클래스의 멤버를 다른 클래스의 멤버나 다른 일반 함수가 접근하도록 허용 Template: 객체 생성시 객체 멤버의 형을 인자로 받아들임 상속: 이미 정의된 클래스로부터 속성과 연산에 관한 내용을 물려 받고, 새로운 내용을 추가하거나 변경해서 새로운 클래스를 정의하는 것 class A { // base class ... public: }; class B: public A { // B는 derived class, : public A 선언으로 privateprivate, publicpublic 상속 ... // :private A라면, 클래스 A의 모든 멤버와 멤버 함수는 B의 private으로 상속
객체 지향 언어 C++ (4) 클래스와 상속 가상 함수(virtual function): 컴파일시 형이 정확하게 지정되지 않은 객체의 멤버 함수를 실행시 동적으로 선택 가능 함수, 즉 기본 클래스의 멤버 함수를 파생 클래스에서 다시 정의할 수 있도록 하여 이 두 클래스의 함수를 실행시 동적으로 선택 가능 class A { // 앞의 A와 B 클래스 관계 유지 ... public: virtual int vit_fun( ); // A의 vit_fun이 가상 함수 }; A a; B b; A* ap = &a; B* bp = &b ap = &b; 앞에서 처음 두 지정문에서 ap->vit_fun( ), bp->vit_fun( ) 각각은 A::vit_fun( )와 B::vit_fun( )을 나타낸다. 그러나 마지막 지정문을 수행한 후의 ap->vit_fun( )은 B::vit_fun( )을 호출한다. 그 이유는 A의 vit_fun( ) 함수가 가상 함수로 선언되었기 때문에 ap가 가리키는 소속 클래스에 따라 상이한 버전의 함수를 동적으로 호출한다.
객체 지향 언어 C++ (5) 객체 지향 개념과 C++ 객체 지향 개념 C++에서의 구현 방법 클래스 복잡한 영역 규칙을 가진 별개의 개념 객체 변수 선언을 통한 사례화로 객체를 생성. 생성자 함수가 객체를 초기화 속성 클래스 내에 포함된 멤버라고 부르는 지역 데이터 구조 연산 클래스 내에 포함된 멤버 함수라고 부르는 연산 결합 명시적으로 지원되지 않고, 전형적으로 포인터가 이용됨 링크 포인터 링크 속성 클래스에 링크를 만듬 상속, kind-of 서브클래스 정의에 수퍼클래스를 부착 다중 상속 다중 수퍼클래스를 부착 집단 part-of 상속을 이용 일반화, is-a 상속을 이용 추상 클래스 순수 가상(pure virtual) 함수를 포함 추상 연산 가상 함수 및 순수 가상 함수를 포함
9.6 객체 지향 언어 Java Java의 특징 클래스와 상속 모든 프로그램은 클래스와 인터페이스로 구성되고, 클래스와 인터페이스들이 모여 패키지를 구성 클래스와 인터페이스 내에 선언된 모든 메소드들을 밖에서 구현할 수 없음 class Hello { public static void main(String args[ ]) { system.output.println(“Welcome to Java World!!”); } 간결하고(포인터와 사용자에 의한 메모리 관리 기능 제거), 중립적이고, 이식성이 강한 언어 클래스와 상속 <지정자> class 클래스 이름 <extends 수퍼 클래스> <implements 인터페이스 이름> { 클래스 몸체 abstract 클래스: 하나 이상의 abstract 메소드를 가짐 final 클래스: 서브 클래스를 가질 수 없음, 즉 다른 클래스 선언에서 extends 절에 위치할 수 없음 public 클래스: 자신이 선언된 클래스 밖에서 사용할 수 있는 클래스
객체 지향 언어 Java (2) 클래스와 상속 인터페이스: 호출 방식만 선언된 메소드들과 상수들만 가짐, 메소드의 구현은 클래스에서 이루어짐 interface information { public boolean Add(Human Data); public boolean Delete(Human Data); public boolean Search(Human Data, boolean state[ ]); }; … 변수는 멤버 변수(클래스 내에서 선언)와 지역 변수(메소드나 블록 내에서 선언)로 구분됨 public 변수: 어느 곳에서나 직접적인 사용이 가능 protected 변수: 서브 클래스와 그 변수를 선언한 클래스가 있는 패키지 안에서만 사용 가능 private 변수: 오직 선언된 클래스 내에서만 사용 가능 모든 클래스들은 Object 클래스의 서브클래스 상속 표시: class MyClass extends Applet { … } 변수의 이름이 수퍼 클래스에서 선언된 멤버 변수 이름과 동일하면 수퍼 클래스의 멤버 변수가 shadow됨: super 키워드나 수퍼 클래스의 필드 접근 표현을 이용하여 참조 가능