58
10장 객체-지향 프로그래밍 II

10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

10장 객체-지향 프로그래밍 II

Page 2: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속

Page 3: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

3

상속(Inheritance)

상속이란 무엇인가?

기존의 클래스로부터 새로운 클래스를 유도하는 것

자식 클래스는 부모 클래스의 메쏘드와 데이터를 상속

자식 클래스에 새로운 변수나 메쏘드를 추가할 수 있다.

기존 클래스

부모 클래스(parent class), 수퍼 클래스(superclass),

기반 클래스(base class)

유도 클래스

자식 클래스(child class), 서브클래스(subclass)

Page 4: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

4

상속

상속 관계 표시UML 클래스 다이어그램

자식으로부터 부모로의 화살표

Vehicle

Car

is-a 관계(relationship)자식이 부모의 보다 구체적인 버전이다.

the child is a more specific version of the parent

Page 5: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속

상속은 왜 하나?

소프트웨어 재사용(Software reuse)

기존의 소프트웨어 컴포넌트를 사용해서 새로운 클래스 생성

기존 소프트웨어를 재사용함으로써 기존 소프트웨어에 들인모든 노력을 재사용

Page 6: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

6

서브클래스 유도

예약어 extends를 사용한다.

단일 상속(single inheritance)만을 지원하나의 슈퍼클래스로부터 상속 받음

class Car extends Vehicle{

// class contents}

Page 7: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

예: Book/Dictionary

Page 8: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)
Page 9: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

9

protected 조정자

전용(private) 가시성을 갖는 멤버

자식 클래스 내에서 직접 접근할 수 없다.

공용(public) 가시성을 갖는 멤버

자식 클래스뿐만 아니라 프로그램 내 어디서나 접근 가능

공용 변수는 캡슐화 원리를 위반

protected 멤버

상속 상황을 위한 제3의 가시성

공용 가시성보다는 더 캡슐화하고 전용보다는 덜 캡슐화 한다.

자식 클래스가 직접 접근할 수 있다.

Page 10: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속과 protected 조정자

protected는 왜 필요한가 ?나와 내 자식들만을 위한 것public으로 한다면 어떻게 될까?private으로 한다면 어떻게 될까?

C++의 protected 자식 클래스에서 접근/사용 가능protected 멤버는 자식에 상속된다.

Java의 protected 자식 클래스에서 접근/사용 가능같은 패키지 내에서 접근/사용 가능Protected 멤버는 자식에 상속된다.

Page 11: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속과 가시성 조정자

상속 시 가시성

inaccesibleprotectedpublic자식클래스

privateprotectedpublic부모클래스

Page 12: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 재정의

Page 13: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

13

메쏘드 재정의(overriding)메쏘드 재정의란 무엇인가?

자식 클래스가 상속된 메쏘드를 자신이 원하는 대로 재정의하는 것

새로운 메쏘드는 부모 메쏘드와 이름과 서명(signature)이 같아야한다.

메쏘드의 서명(signature)

메쏘드의 매개변수 이름, 개수, 순서, 타입

재정의된 메쏘드 실행

그 메쏘드를 실행하는 객체의 타입에 따라 호출될 메쏘드가 결정된다.

Page 14: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 재정의: 예class Fruit {

int grams;int cals_per_gram;

int total_calories( ) { /* … */ }void peel( ) { System.out.print(“peel a Fruit”); }

}

class Lemon extends Fruit {void squeeze( ) { /* … */ }// Fruit 클래스의 peel() 메쏘드를 Lemon 클래스가 재정의void peel( ) {

super.peel();System.out.println(“, which is a lemon”);

}}

Page 15: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 재정의: 예class Example {

public static void main(String args[]) {Fruit fruit = new Fruit();Lemon lemon = new Lemon();

fruit.peel();lemon.peel();

fruit = lemon;fruit.peel();

}}

Page 16: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

16

중복 정의 vs. 재정의

중복정의

한 클래스 내에 같은 이름의 여러 개의 메쏘드로

서로 다른 서명을 갖는 경우

비슷한 연산을 다른 매개변수에 대해서 다른 방식으로 정의하는데사용

재정의

부모 클래스의 메쏘드를 자식 클래스가 재정의

서명이 같아야 한다.

시그너처가 다르다면 어떻게 될까?

Page 17: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

super 참조

super는 슈퍼클래스를 지칭하는 참조슈퍼클래스의 멤버 필드나 메소드를 지칭할 때 사용

super.field

super.method()

super()super()는 슈퍼클래스의 생성자를 호출

super()는 생성자의 맨 처음 부분에 위치

서브클래스 생성자에서 슈퍼클래스의 생성자를 호출

Page 18: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

다형성(Polymorphism)

Page 19: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

바인딩(Binding)바인딩이란 무엇인가?

이름이 가리키는 대상을 결정하는 것

obj.doIt();

이 호출은 호출될 메쏘드 를 결정 즉 바인딩 한다.

컴파일 시간에 결정하면 언제나 같은 메쏘드가 호출될 것이다.

동적 바인딩(dynamic binding)

그러나 Java는 동적 바인딩을 한다

runtime binding, late binding 이라고도 한다.

왜 동적 바인딩을 하는가?

프로그램 설계에 유연성을 제공한다.

Page 20: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

다형성(Polymorphism)다형성(polymorphism)의 의미

많은 형태를 갖는다.

"having many forms“

다형 참조(polymorphic reference) 변수

때에 따라 다른 타입의 객체를 참조할 수 있다.

다형 참조를 통해 호출된 메쏘드는 호출할 때마다 다를 수 있다.

Java에서 모든 객체 참조는 다형적일 수 있다.

Page 21: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

21

다형참조

객체 참조 변수

선언된 클래스의 객체와

선언된 클래스의 자손 클래스의 객체를 참조할 수 있다.

예:

Holiday day;day = new Christmas();

Holiday

Christmas

Page 22: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

동적 바인딩

호출될 메쏘드 결정

참조 변수의 타입이 아니고

실행시간에 참조되고 있는 객체의 타입에 의해 결정된다.

day.celebrate();

day가 Holiday 객체를 참조하는 경우

Holiday의 celebrate 호출

day가 Christmas 객체를 참조하는 경우

Christmas의 celebrate 호출

Holidaycelebrate()

Christmascelebrate()

Page 23: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

23

다형참조: 예예

Fruit fruit;if ( … )

fruit = new Fruit();else

fruit = new Lemon();fruit.peel();

fruit.peel();fruit가 Fruit 객체를 참조하는 경우

fruit가 Lemon 객체를 참조하는 경우

한 줄의 코드가 경우에 따라 다른 메쏘드를 호출할 수 있다.

Fruit

Lemon

Page 24: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

클래스 설계

Page 25: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

25

클래스 설계는 어떻게 ?좋은 클래스 설계는 어떤 것일까 ?

가능하면 공통적인 것들은 상부에 위치하는 것이 좋다. 왜 ?

클래스 계층구조는 변화에 따라 확장 혹은 수정된다.

모든 상황에 맞는 좋은 클래스 계층구조는 없다.

Page 26: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속을 위한 설계

상속은 객체-지향 설계에서 중요한 부분이다

시간을 투자해서 좋은 소프트웨어 설계를 하면 장기적으로 득이 된다.

적절하게 설계된 상속 관계는 소프트웨어의 품격, 유지성, 재사용에 크게 기여할 수 있다.

좋은 소프트웨어 설계와 관련된 몇 가지 문제들을 요약해보자.

Page 27: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

상속을 통한 다형성

한 부모의 자식 클래스가 다른 클래스의 부모 클래스가 되어 계층구조 형성

StaffMember 계층구조

StaffMember

Executive Hourly

Volunteer Employee

Page 28: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

28

클래스 계층구조

형제 클래스(siblings)

같은 부모의 자식 클래스들

클래스 계층구조 어떻게 만들 것인가?

클래스 계층구조에서 공통적인 기능들을 가능하면 높이 위치시킨다.

상속된 멤버들은 계속해서 아래로 상속된다.

따라서 자식 클래스는 모든 조상 클래스들로부터 상속 받는다.

모든 상황에 적절한 클래스 계층구조는 없다.

Page 29: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

29

Object 클래스

Object 클래스

Object 클래스는 모든 클래스 계층구조에서 궁극적인 루트

Java 표준 라이브러리의 java.lang 패키지에 정의되어 있다.

모든 클래스는 Object 클래스로부터 상속받는다.

부모를 선언하지 않으면 Object 클래스의 자식 클래스가 된다.

Object 클래스가 포함한 유용한 메쏘드

toString()

equals()

Page 30: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

추상 클래스

Page 31: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

추상 클래스(Abstract Class)추상 클래스란 무엇인가?

포괄적인 개념을 표현하기 위한 클래스로 아직 덜 구현된 클래스

추상 메쏘드를 포함한 클래스를 보통 추상 클래스로 정의한다.

추상 메쏘드가 아닌 완전히 구현된 메쏘드도 포함 가능

추상 클래스는 실체화될 수 없다.

abstract 조정자 사용

public abstract class Product{

abstract method1();method2() { … }// contents

}

Page 32: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

추상 클래스

자식 클래스가 부모 클래스의 추상 메쏘드를 구현한다.

구현하지 않으면 자식 클래스도 여전히 추상 클래스가 된다.

추상 메쏘드는 final이나 static으로 선언하면 안됨

추상 클래스 용도

클래스 계층구조에서 실체화하기에 너무 포괄적인 공통 요소들을

계층구조에 위치시킬 수 있도록 해준다.

Page 33: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

추상 클래스: 예

Page 34: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

Volunteer.java

Page 35: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)
Page 36: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스

Page 37: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스(interface)

설계할 클래스들에 대한 명세(specification)

인터페이스

추상 메쏘드와 상수만으로 구성된다.

abstract 키워드는 필요 없다.

Page 38: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

추상 클래스와 인터페이스

차이점추상 클래스는 일부 메소드는 구현

인터페이스는 전혀 구현되어 있지 않음

상속 관련 차이점추상 클래스를 이용하는 경우에는 단일 상속만 지원

인터페이스는 다중 상속 (multiple inheritance) 가능

Page 39: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스(interface)

public interface Doable{

public void doThis();public int doThat();public void doThis2 (float value, char ch);public boolean doTheOther (int num);

}

interface is a reserved wordinterface is a reserved wordNone of the methods in anNone of the methods in an

interface are giveninterface are givena definition (body)a definition (body)

A semicolon immediatelyA semicolon immediatelyfollows each method headerfollows each method header

Page 40: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

40

인터페이스인터페이스를 구현한 클래스

모든 추상 메쏘드를 구현해야 한다.

implements

class class-name implements interface-name {

}

인터페이스 내의 메쏘드

모두 public and abstract

인터페이스로부터 객체 생성 불가 !

Page 41: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스

public class CanDo implements Doable{

public void doThis (){

// whatever}

public void doThat (){

// whatever}

// etc.}

implements is aimplements is areserved wordreserved word

Each method listedEach method listedin Doable isin Doable is

given a definitiongiven a definition

Page 42: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스: 예

예)DrawableCircle

Page 43: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

예제 : Drawable.java1 import java.awt.Graphics;23 interface Drawable {4 void paint(Graphics g);5 }

예제 : DrawableCircle.java1 import java.awt.*;23 class DrawableCircle extends Circle implements Drawable {4 protected int x, y;……

16 public void paint(Graphics g) {17 g.drawOval(x-r, y-r, 2*r, 2*r);18 }19 }

인터페이스: 예

Page 44: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

예제 : DrawApplet.java1 import java.awt.*;2 import java.applet.*;34 public class DrawApplet extends Applet {5 Drawable drawable[];67 public void init() {8 drawable = new Drawable[3];9 drawable[0] = new DrawableCircle(45, 45, 30);

10 drawable[1] = new DrawableRectangle(25, 25, 40, 65);11 drawable[2] = new DrawableCircle(90, 70, 60);12 }1314 public void paint(Graphics g) {15 int n = drawable.length;16 for(int i=0; i< n; i++) {17 drawable[i].paint(g);18 }………..

Page 45: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

인터페이스 특성

인터페이스의 멤버필드는 디폴드로 static, final로 선언

값을 변경하려는 시도는 컴파일 시에 에러를 발생

인터페이스를 구현한 클래스는 인터페이스의 멤버필드를 사용할수 있다.

인터페이스 사이의 상속 가능

클래스와 마찬가지로 키워드 extends를 사용

interface ScaledDrawable extends Drawable{…..}

Page 46: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++

Page 47: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++ : 상속

class B {public:

int x;char f();

B();}

class D: public B { // D derived from Bint x; // D::x is added, B::x is inheritedint g(); // added member function

}

Page 48: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++ : Public 상속

구문

class <derived> : public <base> {

<member-declarations>}

자식 클래스에서 가시성

inaccesibleprotectedpublic자식클래스

privateprotectedpublic부모클래스

Page 49: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++: Private 상속

상속된 멤버는 자식클래스에서 전용(private)이 된다.

class <derived> : private <base> {

<member-declarations>}

상속된 멤버의 가시성

inaccesibleprivateprivate자식클래스

privateprotectedpublic부모클래스

Page 50: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++ : Virtual 함수

C++의 가상 함수(virtual function)

자식클래스에서 재정의될 수 있는 함수

모든 java 메쏘드는 virtual !!

C++의 순수 가상 함수(pure virtual function)

Java의 추상 메쏘드(abstract method)

자식클래스에서 정의되는 함수

가상 함수 호출

객체에 타입에 따라 동적 바인딩 된다.

Page 51: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++ : 동적 바인딩

class B {public:

virtual char f() { return ‘B’; }char g() { return ‘B’; }char testF { return f(); } char testG { return g(); }

}

class D: public B { // D derived from Bpublic:

char f() { return ‘D’; }char g() { return ‘D’; }

}

Page 52: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

C++ : 동적 바인딩

main() {

D d;

print d.testF(), d.testG();

}

Page 53: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

구현

Page 54: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

객체 구현

객체는 구조체(레코드)처럼 메모리가 할당된다.

각 실체 변수에 대한 메모리 할당.

동적 바인딩

가상 메쏘드 테이블(Virtual method table) 이용

각 객체는 이 테이블에 대한 포인터를 갖는다.

접근 가능성 검사

접근 가능성 검사는 컴파일 시간에 이루어진다.

Page 55: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 테이블(Method Table)메쏘드 테이블

각 클래스마다 메쏘드 테이블이 하나씩 있다.

클래스의 모든 가상 메쏘드는 하나의 인덱스를 갖는다.

각 인덱스의 내용은 해당 메쏘드 코드의 주소

메쏘드 호출 구현

대상 객체의 메쏘드 테이블 포인터를 따라간다.

해당 인덱스의 메쏘드 주소를 따라간다.

그 주소로 점프한다.

Page 56: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 테이블

상속과 재정의

서브클래스는 수퍼클래스의 메쏘드 테이블을 상속받는다.

메쏘드가 재정의되면, 해당 메쏘드 테이블을 갱신하다.

Page 57: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

클래스와 메쏘드 테이블

class A {

int foo() {…}

void bar() {…}

};

class B extends A {

int foo() {…}

float boo() {…}

};

address of foo()

address of bar()

01

address of foo()

address of bar()

01

address of boo() 2

Method table of A

Method table of B

Page 58: 10장객체지향프로그래밍 - cs.sookmyung.ac.krcs.sookmyung.ac.kr/~chang/lecture/pl06/chap11.pdf자식클래스는부모클래스의메쏘드와데이터 ... 바인딩(Binding)

메쏘드 호출 예

A a = new A();

a.foo();

….

a = new B();a.foo();

a.bar();

….

•Get the method table of A•foo’s id is 0•Get the address of 0th method•Jump to the address

•Get the method table of B•foo’s id is 0•Get the address of 0th method•Jump to the address

•Get the method table of B•bar’s id is 1•Get the address of 1st method•Jump to the address