39
7 7 장장장장 장장장장장장장 장장장장 장장장장장장장 장장장 장장장 장장장장 장장 장장장 장장장장 장장 장장장 abstract abstract 장장장장 장장장장장 장장장장 장장장장장

7 장 상속부터 인터페이스까지

  • Upload
    zaide

  • View
    43

  • Download
    3

Embed Size (px)

DESCRIPTION

7 장 상속부터 인터페이스까지. 상속성 다형성과 가상 메서드 abstract 클래스와 인터페이스. 상속성. 상속성이란 상속성 (Inheritance) 이란 , 기존에 정의한 객체가 가지는 특성을 그대로 물려받아 새로운 객체를 정의하는 것 상속이란 두 개의 클래스간의 관계를 정의하는 특성 상속 관계에 있는 클래스를 베이스 클래스와 상속받은 클래스라고 정의 베이스 (base) 클래스 - 이미 정의해놓은 클래스 상속받은 (derived) 클래스 - 기존 클래스를 상속받아서 새로 정의한 클래스 - PowerPoint PPT Presentation

Citation preview

Page 1: 7 장 상속부터 인터페이스까지

77 장장 상속부터 인터페이스까지 상속부터 인터페이스까지

상속성상속성다형성과 가상 메서드다형성과 가상 메서드abstract abstract 클래스와 인터페이스클래스와 인터페이스

Page 2: 7 장 상속부터 인터페이스까지

상속성상속성 상속성이란 상속성이란

상속성 (Inheritance) 이란 , 기존에 정의한 객체가 가지는 특성을 그대로 물려받아 새로운 객체를 정의하는 것

상속이란 두 개의 클래스간의 관계를 정의하는 특성 상속 관계에 있는 클래스를 베이스 클래스와 상속받은

클래스라고 정의 베이스 (base) 클래스 - 이미 정의해놓은 클래스 상속받은 (derived) 클래스 - 기존 클래스를 상속받아서 새로

정의한 클래스 상속 구현 상속 구현

모든 클래스는 베이스 클래스를 가질 수 있으며 , 다른 클래스에게 상속될 수 있다

Page 3: 7 장 상속부터 인터페이스까지

상속성상속성 상속 구현 상속 구현

Class1 클래스를 상속받아 Class2 클래스를 선언한 예

상속받은 클래스에서는 마치 베이스 클래스의 모든 멤버를 정의해놓은 것처럼 그대로 가져다 쓸 수 있다

Page 4: 7 장 상속부터 인터페이스까지

상속성상속성 상속 구현 상속 구현

Point 클래스를 상속받아 Point3D 클래스를 정의한 경우 , 상속받은 클래스에서 베이스 클래스 멤버를 자기 멤버인양 쓸 수 있다

Page 5: 7 장 상속부터 인터페이스까지

상속 클래스상속 클래스 예제예제 ①① Point Point 클래스를 정의하고클래스를 정의하고 , , 이 클래스를 상속받아 이 클래스를 상속받아 Point3Point3

D D 클래스를 정의해보는 예제 클래스를 정의해보는 예제

프로젝트 유형 :  콘솔 응용 프로그램 프로젝트 이름 :   Inherit

Page 6: 7 장 상속부터 인터페이스까지

상속 클래스상속 클래스 예제예제②② x,y x,y 필드와 필드와 SetPoint SetPoint 메서드메서드 , Draw , Draw 메서드를 메서드를

정의하고정의하고 , Draw , Draw 메서드는 메서드는 x, y x, y 필드 값을 보여주도록 필드 값을 보여주도록 구현 구현 class Pointclass Point{{ public int x; public int x; // x,y // x,y 필드필드 public int y;public int y;

public void SetPoint( int x, int y ) public void SetPoint( int x, int y ) // SetPoint // SetPoint 메서드메서드 {{ this.x = x;this.x = x; this.y = y;this.y = y; }}

public void Draw() public void Draw() // Draw // Draw 메서드메서드 {{ Console.WriteLine( "({0},{1})", x, y );Console.WriteLine( "({0},{1})", x, y ); }}} }

Page 7: 7 장 상속부터 인터페이스까지

상속 클래스상속 클래스 예제예제③③ Point3D Point3D 클래스는 클래스는 Point Point 클래스를 상속받아 정의하클래스를 상속받아 정의하

고고 , z , z 멤버만 하나 더 추가 멤버만 하나 더 추가

④④ Main Main 메서드에서 메서드에서 Point3D Point3D 객체를 생성하고 객체를 생성하고 Draw Draw 메서드를 호출메서드를 호출

// Point // Point 클래스 상속클래스 상속class Point3D : Pointclass Point3D : Point{{ public int z; public int z; }}

class Class1class Class1{{ static void Main(string[] args)static void Main(string[] args) {{ Point3D pt3d = new Point3D(); Point3D pt3d = new Point3D(); // Point3D // Point3D 객체 생성객체 생성

pt3d.Draw(); pt3d.Draw(); // Point // Point 클래스의 클래스의 Draw()Draw() }}}}

Page 8: 7 장 상속부터 인터페이스까지

상속 클래스상속 클래스 예제예제⑤⑤ pt3dpt3d 를 입력하고를 입력하고 , ‘.’, ‘.’ 을 입력하면을 입력하면 , Point3D , Point3D

객체에서 사용할 수 있는 멤버 리스트를 보여준다 객체에서 사용할 수 있는 멤버 리스트를 보여준다

Page 9: 7 장 상속부터 인터페이스까지

메서드 재정의메서드 재정의 예제예제 ①① 상속받은 클래스에서 베이스 클래스의 멤버를 상속받은 클래스에서 베이스 클래스의 멤버를

재정의하는 방법을 알아보는 예제 재정의하는 방법을 알아보는 예제

프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : InheritNew

Page 10: 7 장 상속부터 인터페이스까지

메서드 재정의메서드 재정의 예제예제②② Point Point 클래스를 정의하고 클래스를 정의하고 Draw Draw 메서드를 정의 메서드를 정의

class Pointclass Point{{ public int x; public int x; // x,y // x,y 필드필드 public int y;public int y;

public void SetPoint( int x, int y ) public void SetPoint( int x, int y ) // SetPoint // SetPoint 메서드메서드 {{ this.x = x;this.x = x; this.y = y;this.y = y; }}

public void Draw() public void Draw() // Draw // Draw 메서드메서드 {{ Console.WriteLine( "({0},{1})", x, y );Console.WriteLine( "({0},{1})", x, y ); }}}}

Page 11: 7 장 상속부터 인터페이스까지

메서드 재정의메서드 재정의 예제예제③③ Point3D Point3D 클래스를 정의하고클래스를 정의하고 , SetPoint , SetPoint 메서드와 메서드와 Draw Draw

메서드를 정의 메서드를 정의

class Point3D : Pointclass Point3D : Point{{ public int z;public int z;

public void SetPoint( int x, int y, int z )public void SetPoint( int x, int y, int z ) {{ SetPoint( x, y ); SetPoint( x, y ); // base class // base class 멤버를 부른다멤버를 부른다 .. this.z = z;this.z = z; }}

public new void Draw() public new void Draw() // // 메서드 재정의메서드 재정의 , new , new 키워드키워드 {{ Console.WriteLine( "( {0}, {1}, {2} ) ", x, y, z );Console.WriteLine( "( {0}, {1}, {2} ) ", x, y, z ); }}}}

Page 12: 7 장 상속부터 인터페이스까지

메서드 재정의메서드 재정의 예제예제④④ Point Point 클래스와 클래스와 Point3D Point3D 클래스를 생성하고클래스를 생성하고 , , 각각 각각 DD

raw raw 메서드를 호출메서드를 호출

class Testclass Test{{ static void Main() static void Main() {{ Point pt = new Point(); Point pt = new Point(); // Point // Point 클래스클래스 pt.SetPoint( 10, 20 );pt.SetPoint( 10, 20 ); pt.Draw();pt.Draw();

Point3D pt3d = new Point3D(); Point3D pt3d = new Point3D(); // Point3D // Point3D 클래스클래스 pt3d.SetPoint( 100, 200, 300 );pt3d.SetPoint( 100, 200, 300 ); pt3d.Draw();pt3d.Draw(); }}}}

Page 13: 7 장 상속부터 인터페이스까지

base base 키워드키워드 예제예제 ①① 상속받은 클래스에서 베이스 클래스의 멤버를 사용할 상속받은 클래스에서 베이스 클래스의 멤버를 사용할

때때 , base , base 키워드를 사용해보고 생성자를 정의해보는 예제 키워드를 사용해보고 생성자를 정의해보는 예제

프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : InheritBase

Page 14: 7 장 상속부터 인터페이스까지

base base 키워드키워드 예제예제②② 상속받은 클래스에서 베이스 클래스의 상속받은 클래스에서 베이스 클래스의 Draw Draw

메서드를 부르려면 다음과 같이 메서드를 부르려면 다음과 같이 base base 키워드를 이용 키워드를 이용

class Pointclass Point{{ public void Draw() public void Draw() // Draw // Draw 메서드메서드 {{ Console.WriteLine( "Point.Draw()“ );Console.WriteLine( "Point.Draw()“ ); }}}}

class Point3D : Pointclass Point3D : Point{{ public new void Draw() public new void Draw() // Draw // Draw 메서드 재정의메서드 재정의 {{ base.Draw();base.Draw(); // Point.Draw()// Point.Draw()

Console.WriteLine( "Point3D.Draw()“ );Console.WriteLine( "Point3D.Draw()“ ); }}}}

상속받은 클래스에서

베이스 클래스에 정의된 멤버를

사용할 때 base 키워드를 사용

Page 15: 7 장 상속부터 인터페이스까지

base base 키워드키워드 예제예제③③ 상속받은 클래스에 생성자를 정의할 때상속받은 클래스에 생성자를 정의할 때 , , 베이스 베이스

클래스의 생성자를 불러서 값을 초기화 클래스의 생성자를 불러서 값을 초기화

class Pointclass Point{{ public Point( int x, int y )public Point( int x, int y ) {{ }} ......}}

class Point3D : Pointclass Point3D : Point{{ public Point3D( int x, int y, int z ) : public Point3D( int x, int y, int z ) : base( x, y )base( x, y ) {{ }} ......}}

베이스 클래스 생성자를 부를 때 base 키워드를 사용

Page 16: 7 장 상속부터 인터페이스까지

상속성상속성 sealed sealed 클래스 클래스

sealed 클래스는 다른 객체가 이 클래스를 상속받지 못하도록 할 때 사용

더 이상 클래스를 상속받아 쓸 수 없도록 닫아버리는 것 sealed 클래스를 상속받아 클래스를 정의하려고 하면 컴파일

오류가 발생

public public sealedsealed class Base class Base {{ ...... }}

// sealed // sealed 클래스는 상속받을 수 없습니다클래스는 상속받을 수 없습니다 .. class Derived : Baseclass Derived : Base {{ ...... }}

Page 17: 7 장 상속부터 인터페이스까지

상속성상속성 protected protected 멤버 멤버

멤버 접근 제어는 클래스 외부에서 멤버를 사용할 때 적용되는 규칙 private 멤버는 클래스 외부에서 사용하는 것을 허용하지 않는

멤버 public 멤버는 외부 어디서나 자유롭게 사용하도록 허용한 멤버 protected 멤버는 자신을 상속받은 클래스에게 사용할 수 있도록

권한을 부여

public BaseObjpublic BaseObj{{ protected protected void Move() void Move() // protected // protected 멤버멤버 {{ }}}}

Page 18: 7 장 상속부터 인터페이스까지

상속성상속성 protected protected 멤버 멤버

상속받은 클래스는 베이스 클래스의 protected 멤버와 public 멤버를 사용할 수 있다 .

protected 멤버는 상속받은 클래스에게 접근 권한을 준 것이기 때문에 , 클래스 외부에서는 사용할 수 없는 멤버

Page 19: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 다형성 다형성

다형성은 상속 관계를 갖는 클래스에 적용할 수 있는 객체 프로그래밍의 한 특성으로 , 하나의 객체가 여러 가지 특성을 가지는 것을 의미

클래스마다 각각 고유한 기능을 구현하고 , 가상 메서드를 통해서 다양한 기능을 호출

가상 메서드를 통해서 Point 클래스에 정의된 Draw 메서드를 호출

DrawObj obj = new Point();DrawObj obj = new Point(); obj.Draw();obj.Draw();

Page 20: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 가상 메서드 가상 메서드

메서드를 가상 메서드로 만드는 방법은 함수 앞에 virtual 이라고 명시

상속받은 클래스에서 가상 메서드를 다시 정의할 때는 override 키워드를 사용

Page 21: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 예제예제 ①① 베이스 클래스에 가상 메서드를 정의하고베이스 클래스에 가상 메서드를 정의하고 , , 상속받은 상속받은

클래스의 메서드를 불러보는 예제 클래스의 메서드를 불러보는 예제

프로젝트 유형 :  콘솔 응용 프로그램 프로젝트 이름 : Virtual

Page 22: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 예제예제②② DrawObj DrawObj 클래스에 클래스에 Draw Draw 가상 메서드를 정의하고가상 메서드를 정의하고 , Po, Po

int int 클래스에는 클래스에는 Draw Draw 메서드를 구현 메서드를 구현 class DrawObjclass DrawObj{{public virtual void Draw()public virtual void Draw() // // 가상 메서드가상 메서드 {{ Console.WriteLine( "DrawObj.Draw()");Console.WriteLine( "DrawObj.Draw()"); }}}}

class Point : DrawObjclass Point : DrawObj{{ public int x; public int x; // x, y // x, y 필드필드 public int y;public int y;

public Point( int x, int y ) public Point( int x, int y ) // // 생성자생성자 {{ this.x = x;this.x = x; this.y = y;this.y = y; }}

public override void Draw()public override void Draw() // // 메서드 구현메서드 구현 {{ Console.WriteLine( "( x, y ) = ({0},{1})", x, y );Console.WriteLine( "( x, y ) = ({0},{1})", x, y ); }}}}

Page 23: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 예제예제③③ DrawObj DrawObj 클래스에 정의된 가상 메서드를 통해서 클래스에 정의된 가상 메서드를 통해서 PoinPoin

t t 클래스의 클래스의 Draw Draw 메서드를 호출메서드를 호출

④④ DrawObj DrawObj 객체 선언한 참조 변수를 통해서 객체 선언한 참조 변수를 통해서 Point Point 객체의 객체의 Draw Draw 메서드를 부른 결과 메서드를 부른 결과

class Class1class Class1{{ static void Main(string[] args)static void Main(string[] args) {{ DrawObj obj = new Point( 100, 200 );DrawObj obj = new Point( 100, 200 ); obj.Draw();obj.Draw(); }}}}

Page 24: 7 장 상속부터 인터페이스까지

가상 메서드가상 메서드 예제예제⑤⑤ DrawObj DrawObj 클래스에서 클래스에서 virtual virtual 키워드 없애고 다시 키워드 없애고 다시

예제를 실행 예제를 실행

Page 25: 7 장 상속부터 인터페이스까지

abstract abstract 클래스클래스 abstract abstract 클래스 클래스

abstract 클래스는 아무런 기능이 없는 객체를 생성해서 쓰는 것을 방지

abstract 클래스는 객체 그 자체로는 인스턴스 객체를 생성할 수 없으며 , 다른 객체가 상속받은 경우에만 가능

Page 26: 7 장 상속부터 인터페이스까지

abstract abstract 클래스클래스 abstract abstract 클래스 클래스

abstract 클래스를 생성하려고 하면 컴파일 오류가 발생

abstract 클래스는 상속받은 다른 클래스를 대신할 때 사용하며 , 상속받은 객체를 생성하고 레퍼런스 변수에 넣어두는 용도로 사용

static void Main() static void Main() {{ // // 단독으로 객체를 생성할 수 없음단독으로 객체를 생성할 수 없음 .. DrawObj obj = new DrawObj();DrawObj obj = new DrawObj(); }}

static void Main() static void Main() {{ // abstract // abstract 클래스클래스 DrawObj obj = new Point( 100, 200 );DrawObj obj = new Point( 100, 200 ); }}

Page 27: 7 장 상속부터 인터페이스까지

abstract abstract 클래스클래스 abstract abstract 메서드 메서드

DrawObj 객체의 Draw 가상 메서드는 상속받은 클래스에 있는 실제 Draw 메서드를 부르기 위한 것

abstract 키워드를 붙여서 메서드를 선언만 하는 것이며 , 실행 코드는 구현하지 않는다

abstract class DrawObjabstract class DrawObj {{ // abstract // abstract 메서드메서드 public abstract void Draw();public abstract void Draw(); }}

상속받은 클래스에서 abstract 메서드를 구현하지 않으면 , 컴파일러 오류가 발생

error CS0534: 'Point' does not implement inherited abstract member'DrawObj.Draw()'

Page 28: 7 장 상속부터 인터페이스까지

abstract abstract 클래스클래스 abstract abstract 클래스 상속 클래스 상속

virtual 키워드를 사용하는 대신 abstract 클래스와 메서드를 사용한 예

using System;using System;

abstract class DrawObj abstract class DrawObj // abstract // abstract 클래스 클래스

{{ public abstract void Draw(); public abstract void Draw(); // abstract // abstract 메서드메서드}}

class Point : DrawObjclass Point : DrawObj{{public override void Draw() public override void Draw() // Draw // Draw 메서드를 정의하지 않으면 컴파일 오류메서드를 정의하지 않으면 컴파일 오류

{{ Console.WriteLine( "Point.Draw()“ );Console.WriteLine( "Point.Draw()“ ); }}}}

class Testclass Test{{ static void Main() static void Main() {{ DrawObj obj = new Point();DrawObj obj = new Point(); obj.Draw(); obj.Draw(); // Point.Draw // Point.Draw 메서드를 부른다메서드를 부른다 .. }}}}

Page 29: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스란 인터페이스란

인터페이스 (interface) 란 상속받은 클래스에서 반드시 구현해 주어야할 기능을 명시하고 나열할 때 사용

실제 기능은 인터페이스를 상속받은 객체에 구현

인터페이스 (interface) 는 다음과 같이 선언

Page 30: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스 구현 인터페이스 구현

abstract 클래스를 인터페이스로 선언한 예 인터페이스 선언은 class 대신 interface 라고 표현

인터페이스 (interface) 는 다음과 같이 선언

// // 인터페이스 정의 인터페이스 정의 interface interface IDrawObjIDrawObj {{ void Draw();void Draw(); void Move( int sx, int sy );void Move( int sx, int sy ); }}

인터페이스 이름은 “ I” 알파벳으로 시작하도록

하여 , “I" 를 넣어줌으로서 “인터페이스를

상속받는구나“라는 것을 쉽게 구분할 수 있도록

하기 위한 것

Page 31: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스 구현 인터페이스 구현

인터페이스는 단순히 기능을 나열한 것이며 , 실제 기능 구현은 상속받은 클래스에서 작성

인터페이스를 상속받은 경우 , 인터페이스에 명시된 모든 메서드를 구현해주어야 한다

abstract 클래스와 달리 , 인터페이스를 상속받은 경우에는 override 키워드를 쓰지 않는다

class Point : IDrawObjclass Point : IDrawObj {{ public void Draw()public void Draw() {{ // // 그리는 기능 구현 그리는 기능 구현 }} public void Move( int x, int y )public void Move( int x, int y ) {{ // // 이동 기능 구현 이동 기능 구현 }} }}

Page 32: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 예제예제 ①① 인터페이스를 정의하고인터페이스를 정의하고 , , 상속받아 클래스를 정의해보는 상속받아 클래스를 정의해보는

예제 예제

프로젝트 유형 :  콘솔 응용 프로그램 프로젝트 이름 : Interface

Page 33: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 예제예제②② IDrawObj IDrawObj 인터페이스를 추가하고인터페이스를 추가하고 , Draw , Draw 메서드와 메서드와 MM

ove ove 메서드를 정의 메서드를 정의

interface IDrawObjinterface IDrawObj{{ void Draw();void Draw(); void Move( int x, int y );void Move( int x, int y );}}

Page 34: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 예제예제③③ IDrawObj IDrawObj 인터페이스를 상속받아 인터페이스를 상속받아 Point Point 클래스를 클래스를

정의 정의 class Point : IDrawObjclass Point : IDrawObj{{ public int x;public int x; public int y;public int y;

public Point( int x, int y )public Point( int x, int y ) {{ this.x = x;this.x = x; this.y = y;this.y = y; }}

public void Draw() public void Draw() // // 그리는 기능 구현그리는 기능 구현 {{ Console.WriteLine( "Draw() : ( {0}, {1} ) ", x, y );Console.WriteLine( "Draw() : ( {0}, {1} ) ", x, y ); }}

public void Move( int x, int y ) public void Move( int x, int y ) // // 이동 기능 구현이동 기능 구현 {{ this.x += x;this.x += x; this.x += y;this.x += y; }}}}

Page 35: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 예제예제④④ IDrawObj IDrawObj 인터페이스를 통해서 인터페이스를 통해서 Point Point 클래스의 클래스의

메서드를 불러보는 예 메서드를 불러보는 예

class Class1class Class1{{ static void Main(string[] args)static void Main(string[] args) {{ IDrawObj obj = new Point( 100, 200);IDrawObj obj = new Point( 100, 200); obj.Draw(); obj.Draw(); // ( 100, 200 )// ( 100, 200 )

obj.Move( 100, 100 );obj.Move( 100, 100 ); obj.Draw(); obj.Draw(); // ( 200, 300 )// ( 200, 300 ) }}}}

Page 36: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속

인터페이스는 다중 상속을 허용 여러 인터페이스를 동시에 다중 상속 받기 위해 두 개의

인터페이스 interface1, interface2 를 상속받아 클래스를 정의한 예

인터페이스 이름 사이에 콤마 (,) 를 두고 상속받을 인터페이스를 나열

Page 37: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속

다중 상속을 설명하기 위해 인터페이스를 두 개로 나누어 정의한 예

interface IDrawObjinterface IDrawObj{{ void Draw();void Draw();}}

interface IMoveObjinterface IMoveObj{{ void Move();void Move();}}

Page 38: 7 장 상속부터 인터페이스까지

인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속

Rectangle 객 체 의 경 우 IDrawObj 인 터 페 이 스 와 IMoveObj 인터페이스를 다중 상속 받아 정의

화면에 그릴 수만 있고 , 이동할 수 없는 객체라면 다음과 같이 IDrawObj 인터페이스만 상속받아 정의

class Rectangle : IDrawObj, IMoveObjclass Rectangle : IDrawObj, IMoveObj{{ public void Draw() public void Draw() // // 그리기 그리기 {{ }}

public void Move() public void Move() // // 이동이동 {{ }}}}

class SelectArea : IDrawObjclass SelectArea : IDrawObj{{ public void Draw() public void Draw() // // 그리기그리기 {{ }}}}

Page 39: 7 장 상속부터 인터페이스까지

마무리마무리 마무리 마무리

상속성과 다형성은 객체 프로그래밍에서 기본이 되는 특성 다형성과 인터페이스는 클래스 라이브러리에서 제공되는 클래스를

사용할 때 없어서는 안될 기본 특성

인터페이스를 상속받은 클래스에서는 반드시 인터페이스에 나열한 기능을 구현

상속성이란 다른 클래스를 상속받아 정의하는 특성 sealed 클래스는 클래스를 상속받아 쓸 수 없도록 지정할 때 사용 abstract 클래스나 인터페이스는 다른 클래스에서 상속받아야 쓸 수

있으며 단독으로 사용할 수 없다

{{ IDrawObj o1 = new Point(100,100);IDrawObj o1 = new Point(100,100); IDrawObj o2 = new Rectangle(100,100,200,200);IDrawObj o2 = new Rectangle(100,100,200,200);

o1.Draw(); o1.Draw(); // (100,100)// (100,100) o2.Draw(); o2.Draw(); // (100,100) ~ (200,200)// (100,100) ~ (200,200)}}