본문 바로가기

B1:기초 Basement

객체지향언어(Object Oriented Language)

반응형

I. C++의 다형성기능
템플리트구조
- 일반화 추상 자료형
- 매크로 대치구조이므로 사용시마다 동일한 템플리트 코드가 만들어짐

II. 객체지향 프로그램의 개념
역사
- 1960년대 Simula 67이 기원
- 1980년 Smalltalk80에서 완전한 모습을 나타냄

객체
- 실세계에 존재하는 모든 것
- 자체의 정보 + 외부와 상호작용

프로그래밍 언어의 객체
- 객체기반의 언어
  객체중심->객체에 필요한 연산을 요청
- 프로시저중심의 언어
  연상중심->연산이 데이터를 처리
- 객체 : 추상 자료형에 의해 만들어진 것. (보호화된 데이터 + 데이터에 대한 연산)

객체를 기반으로 하는 언어 분류
- 객체기반언어
  단순히 추상 자료형의 객체를 정의할 수 있는 언어
- 객체지향언어
  추상자료형 + 계승/부프로그램 호출 등의 동적 바운딩

계승
- 상하관계에 있는 추상자료형에서 하위의 추상자료형이 상위의 추상자료형의 내용을 이어받는 것
  소프트웨어의 재사용성을 높임

객체들의 계층구조

오버라이드
- 하위클래스에서 상위 클래스의 메소드를 재정의(동일명,동일매개변수)

동적바인딩
- 상위클래스에서 하위 클래스형의 객체를 동적으로 호출
  하위클래스에 대하여 동일한 이름으로 상이한 계산을 수행

III. C++의 객체지향 기능
C++
- 프로시저언어인 C의 장점과 기능을 그대로 살리면서 객체지향 프로그래밍이 가능하도록 확장
- 데이터멤버 : 인스턴스변수
- 멤버함수 : 메소드

객체의 기억장소 할당
- 컴파일러에 의해 스택에 정적 할당
- new연산자를 이용하여 히프에 할당
- 가비지수집기가 없기 때문에 히프에 할당된 것은 delete연산자로 반환

객체의 초기화 및 종료
- 구축자 : 객체가 메모리 공간에 할당받을 때 자동호출. 실매개변수전달에 의한 객체초기화
- 파괴자 : 객체의 생명시간이 끝날 때 자동호출. 히프에 할당된 데이터멤버회수 수행
- 범위전환연산자 : 클래스의 멤버함수구현을 클래스 외부에서 작성할 때 사용
- 클래스 선언 안의 멤버함수는 자동적으로 inline함수로 간주

클래스멤버 보호
- public : 수혜자 접근 가능, 유도클래스 접근 가능
- protected : 수혜자 접근 불가, 유도클래스 접근 가능
- private : 수혜자 접근 불가, 유도클래스 접근 불가
- 클래스선언시 보호등급이 명시되지 않으면 private으로 간주

클래스유도시 멤버보호
   기저클래스 public     protected
계승모드
public         public     protected
protected      protected  protected
private        private    private
보호등급재조정
다중계승
정적 형 조사
가상함수

Smalltalk의 객체지향기능
I. Smalltalk의 객체지향기능
개요
- 1970년 앨런케이가 개발
- Simula, LISP의 영향을 받음
- 순수 객체지향 언어
- 대화식 동적 언어
- 클래스사전 : 클래스의 계층 구조에 모든 클래스가 등록됨
- 단일계승 : 트리구조
- Object : 클래스 계층구조의 뿌리클래스
- 상위클래스의 모든 인스턴스변수와 메소드를 계승함
- 하위 클래스는 자신의 인스턴스변수를 정의하거나 새로운 메소드를 정의할 수 있음
- 메소드 호출 : 현재의 클래스로부터 상위 클래스 방향으로 메소드 검색
- 하위 클래스에서 상위 클래스의 메소드와 동일한 이름과 프로토콜의 메소드를 재정의하면 상위 클래스의 메소드는 감춰짐

클래스변수, 클래스 메소드
- 해당 클래스의 모든 객체가 공유함
- 인스턴스를 생성,파괴하거나 클래스 자체의 속성을 변경시킴

인스턴스변수, 인스턴스 메소드
- 인스턴스 변수에 대한 접근은 메소드를 통해서만 접근 가능함
- 인스턴스 변수의 값에 대한 접근을 위해 충분한 메소드의 공급이 필요함

주요 키워드
- 메시지 : 메소드의 호출
- 선택자 : 메시지에 공급되는 메소드 이름(단항 선택자, 이항 선택자, 키워드 선택자)

연산호출
q dequeue
- 클래스 Queue의 객체인 q에 대한 dequeue연산 호출
- 매개변수 없이 객체 q의 dequeue메소드에 메시지를 보냄
- 단항 메시지

q enqueue : x
- enqueue: <-- 키워드 선택자
- q는 객체에 대한 포인터

연산호출
myPen put: c at: thePosition
- 여러 개의 매개변수가 필요한 경우, 키워드 선택자에 의해 분리됨
- 메소드 put:과 at:을 두 매개변수로 호출한 것

이항선택자
1 + 2
- 객체 1에 '+2'의 메시지를 보냄 : 객체1의 메소드 +에 객체 2를 매개변수로 전달
- 메소드 '+'는 자신에게 2를 더하고 새로운 객체 3을 만듬
1 + 2 + 3
- 1+2의 결과인 객체 3에 '+3'의 메시지를 보냄

지정문
- 변수는 객체에 대한 포인터
a <- 10
- 변수 a는 객체 10에 대한 포인터
- 변수의 형이 없기 때문에 어떠한 객체라도 지시 가능

변수의 바인딩
- 변수의 형을 동적으로 바인딩함
- 변수에 대한 연산은 현재 바인딩된 객체의 클래스에 의해 결정
- 변수에 바인딩될 클래스가 동적으로 결정되므로 동적다형성이 제공

블록
[sum <- sum + count.count <- count +1]
- 순차로 실행될 식들을 모아서 블록을 구성함
- 객체로서 클래스 Block의 인스턴스로 블록에 메시지를 보낼 수 있음
- 블록에 단항메시지인 value가 보내져야 실행됨
- 블록의 값은 블록에 나오는 마지막 식의 값이 됨

조건문
x > 0
ifTrue:[sum<-sum+x]
ifFalse:[sum<-sum-x]
- 객체 true에 메시지가 보내지면 ifTrue:로 전달된 블록을 수행
- 객체 false에 메시지가 보내지면 ifFalse:로 전달된 블록을 수행

반복문
n <- 1.
sum <-0.
[n<=100]
whileTrue:[sum<-sum+count.n<-n+2]

xPower10 <- 1.
10 timesRepeat:[xPower10 <-xPower10*x]

클래스 정의
- 클래스 이름, 상위 클래스 이름, 인스턴스 변수와 인스턴스 메소드, 클래스 변수의 선언과 클래스 메소드의 선언


II. Java의 객체지향기능
개요

- 객체가 아닌 기본형 : 불형, 문자형, 수치형 => 효율성의 향상
- 래퍼 클래스 : 기본형을 객체로 변형
- new연산자에 의해 생성된 객체는 힙 영역에 할당됨
- Object클래스 이외의 모든 클래스는 부모클래스가 반드시 존재함
- 클래스변수, 클래스 메소드 : 클래스의 모든 객체가 공유함 => static지시어
- 인스턴스 메소드 : 인스턴스변수와 클래스변수 모두에 접근 가능
- 클래스 메소드 : 클래스 변수만 접근 가능

계승
public class Triangle extends Polygon {...}
- extends를 사용하여 계승
- 단일계승 : 부모클래스는 하나 존재
- private외의 모든 상위 클래스의 것을 계승
- 오버라이드 : 메소드의 재정의

인터페이스
- 가상클래스로 상수와 메소드의 선언만 가능
- 하위 클래스에서 메소드로 구현됨
- 상위 인터페이스를 하위 인터페이스가 계승 가능

패키지
- 클래스와 인터페이스로 구성
- 모든 클래스는 어떤 한 패키지에 속해야 함
- 동일한 패키지 내의 클래스와 인터페이스는 서로 이름이 달라야 함

I. 주요 사항의 비교
- 클래스 외에 다른 형이 허용되는가
- 하위 클래스가 하위형인가
- 다형성에 따른 형 조사는 어떻게 이루어지는가
- 접속부만 계승하는가 아니면 구현까지도 계승하는가
- 단일계승인가 다중계승인가
- 동적인 메시지 바인딩이 어느 정도로 채택되었는가


- Smalltalk : 클래스가 유일한 형. 언어가 간단하고 개념적 일관성을 가짐
- C++ : 클래스 + 명령형 언어의 형. 두 가지 전형을 동시에 사용. 실행속도가 빠르나 언언가 복잡함
- Java : 클래스 + 스칼라 형. 실행효율이 명령형 언어에 견줄 수 있음. 언어가 복잡

하위 클래스와 하위 형
- Ada의 모형과 하위 형
  > 부분집합관계이므로 모형이 쓰일 수 있는 곳은 하위형이 쓰일 수 있음
  => Positive형은 정수형이 사용될 수 있는 곳이면 어디서나 사용 가능
- 부모클래스와 하위 클래스
  > 부모클래스가 쓰일 수 있는 곳에 하위 클래스가 쓰일 수 있으면, 하위 클래스는 하위 형(IS-A관계)
- B is-a A
  하위 클래스에서는 변수의 추가, 메소드의 추가, 양립적인 메소드의 재정의만 가능
  상위 클래스의 변수나 메소드 재정의 불가

각 언어의 하위클래스와 하위 형
- Smalltalk
  하위 클래스가 상위 클래스의 모든 것을 계승
  하위클래스에서 부모 클래스의 것을 감출 수 없음
  하위 클래스는 하위 형
- C++/Java
  상위 클래스의 멤버가 하위 클래스에서 감추어질 수 있도록 하는 접근제어가 있으므로 모든 하위 클래스가 하위 형인 것은 아님

계승
- 접근제한에 따라
  접속부계승 : 하위 클래스가 부모 클래스의 접속부만을 접근할 수 있도록 하는 구조
  구현계승 : 수혜자에게는 은폐되는 부분까지를 접근할 수 있도록 하는 구조

구현계승
- 수혜자에게 은폐되는 부분, 즉 구현부분까지를 접근할 수 있도록 함
- 하위 클래스가 상위 클래스의 은폐부분을 접근할 수 있어, 상위 Class변경시 하위 Class가 연쇄적으로 영향을 받음
- 예> Smalltalk, C++, Java

접속부계승
- 하위 클래스가 부모의 접속부만 접근
- 상위클래스의 변경에 따라 하위 클래스에 영향을 받지 않음(S/W공학적 관점에서 좋음)
- 실제로는 지나치게 제한적
  하위 class작성시 부모 클래스의 내부 구조를 직접 접근하는 것이 실행 효율면에서 더 좋을 수 있음

계승의 종류
- 계승 개수에 따라 : 단일계승/다중계승

다중계승의 문제점
- 서로 다른 부모클래스에서 동일한 이름 발생시 -> 하위클래스에서 참조시에 문제 발생(다이아몬드계승)
- 프로그램 복잡성 증가
- 유지보수 어려움
- Smalltalk : 단일계승
- C++ : 다중계승 허용
- Java : 단일계승 채택, 인터페이스를 통한 다중계승 효과

다형성과 형 조사
- 객체지향언어
  포인터형 또는 참조형 변수에 의해 메소드 호출과 메소드 정의를 동적 바인딩함에 의해 포함다형성을 이룸
  -> 포함다형성을 위해 하위 클래스 메소드의 매개변수와 반환치의 형에 대한 형 조사의 문제 발생
- 매개변수와 반환치 형의 완화된 형태를 위한 조건
  -> 오버라이드 되는 메소드의 매개변수의 형은 오버라이드 하는 메소드 매개변수의 하위 형이어야 함
  -> 오버라이드하는 메소드의 결과치의 형은 오버라이드 되는 메소드 결과치의 하위 형이어야 함

각 언어의 다형성과 형 조사
- 유도클래스에 대하여 매개변수와 함수형이 기저클래스와 같은 형인지를 조사하는 방식
- 동적형조사는 더 복잡하고 형 오류를 실행시에 검출하는 단점을 가짐
- Smalltalk=동적 형 조사, C++/Java=정적 형 조사

메시지 바인딩
- 정적 바인딩
  동적 바인딩보다 빠름
  C++은 기본적으로 정적 바인딩. virtual로 명시된 가상함수만 동적 바인딩
- 동적 바인딩
  메시지 바인디잇 메소드를 찾기 위해 계층 구조를 추적해야 함
  Smalltalk, Java

II. 객체지향언어구조의 구현
객체의 구현(기저 클래스)
객체의 구현(유도 클래스)
메시지와 메소드의 동적 바인딩
- 각 객체에 할당되는 레코드에 여분의 필드를 두고, 가상 메소드 정보를 기록함
- 객체마다 자기가 사용할 수 있는 가상함수마다 포인터를 저장할 기억장소를 갖게 됨
- 가상메소드테이블(VMT) : 가상함수가 많을 시 기억공간의 낭비를 방지하기 위해

반응형

'B1:기초 Basement' 카테고리의 다른 글

객체 직렬화(Object Serialization)  (0) 2006.10.04
Wrapping a primitive  (0) 2006.10.03
대규모 프로그래밍  (0) 2006.10.03
XMLSpy Enterprise Edition  (0) 2006.10.02
범위 (Scope)  (0) 2006.09.17