10 장객체- 지향프로그래밍 II 창병모 1
상속 창병모 2
상속 (Inheritance) 상속이란무엇인가? 기존의클래스로부터새로운클래스를유도하는것 자식클래스는부모클래스의메쏘드와데이터를상속 자식클래스에새로운변수나메쏘드를추가할수있다. 기존클래스 부모클래스 (parent class), 수퍼클래스 (superclass), 기반클래스 (base class) 유도클래스 자식클래스 (child class), 서브클래스 (subclass) 창병모 3
상속 상속관계표시 UML 클래스다이어그램 자식으로부터부모로의화살표 Vehicle Car is-a 관계 (relationship) 자식이부모의보다구체적인버전이다. the child is a more specific version of the parent 창병모 4
상속 상속은왜하나? 소프트웨어재사용 (Software reuse) 기존의소프트웨어컴포넌트를사용해서새로운클래스생성 기존소프트웨어를재사용함으로써기존소프트웨어에들인모든노력을재사용 창병모 5
서브클래스유도 예약어 extends 를사용한다. class Car extends Vehicle { } // class contents 단일상속 (single inheritance) 만을지원 하나의슈퍼클래스로부터상속받음 창병모 6
예 : Book/Dictionary 창병모 7
창병모 8
protected 조정자 전용 (private) 가시성을갖는멤버 자식클래스내에서직접접근할수없다. 공용 (public) 가시성을갖는멤버 자식클래스뿐만아니라프로그램내어디서나접근가능 공용변수는캡슐화원리를위반 protected t 멤버 상속상황을위한제 3 의가시성 공용가시성보다는더캡슐화하고전용보다는덜캡슐화한다. 자식클래스가직접접근할수있다. 창병모 9
상속과 protected 조정자 protected 는왜필요한가? 나와내자식들만을위한것 public 으로한다면어떻게될까? private으로한다면어떻게될까? C++ 의 protected 자식클래스에서접근 / 사용가능 protected 멤버는자식에상속된다. Java 의 protected 자식클래스에서접근 / 사용가능 같은패키지내에서접근 / 사용가능 Protected 멤버는자식에상속된다. 창병모 10
상속과가시성조정자 상속시가시성 부모클래스 public protected private 자식클래스 public protected inaccesible 창병모 11
메쏘드재정의 창병모 12
메쏘드재정의 (overriding) 메쏘드재정의란무엇인가? 자식클래스가상속된메쏘드를자신이원하는대로재정의하는것 새로운메쏘드는부모메쏘드와이름과서명 (signature) 이같아야한다. 메쏘드의서명 (signature) 메쏘드의매개변수이름, 개수, 순서, 타입 재정의된메쏘드실행 그메쏘드를실행하는객체의타입에따라호출될메쏘드가결정된다. 창병모 13
메쏘드재정의 : 예 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(, t tl which h is a lemon ); } } 창병모 14
메쏘드재정의 : 예 class Example { public static void main(string args[]) { Fruit fruit = new Fruit(); Lemon lemon = new Lemon(); fruit.peel(); lemon.peel(); } } fruit = lemon; fruit.peel(); 창병모 15
중복정의 vs. 재정의 중복정의 한클래스내에같은이름의여러개의메쏘드로 서로다른서명을갖는경우 비슷한연산을다른매개변수에대해서다른방식으로정의하는데사용 재정의 부모클래스의메쏘드를자식클래스가재정의 서명이같아야한다. 시그너처가다르다면어떻게될까? 창병모 16
super 참조 super 는슈퍼클래스를지칭하는참조 슈퍼클래스의멤버필드나메소드를지칭할때사용 super.field super.method() super() super() 는슈퍼클래스의생성자를호출 super() 는생성자의맨처음부분에위치 서브클래스생성자에서슈퍼클래스의생성자를호출 창병모 17
다형성 (Polymorphism) 창병모 18
바인딩 (Binding) 바인딩이란무엇인가? 이름이가리키는대상을결정하는것 obj.doit(); 이호출은호출될메쏘드를결정즉바인딩한다. 컴파일시간에결정하면언제나같은메쏘드가호출될것이다. 동적바인딩 (dynamic binding) 그러나 Java 는동적바인딩을한다 runtime binding, late binding 이라고도한다. 왜동적바인딩을하는가? 프로그램설계에유연성을제공한다. 창병모 19
다형성 (Polymorphism) 다형성 (polymorphism) 의의미 많은형태를갖는다. "having many forms 다형참조 (polymorphic reference) 변수 때에따라다른타입의객체를참조할수있다. 다형참조를통해호출된메쏘드는호출할때마다다를수있다. Java 에서모든객체참조는다형적일수있다. 창병모 20
다형참조 객체참조변수 선언된클래스의객체와 선언된클래스의자손클래스의객체를참조할수있다. 예 : Fruit fruit; Fruit Lemon if ( ) fruit = new Fruit(); else fruit = new Lemon(); fruit.peel(); 창병모 21
동적바인딩 호출될메쏘드결정 참조변수의타입이아니고 실행시간에참조되고있는객체의타입에의해결정된다. fruit.peel(); fruit 가 Fruit 객체를참조하는경우 Fruit peel() Fruit 의 peel 호출 fruit 가 Lemon 객체를참조하는경우 Lemon 의 peel 호출 Lemon peel() 창병모 22
클래스설계 창병모 23
클래스설계는어떻게? 좋은클래스설계는어떤것일까? 가능하면공통적인것들은상부에위치하는것이좋다. 왜? 클래스계층구조는변화에따라확장혹은수정된다. 모든상황에맞는좋은클래스계층구조는없다. 창병모 24
상속을위한설계 상속은객체 - 지향설계에서중요한부분이다 시간을투자해서좋은소프트웨어설계를하면장기적으로득이된다. 적절하게설계된상속관계는소프트웨어의품격, 유지성, 재사용에크게기여할수있다. 좋은소프트웨어설계와관련된몇가지문제들을요약해보자. 창병모 25
상속을통한다형성 한부모의자식클래스가다른클래스의부모클래스가되어계층구조형성 StaffMember 계층구조 StaffMember Volunteer Employee Executive Hourly 창병모 26
클래스계층구조 형제클래스 (siblings) 같은부모의자식클래스들 클래스계층구조어떻게만들것인가? 클래스계층구조에서공통적인기능들을가능하면높이위치시킨다. 상속된멤버들은계속해서아래로상속된다. 따라서자식클래스는모든조상클래스들로부터상속받는다. 모든상황에적절한클래스계층구조는없다. 창병모 27
Object 클래스 Object 클래스 Object 클래스는모든클래스계층구조에서궁극적인루트 Java 표준라이브러리의 java.lang 패키지에정의되어있다. 모든클래스는 Object 클래스로부터상속받는다. 부모를선언하지않으면 Object 클래스의자식클래스가된다. Object 클래스가포함한유용한메쏘드 tostring() equals() 창병모 28
추상클래스 창병모 29
추상클래스 (Abstract Class) 추상클래스란무엇인가? 포괄적인개념을표현하기위한클래스로아직덜구현된클래스 추상메쏘드를포함한클래스를보통추상클래스로정의한다. 추상메쏘드가아닌완전히구현된메쏘드도포함가능 추상클래스는실체화될수없다. abstract 조정자사용 public abstract class Product { } abstract method1(); method2() { } // contents 창병모 30
추상클래스 자식클래스가부모클래스의추상메쏘드를구현한다. 구현하지않으면자식클래스도여전히추상클래스가된다. 추상메쏘드는 final 이나 static 으로선언하면안됨 추상클래스용도 클래스계층구조에서실체화하기에너무포괄적인공통요소들을 계층구조에위치시킬수있도록해준다. 창병모 31
추상클래스 : 예 창병모 32
Volunteer.java 창병모 33
창병모 34
인터페이스 창병모 35
인터페이스 (interface) 설계할클래스들에대한명세 (specification) 인터페이스 추상메쏘드와상수만으로구성된다. abstract 키워드는필요없다. 창병모 36
추상클래스와인터페이스 차이점 추상클래스는일부메소드는구현 인터페이스는전혀구현되어있지않음 상속관련차이점 추상클래스를이용하는경우에는단일상속만지원 인터페이스는다중상속 (multiple inheritance) 가능 창병모 37
인터페이스 (interface) interface is a reserved word None of the methods in an interface are given public interface Doable a definition (body) { public void dothis(); public int dothat(); public void dothis2 (float value, char ch); public boolean dotheother (int num); } A semicolon immediately follows each method header 창병모 38
인터페이스 인터페이스를구현한클래스 모든추상메쏘드를구현해야한다. implements class class-name implements interface-name { } 인터페이스내의메쏘드 모두 public and abstract 인터페이스로부터객체생성불가! 창병모 39
인터페이스 public class CanDo implements Doable { public void dothis () implements is a { reserved word // whatever } public void dothat () { // whatever } Each method listed in Doable is given a definition // etc. } 창병모 40
인터페이스 : 예 예 )DrawableCircle 창병모 41
인터페이스 : 예 예제 : Drawable.java 1 import java.awt.graphics; 2 3 interface Drawable { 4 void paint(graphics g); 5 } 예제 : DrawableCircle.java 1 import java.awt.*; 2 3 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 } 창병모 42
예제 : DrawApplet.java 1 import java.awt.*; awt 2 import java.applet.*; 3 4 public class DrawApplet extends Applet { 5 Drawable drawable[]; 6 7 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 } 13 14 public void paint(graphics g) { 15 int n = drawable.length; 16 for(int i=0; i< n; i++) { 17 drawable[i].paint(g); 18 }.. 창병모 43
인터페이스특성 인터페이스의멤버필드는디폴드로 static, final 로선언 값을변경하려는시도는컴파일시에에러를발생 인터페이스를구현한클래스는인터페이스의멤버필드를사용할수있다. 인터페이스사이의상속가능 클래스와마찬가지로키워드 extends 를사용 interface ScaledDrawable extends Drawable{..} 창병모 44
C++ 창병모 45
C++ : 상속 class B { public: int x; char f(); B(); } class D: public B { int x; int g(); } // D derived from B // D::x is added, B::x is inherited // added member function 창병모 46
C++ : Public 상속 구문 class <derived> : public <base> { } <member-declarations> 자식클래스에서가시성 부모클래스 public protected private 자식클래스 public protected inaccesible 창병모 47
C++: Private 상속 상속된멤버는자식클래스에서전용 (private) 이된다. class <derived> : private <base> { <member-declarations> } 상속된멤버의가시성 부모클래스 public protected private 자식클래스 private private inaccesible 창병모 48
C++ : Virtual 함수 C++ 의가상함수 (virtual function) 자식클래스에서재정의될수있는함수 모든 java 메쏘드는 virtual!! C++ 의순수가상함수 (pure virtual function) Java 의추상메쏘드 (abstract method) 자식클래스에서정의되는함수 가상함수호출 객체에타입에따라동적바인딩된다. 창병모 49
C++ : 동적바인딩 class A { public: void p() { cout << A::p\n ; } virtual void q() { cout << A::q\n ;} void f() { p(); q(); } } class B: public A { public: void p() { cout << B::p\n ; } void q() { cout << B::q\n ; } } 창병모 50
C++ : 동적바인딩 main() { A a; B b; a.f(); b.f(); a = b; a.f(); } main() { A *a =newa; B *b = new B; a->f(); b->f(); a = b; a->f(); } 창병모 51
구현 창병모 52
객체구현 객체는구조체 ( 레코드 ) 처럼메모리가할당된다. 각실체변수에대한메모리할당. 동적바인딩 가상메쏘드테이블 (Virtual method table) 이용 각객체는이테이블에대한포인터를갖는다. 접근가능성검사 접근가능성검사는컴파일시간에이루어진다. 창병모 53
메쏘드테이블 (Method Table) 메쏘드테이블 각클래스마다메쏘드테이블이하나씩있다. 클래스의모든가상메쏘드는하나의인덱스를갖는다. 각인덱스의내용은해당메쏘드코드의주소 메쏘드호출구현 대상객체의메쏘드테이블포인터를따라간다. 해당인덱스의메쏘드주소를따라간다. 그주소로점프한다. 창병모 54
메쏘드테이블 상속과재정의 서브클래스는수퍼클래스의메쏘드테이블을상속받는다. 메쏘드가재정의되면, 해당메쏘드테이블을갱신하다. 창병모 55
클래스와메쏘드테이블 class A { int foo() { } address of foo() 0 void bar() { } address of bar() 1 }; Method table of A class B extends A { int foo() { } float boo() { } }; address of foo() 0 address of bar() 1 address of boo() 2 Method table of B 창병모 56
메쏘드호출예 A a = new A(); a.foo();. a = new B(); a.foo(); a.bar();. Object reference Objects Method tables variable 0 address of foo() a new A( ) Data 1 address of bar() new B( ) 0 address of foo() Data 1 address of bar() 2 address of boo() 창병모 57