Download - 7 장 상속부터 인터페이스까지
![Page 1: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/1.jpg)
77 장장 상속부터 인터페이스까지 상속부터 인터페이스까지
상속성상속성다형성과 가상 메서드다형성과 가상 메서드abstract abstract 클래스와 인터페이스클래스와 인터페이스
![Page 2: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/2.jpg)
상속성상속성 상속성이란 상속성이란
상속성 (Inheritance) 이란 , 기존에 정의한 객체가 가지는 특성을 그대로 물려받아 새로운 객체를 정의하는 것
상속이란 두 개의 클래스간의 관계를 정의하는 특성 상속 관계에 있는 클래스를 베이스 클래스와 상속받은
클래스라고 정의 베이스 (base) 클래스 - 이미 정의해놓은 클래스 상속받은 (derived) 클래스 - 기존 클래스를 상속받아서 새로
정의한 클래스 상속 구현 상속 구현
모든 클래스는 베이스 클래스를 가질 수 있으며 , 다른 클래스에게 상속될 수 있다
![Page 3: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/3.jpg)
상속성상속성 상속 구현 상속 구현
Class1 클래스를 상속받아 Class2 클래스를 선언한 예
상속받은 클래스에서는 마치 베이스 클래스의 모든 멤버를 정의해놓은 것처럼 그대로 가져다 쓸 수 있다
![Page 4: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/4.jpg)
상속성상속성 상속 구현 상속 구현
Point 클래스를 상속받아 Point3D 클래스를 정의한 경우 , 상속받은 클래스에서 베이스 클래스 멤버를 자기 멤버인양 쓸 수 있다
![Page 5: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/5.jpg)
상속 클래스상속 클래스 예제예제 ①① Point Point 클래스를 정의하고클래스를 정의하고 , , 이 클래스를 상속받아 이 클래스를 상속받아 Point3Point3
D D 클래스를 정의해보는 예제 클래스를 정의해보는 예제
프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : Inherit
![Page 6: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/6.jpg)
상속 클래스상속 클래스 예제예제②② 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/7.jpg)
상속 클래스상속 클래스 예제예제③③ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/8.jpg)
상속 클래스상속 클래스 예제예제⑤⑤ pt3dpt3d 를 입력하고를 입력하고 , ‘.’, ‘.’ 을 입력하면을 입력하면 , Point3D , Point3D
객체에서 사용할 수 있는 멤버 리스트를 보여준다 객체에서 사용할 수 있는 멤버 리스트를 보여준다
![Page 9: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/9.jpg)
메서드 재정의메서드 재정의 예제예제 ①① 상속받은 클래스에서 베이스 클래스의 멤버를 상속받은 클래스에서 베이스 클래스의 멤버를
재정의하는 방법을 알아보는 예제 재정의하는 방법을 알아보는 예제
프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : InheritNew
![Page 10: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/10.jpg)
메서드 재정의메서드 재정의 예제예제②② 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/11.jpg)
메서드 재정의메서드 재정의 예제예제③③ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/12.jpg)
메서드 재정의메서드 재정의 예제예제④④ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/13.jpg)
base base 키워드키워드 예제예제 ①① 상속받은 클래스에서 베이스 클래스의 멤버를 사용할 상속받은 클래스에서 베이스 클래스의 멤버를 사용할
때때 , base , base 키워드를 사용해보고 생성자를 정의해보는 예제 키워드를 사용해보고 생성자를 정의해보는 예제
프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : InheritBase
![Page 14: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/14.jpg)
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/15.jpg)
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/16.jpg)
상속성상속성 sealed sealed 클래스 클래스
sealed 클래스는 다른 객체가 이 클래스를 상속받지 못하도록 할 때 사용
더 이상 클래스를 상속받아 쓸 수 없도록 닫아버리는 것 sealed 클래스를 상속받아 클래스를 정의하려고 하면 컴파일
오류가 발생
public public sealedsealed class Base class Base {{ ...... }}
// sealed // sealed 클래스는 상속받을 수 없습니다클래스는 상속받을 수 없습니다 .. class Derived : Baseclass Derived : Base {{ ...... }}
![Page 17: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/17.jpg)
상속성상속성 protected protected 멤버 멤버
멤버 접근 제어는 클래스 외부에서 멤버를 사용할 때 적용되는 규칙 private 멤버는 클래스 외부에서 사용하는 것을 허용하지 않는
멤버 public 멤버는 외부 어디서나 자유롭게 사용하도록 허용한 멤버 protected 멤버는 자신을 상속받은 클래스에게 사용할 수 있도록
권한을 부여
public BaseObjpublic BaseObj{{ protected protected void Move() void Move() // protected // protected 멤버멤버 {{ }}}}
![Page 18: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/18.jpg)
상속성상속성 protected protected 멤버 멤버
상속받은 클래스는 베이스 클래스의 protected 멤버와 public 멤버를 사용할 수 있다 .
protected 멤버는 상속받은 클래스에게 접근 권한을 준 것이기 때문에 , 클래스 외부에서는 사용할 수 없는 멤버
![Page 19: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/19.jpg)
가상 메서드가상 메서드 다형성 다형성
다형성은 상속 관계를 갖는 클래스에 적용할 수 있는 객체 프로그래밍의 한 특성으로 , 하나의 객체가 여러 가지 특성을 가지는 것을 의미
클래스마다 각각 고유한 기능을 구현하고 , 가상 메서드를 통해서 다양한 기능을 호출
가상 메서드를 통해서 Point 클래스에 정의된 Draw 메서드를 호출
DrawObj obj = new Point();DrawObj obj = new Point(); obj.Draw();obj.Draw();
![Page 20: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/20.jpg)
가상 메서드가상 메서드 가상 메서드 가상 메서드
메서드를 가상 메서드로 만드는 방법은 함수 앞에 virtual 이라고 명시
상속받은 클래스에서 가상 메서드를 다시 정의할 때는 override 키워드를 사용
![Page 21: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/21.jpg)
가상 메서드가상 메서드 예제예제 ①① 베이스 클래스에 가상 메서드를 정의하고베이스 클래스에 가상 메서드를 정의하고 , , 상속받은 상속받은
클래스의 메서드를 불러보는 예제 클래스의 메서드를 불러보는 예제
프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : Virtual
![Page 22: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/22.jpg)
가상 메서드가상 메서드 예제예제②② 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/23.jpg)
가상 메서드가상 메서드 예제예제③③ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/24.jpg)
가상 메서드가상 메서드 예제예제⑤⑤ DrawObj DrawObj 클래스에서 클래스에서 virtual virtual 키워드 없애고 다시 키워드 없애고 다시
예제를 실행 예제를 실행
![Page 25: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/25.jpg)
abstract abstract 클래스클래스 abstract abstract 클래스 클래스
abstract 클래스는 아무런 기능이 없는 객체를 생성해서 쓰는 것을 방지
abstract 클래스는 객체 그 자체로는 인스턴스 객체를 생성할 수 없으며 , 다른 객체가 상속받은 경우에만 가능
![Page 26: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/26.jpg)
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/27.jpg)
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/28.jpg)
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/29.jpg)
인터페이스인터페이스 인터페이스란 인터페이스란
인터페이스 (interface) 란 상속받은 클래스에서 반드시 구현해 주어야할 기능을 명시하고 나열할 때 사용
실제 기능은 인터페이스를 상속받은 객체에 구현
인터페이스 (interface) 는 다음과 같이 선언
![Page 30: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/30.jpg)
인터페이스인터페이스 인터페이스 구현 인터페이스 구현
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/31.jpg)
인터페이스인터페이스 인터페이스 구현 인터페이스 구현
인터페이스는 단순히 기능을 나열한 것이며 , 실제 기능 구현은 상속받은 클래스에서 작성
인터페이스를 상속받은 경우 , 인터페이스에 명시된 모든 메서드를 구현해주어야 한다
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/32.jpg)
인터페이스인터페이스 예제예제 ①① 인터페이스를 정의하고인터페이스를 정의하고 , , 상속받아 클래스를 정의해보는 상속받아 클래스를 정의해보는
예제 예제
프로젝트 유형 : 콘솔 응용 프로그램 프로젝트 이름 : Interface
![Page 33: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/33.jpg)
인터페이스인터페이스 예제예제②② 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/34.jpg)
인터페이스인터페이스 예제예제③③ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/35.jpg)
인터페이스인터페이스 예제예제④④ 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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/36.jpg)
인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속
인터페이스는 다중 상속을 허용 여러 인터페이스를 동시에 다중 상속 받기 위해 두 개의
인터페이스 interface1, interface2 를 상속받아 클래스를 정의한 예
인터페이스 이름 사이에 콤마 (,) 를 두고 상속받을 인터페이스를 나열
![Page 37: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/37.jpg)
인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속
다중 상속을 설명하기 위해 인터페이스를 두 개로 나누어 정의한 예
interface IDrawObjinterface IDrawObj{{ void Draw();void Draw();}}
interface IMoveObjinterface IMoveObj{{ void Move();void Move();}}
![Page 38: 7 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/38.jpg)
인터페이스인터페이스 인터페이스 다중 상속 인터페이스 다중 상속
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 장 상속부터 인터페이스까지](https://reader035.vdocuments.pub/reader035/viewer/2022062517/568139b9550346895da15908/html5/thumbnails/39.jpg)
마무리마무리 마무리 마무리
상속성과 다형성은 객체 프로그래밍에서 기본이 되는 특성 다형성과 인터페이스는 클래스 라이브러리에서 제공되는 클래스를
사용할 때 없어서는 안될 기본 특성
인터페이스를 상속받은 클래스에서는 반드시 인터페이스에 나열한 기능을 구현
상속성이란 다른 클래스를 상속받아 정의하는 특성 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)}}