Presentation is loading. Please wait.

Presentation is loading. Please wait.

C# 09장. 상속성.

Similar presentations


Presentation on theme: "C# 09장. 상속성."— Presentation transcript:

1 C# 09장. 상속성

2 학습 목표 상속 개념을 이해하고 파생클래스를 작성할 수 있다 메소드 재정의를 이해하고 재정의된 메소드를 구현할 수 있다
추상 클래스의 기능을 이해하고 추상 클래스를 구현할 수 있다 인터페이스의 기능을 이해하고 직접 구현할 수 있다.

3 목차 01 파생 클래스 02 상속 관계에서 메소드 구현 03 추상 클래스 04 인터페이스

4 1. 파생 클래스 객체 지향 개념 중 상속의 장점 - 기반 클래스의 필드와 메소드를 물려받아 사용
- 새로운 클래스의 특징적인 것만 추가 ( 파생 클래스)  기반 클래스의 선정 또는 구성이 매우 중요함. 상속 개념의 쉬운 접근 방법 복사 개념으로 INCLUDE 개념으로 받아 들인 후 3. 상속의 특징에 대해서 접근한다.

5 class 파생클래스명 : 기반 클래스명 1. 파생 클래스 파생 클래스의 정의 { … } 문법
기반클래스의 생성자와 소멸자를 제외한 모든 것을 파생 클래스에서 상속받는다. 기반 클래스가 private 접근지정이 되어 있는 경우 파생 클래스를 만들 수 없다. class 파생클래스명 : 기반 클래스명 { } * C#에서는 단일 상속만 지원

6 protected , public 멤버의 상속
1. 파생 클래스 기반 클래스 멤버 접근 기반클래스의 protected와 public으로 지정된 멤버만을 상속받는다. 상속받은 멤버는 기반 클래스에서의 접근 지정자를 유지한다. <예제> using System; class Base { private string pvtValue =“Private” ; protected string prtValue =“Protected” ; } class Derived : Base protected sting prtValue = “Protected”; *주의: 파생 클래스로 상속되는 prtValue는 실제로 코드로 표현하지 않는다. 위는 단지 도식화를 위해 표현한것이다. protected , public 멤버의 상속 파생클래스로는 protected나 public멤버만이 상속된다. 그리고 파생 클래스에서 상속받은 멤버의 접근 지정자는 기반클래스에서와 같이 protected혹은 public으로 유지된다.

7 1. 파생 클래스 파생 클래스 3가지의 접근 지정자 생성 private (상속 안됨) protected(상속 가능)
using System; class Base { private string var1 = "private 변수"; protected string var2 = "proteced 변수"; public void BaseMethod() Console.WriteLine("Base 메소드"); } class Derived : Base { public void DerivedMethod() Console.WriteLine("Derived 메소드"); } static void Main(string[] args) Derived derivedObj = new Derived(); //Console.WriteLine("{0}",derivedObj.var1); //오류 발생(private로 지정한 것은 상속 안됨 Console.WriteLine("{0}", derivedObj.var2); derivedObj.BaseMethod(); derivedObj.DerivedMethod(); 3가지의 접근 지정자 생성 private (상속 안됨) protected(상속 가능) public (상속 가능)

8 1. 파생 클래스 파생 클래스 기반 클래스 1차 파생클래스 2차 파생 클래스 비고 pirvate 상속 안됨 -
protected 암시적인protected로 상속 받음 암시적인 protected로 상속 받음 public 암시적인public으로 상속 받음 암시적인 public으로 상속 받음

9 1. 파생 클래스 protected에 접근하기 using System; class Base {
6 행에서 파생클래스 선언 하고 10,11해 과 같이 반드시 기반객체와 파생 객체를 생성 후 13행에서와 같이 파생 객체에게 접근을 해야 한다. using System; class Base { protected bool var = true; } class Derived : Base // 1. 파생 클래스 선언 static void Main(string[] args) Base baseObj = new Base(); // 2.기반 클래스의 객체 생성 Derived derivedObj = new Derived(); // 3. 파생 클래스의 객체 생성 //Console.WriteLine("직접 접근한 객체:{0}",baseObj.var); // 오류 Console.WriteLine("상속받은 객체:{0}", derivedObj.var);

10 1. 파생 클래스 기반 클래스의 생성자 호출 파생클래스의 생성자 : base() { … } 문법
파생클래스에는 기반 클래스의 생성자가 상속되지 않는다. 따라서 위의 문법사항과 같이 직접 호출해 주어야 한다. 만약 위의 문법과 같이 명시적으로 호출하지 않으면 암시적으로 기반 클래스의 기본 생성자를 호출한다. 파생클래스의 생성자 : base() { }

11 1. 파생 클래스 기반 클래스의 (명시적)생성자 호출 using System; class Parent {
protected string name; protected Parent(string name) // 1. 기반 클래스의 생성자 this.name = name; Console.WriteLine("Parent: " + this.name); } class Child : Parent // 2. 파생 클래스 선언 public Child(string name) : base (name) // 3. 생성자(파생 클래스) 선언 // (기반 클래스의 생성자 호출) Console.WriteLine("Child: " + name); class ConsoleApplication { static void Main(string[] args) Child childObj = new Child("김씨"); // 4. 파생 클래스의 객체 생성 // (파생 클래스의 생성자도 호출) }

12 1. 파생 클래스 기반 클래스 생성자의 암시적 호출 11행 파생 클래서에서 기반 클래스의 생성자를 호출하는 코드는 없다
using System; class Parent // 1. 기반 클래스 선언 { protected string name; protected Parent() // 2. 기반 클래스 생성자 정의 this.name = "Unknown"; Console.WriteLine("Parent: " + this.name); } class Child : Parent // 3. 파생 클래스 선언 public Child(string name) Console.WriteLine("Child: " + name); class ConsoleApplication static void Main(string[] args) Child c = new Child("박씨"); 11행 파생 클래서에서 기반 클래스의 생성자를 호출하는 코드는 없다  암시적으로 기반 클래스의 생성자를 호출한다.

13 1. 파생 클래스 base 키워드 파생 클래스에서 상속받은 멤버명과 자신의 클래스에서 정의한 멤버명이 같을 경우
구분하기 위해서 사용 * base : 기반 클래스 지칭, this : 자신의 클래스 지칭

14 1. 파생 클래스 base 키워드 using System; class Parent {
protected string name = "부모"; } class Child : Parent private string name = "자식"; public Child() Console.WriteLine("base.name = {0}", base.name); Console.WriteLine("this.name = {0}", this.name); class ConsoleApp static void Main(string[] args) Child c = new Child();

15 2. 상속 관계에서 메소드 구현 상속 받은 후 - 기반 클래스를 그대로 사용 - 기반 클래스를 새롭게 정의해서 사용
 메소드 오버라이드(메소드 재정의)

16 * 오버로드(메소드 중복정의)와 오버라이드(메소드 재정의)
2. 상속 관계에서 메소드 구현 * 오버로드(메소드 중복정의)와 오버라이드(메소드 재정의) 같은 이름의 메소드를 여러 가지 형태로 중복해서 정의하여 각각의 용법에 맞게 사용(오버로드) public void Display () { Console.WriteLine("Hello"); } public void Display (string name) Console.WriteLine("Hello,{0}", name); 위와 같이 정의하면, Display .메소드를 사용할 때 인자가 있는 것과 없는 것을 목적에 따라 사용할 수 있게 된다. 대표적인 예 : Console.WriteLine

17 2. 상속 관계에서 메소드 구현 객체 지향의 중요한 개념 중 다형성 : 여러 가지 형태를 포함할 수 있음
메소드 오버라이드를 통해서 구현됨 기반 클래스의 메소드를 파생 클래스에서 변형해서 사용 할 수 있게 하려면 기반 클래스에서 메소드를 정의할 때 재 정의할 수 있는 방법을 제공해줘야 함 여기서 필요한 것이 가상 메소드 가상 메소드 : 일반 메소드 정의에서 virtual 키워드를 사용

18 가상 메소드 메소드 재정의 2. 상속 관계에서 메소드 구현 가상 메소드 재정의 메소드
virtual 키워드로 기반 클래스에 정의 override 키워드로 파생 클래스의 메소드 재정의 <예제> class Parent // 기반 클래스 { public virtual void Name() Console.WriteLine(“아버지”); } class Child : Parent // 파생 클래스 public override void Name() Console.WriteLine(“아들”); 가상 메소드 재정의 메소드

19 가상 메소드 가상 메소드는 static으로 선언하지 못한다 가상 메소드는 private 접근 지정자로 선언하지 못한다.
2. 상속 관계에서 메소드 구현 가상 메소드 가상 메소드는 static으로 선언하지 못한다 가상 메소드는 private 접근 지정자로 선언하지 못한다. 오버라이드 메소드를 작성할 때 주의할 점 기반 클래스의 가상 메소드만을 재정의할 수 있다. 가상 메소드와 문법 구조가 같아야 한다. 오버라이드 메소드는 다른 파생 클래스에서 다시 재정의 될 수 있다. 오버라이드 메소드를 static이나 private로 선언할 수 없다.

20 override 메소드 오버라이드 메소드는 기반 클래스의 가상 메소드를 재정의 하는 것이다.
2. 상속 관계에서 메소드 구현 override 메소드 오버라이드 메소드는 기반 클래스의 가상 메소드를 재정의 하는 것이다. 오버라이드 메소드의 반환형이나 인자 혹은 인자의 형식 등의 문법적 구조는 가상 메소드의 문법 구조와 같아야 한다. class Parent { protected virtual string Name() { } } class Child : Parent protected override string Name(string a) // 오류 발생 Parent 클래스의 가상 메소드 Name과 파생클래스 인 Child 클래스의 인자가 서로 다르기 때문에 오류 발생

21 오버라이드 메소드 구현 2. 상속 관계에서 메소드 구현 * 제1 파생클래스에는가상 메소드가 없다
using System; class Parent // 기반 클래스 { public virtual void Name() Console.WriteLine("Parent"); } class Child : Parent //제1 파생클래스 public override void Name() Console.WriteLine("Child"); class GrandChild : Child //제2 파생클래스 Console.WriteLine("GrandChild"); class ConsoleApplication { public static void Main(string[] args) Parent obj1 = new Parent(); Child obj2 = new Child(); GrandChild obj3 = new GrandChild(); obj1.Name(); obj2.Name(); obj3.Name(); } * 제1 파생클래스에는가상 메소드가 없다 override 키워드로 정의된 메소드는 virtual과 같은 기능을 한다. 제2 파생클래스에서 override 사용가능 함.

22 3. 추상 클래스 추상 클래스는 미완성 클래스이다. 추상 클래스가 되는 경우
1. 몸체 없는 함수를 하나라도 포함하고 있는 클래스 2. 몸체 없는 함수를 포함하고 있지 않더라도 클래스를 선언할 때 abatract 키워드를 포함하고 있는 경우 추상 클래스는 상속을 통해 여러 파생 클래스가 추상 클래스에서 정의한 구조를 포함하게 만드는 설계도 역할을 한다.

23 abstract class 클래스명 추상 클래스 3. 추상 클래스 { } 문법 abstract 키워드를 사용
인스턴스를 생성하지 않는다. 추상 메소드는 추상 클래스 안에서만 선언할 수 있다 abstract class 클래스명 { }

24 추상 클래스 및 재정의 메소드 예제 3. 추상 클래스 추상 메소드 자세한 구현부가 없이 단지 선언만 한다. 재정의 메소드
<예제> abstract class Musician { public abstract void Instrument( ); } class ViolinPlayer : Musician public override void Instrument() Console.WriteLine(“Violin”); 추상 메소드 자세한 구현부가 없이 단지 선언만 한다. 재정의 메소드 메소드 재정의를 통해 실제적인 구현을 한다.

25 abstract class Musician //추상 클래스
3. 추상 클래스 추상 클래스 및 추상 메소드 예제 using System; abstract class Musician //추상 클래스 { public virtual void Name() Console.WriteLine("Musician"); } public abstract void Instrument(); // 추상 메소드 class ViolinPlayer : Musician public override void Name() Console.WriteLine("ViolinPlayer"); public override void Instrument() Console.WriteLine("Violin"); class ConsoleApplication { static void Main(string[] args) //Musician m = new Musician(); ViolinPlayer m2 = new ViolinPlayer(); m2.Name(); m2.Instrument(); } (2행)추상 클래스는 기반 클래스로 쓰인다. (8행)추상 메소드는 추상 클래스 안에서만 선언이 가능하다. (추상메소드도 몸체만 선언을 한다.) (13행)오버라이드를 이용해서 실제적으로 구현 (26행)추상클래스는 객체로 생성 안 됨 (27행) 상속과 오버라이드 후 객체 생성 가능

26 purblic virtual void Speak() Console.WriteLine("말하다"); }
3. 추상 클래스 상속 관계에서 추상 메소드의 특징 추상 메소드는 기반 클래스의 virtual로 선언된 가상 메소드를 override 키워드를 사용해서 재정의하고 선언할 수 있다. class Parent { purblic virtual void Speak() Console.WriteLine("말하다"); } abstract class Child : Parent public abstract override void Speak(); 재정의 기반 클래스(Parent 클래스)의 가상 메소드(Speak 메소드)가 파생 클래스(Child 클래스)에서 추상 메소드로 재정의해서 선언되었다. 추상메소드는 몸체인 구현 부가 없기 때문에 위의 코드처럼 선언만 한다.

27 3. 추상 클래스 상속 관계에서 추상 메소드의 특징 추상 메소드는 기반 클래스의 override로 선언된 오버라이드 메소드를 override 키워드를 사용해서 재정의하고 선언할 수 있다. class Parent { purblic virtual void Speak() Console.WriteLine("말씀하다"); } class Child : Parent public abstract override void Speak(); Console.WriteLine("말하다"); abstract class GrandChild : Child public abstract override void Speak(); 이 코드는 기반 클래스(Child클래스) 의 오버라이드 메소드를 추상 클래스인 파생 클래스(GrandChild 클래스)에서 재정의되는 것을 보여준다. abstract 가 기술 안됨

28 파생 클래스가 지켜야 할 내용을 문법적으로 규약한 계약서 역할
4. 인터페이스 인터페이스 파생 클래스가 지켜야 할 내용을 문법적으로 규약한 계약서 역할 인터페이스의 구성요소 함수, 속성,이벤트,인덱스 인터페이스에서의 구성요소는 프로토타입만을 선언할 수 있다. 프로토 타입이란 선언부만 존재한다는 의미이다. 즉, 인터페이스 내에서의 함수, 속성, 인덱스는 몸체 부분이 없으며, 단지 사용될 이벤트만을 선언해 두는 것이다. 인터페이스로부터 상속을 받는 클래스들은 인터페이스에 포함된 모든 메서드를 구현해야 한다.

29 인터페이스 interface IParent { string Speaking(); } 4. 인터페이스
문법 ‘I’자로 시작해서 작성한다(권장) 인터페이스안의 메소드는 구현부를 포함하지 않고 선언만 한다. 접근 권한은 암시적으로 public이다. C#에서 다중상속은 인터페이스를 통해 가능하다 interface IParent { string Speaking(); } 메소드의 구현부가 없으면 암시적으로 public이다.

30 인터페이스 예제(중요 부분만) 4. 인터페이스 인터페이스 선언 인터페이스를 상속받은 클래스 구현 <예> …
interface IMusician { void Instrument(); } class PianoPlayer: IMusician public void Instrument() Console.WriteLine(“피아노를 치다”); 인터페이스 선언 인터페이스를 상속받은 클래스 구현

31 인터페이스 예제 1 4. 인터페이스 using System; interface IMusician //1. 인터페이스 선언 {
void Instrument(); //2. 메소드의 선언만 가능 } class PianoPlayer : IMusician public void Instrument() //3. 메소드의 구현 Console.WriteLine("피아노를 치다."); class ConsoleApplication static void Main(string[] args) //IMusician m1 = new IMusician(); //컴파일 에러 PianoPlayer m2 = new PianoPlayer(); m2.Instrument(); 인터페이스에는 메소드의 선언만 (4행) 가능하고 실제로 구현은 인터페이스를 상속받은 클래스에서 구현한다. 인터페이스를 인스턴스화해서 객체를 생성하고자 한다면 컾파일 에러 발생 추상 클래스는 인스턴스화 되지 못하는 것과 유사함

32 상속받을 기반 클래스인 인터페이스를 콤마(,)로 나열하여 다중상속을 구현한다.
4. 인터페이스 다중 상속 클래스가 단일 상속만을 인정하는 데 비해 인터페이스는 다중 상속을 인정한다. <예> interface IMusician { void Singing(); } interface IActor void Playing(); class Musical: IMusician, IActor public void Singing() Console.WriteLine(“노래하다”); public void Playing() Console.WriteLine(“연기하다”); 다중상속 예제 다중상속 상속받을 기반 클래스인 인터페이스를 콤마(,)로 나열하여 다중상속을 구현한다.

33 다중 상속 4. 인터페이스 (10행) 클래스 Musical은 인터페이스(IMusician, IActor) 2개를 상속해서 사용
using System; interface IMusician { void Singing(); } interface IActor void Playing(); class Musical : IMusician, IActor public void Singing() Console.WriteLine("노래하다."); public void Playing() Console.WriteLine("연기하다."); class ConsoleApplication static void Main(string[] args) Musical m = new Musical(); m.Singing(); m.Playing(); (10행) 클래스 Musical은 인터페이스(IMusician, IActor) 2개를 상속해서 사용  2개의 인터페이스에서 선언된 메소드를 모두 구현한다.

34 추상 클래스와 인터페이스의 유사점과 차이점 추상 클래스와 인터페이스는 모두 인스턴스화해서 객체가 생성되지 않는다.
4. 인터페이스 추상 클래스와 인터페이스의 유사점과 차이점 추상 클래스와 인터페이스는 모두 인스턴스화해서 객체가 생성되지 않는다. 추상 클래스에는 몸체인 구현부가 있을 수 있지만 인터페이스는 구현부를 포함하지 않는다. 인터페이스는 다른 인터페이스를 상속받을 수 있으며 추상 클래스도 다른 일반 클래스를 상속 받을 수 있다.

35 요약 C#에서 상속의 개념은 파생 클래스를 통해 구현된다.
파생 클래스는 자신의 부모인 기반 클래스의 멤버들을 상속받아 사용 한다. 기반 클래스의 멤버 접근은 접근 지정자가 protected, 혹은 public으 로 된 멤버만을 상속받게 된다. 기반 클래스의 생성자는 상속이 가능하지 않기 때문에 파생 클래스의 생성자를 정의할 때 기반 클래스의 생성자를 호출하는 코드를 추가 해서 기반 클래스의 생성자를 호출하게 된다.

36 요약 기반 클래스의 메소드를 파생 클래스에서 상속받은 그대로 사용하지 않고 새롭게 재정의하는 것을 메소드 오버라이드(override)라고 한다 . 상속받은 메소드의 재정의가 가능하려면 기반 클래스에서 키워드 virtual을 사용해서 재정의가 가능한 가상 메소드임을 선언해야 한다. 이렇게 메소드 재정의를 통해 객체 지향의 다형성을 실현할 수 있다.

37 요약 추상 클래스는 상속 관계에서 틀이 되는 기반 클래스의 역할을 정의 하기에 좋다.
추상 메소드는 추상 클래스에서만 정의가 가능하며 구체적인 몸체인 구현부를 포함하지 않고 선언만 한다. 추상 클래스는 인스턴스를 생성하지 않기 때문에 인터페이스와 비슷 하지만 구체적인 구현부를 포함할 수 있다는 점은 인터페이스와의 차 이점이다

38 요약 인터페이스는 상속받는 클래스들에게 구현해야 할 틀을 제공하는 점 에서 추상 클래스와 비슷한 역할을 한다.
추상 클래스와 다른 점은 구현부가 없고 선언만 할 수 있다는 점과 상 속받는 클래스에서 다중으로 상속받을 수 있다는 점이다.


Download ppt "C# 09장. 상속성."

Similar presentations


Ads by Google