C# 09장. 상속성.

Slides:



Advertisements
Similar presentations
Transaction ㅇ Transaction 을 직접 구현하려면, 까다로운 설계와 복잡한 코드를 필요로 하고 수정에 공수가 많이 들게 된다. ㅇ 스프링에서 제공하는 Transaction Manager 를 사용하여 쉽고 간편하게 어려운 트랜잭션을 해결할 수 있다. xml.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
명품 C++ 8장 상속.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
2장 닷넷 프레임워크.
Chap05 상속 5.1 상속의 개요 5.2 멤버 변수의 상속 5.3 메소드의 상속과 오버라이딩(Overriding)
7장 배열 ②.
Programming for the java Virtual machine
알기 쉽게 해설한 Java 8th edition
C# 05장. 메소드와 인자.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
8. 객체와 클래스 (기본).
명품 JAVA Programming.
C++ Espresso 제9장 다형성.
[INA470] Java Programming Youn-Hee Han
10장 객체-지향 프로그래밍 II ©창병모.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Power Java 제10장 배열.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
명품 C++ 8장 상속.
자바 5.0 프로그래밍.
프로그래밍 언어론 제 9 장 객체 지향 개념 객체 지향 방법론 객체 모델링 객체 지향 언어 C++ 객체 지향 언어 CLOS
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
명품 JAVA Essential.
명품 Java Programming.
상속이란? - 기반클래스로부터 다른 클래스를 파생하는 법 protected란? 가상함수 (virtual function)
소프트웨어설계 UML 학기.
2010학년도 2학기 객체지향의 이해.
C ++ 프로그래밍 시작.
주소록 프로그램.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
Visual Studio 2010 프로젝트 생성하기 PC화면에서 Visual Studio 2010 아이콘을 더블클릭 하거나
날짜: 팀명: TEAM-SIX 발표자: 이기영
2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Java 8장. 상속 public class SumTest {
어서와 Java는 처음이지! 제9장 인터페이스, 패키지.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
가상함수와 추상 클래스.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Web programming Chap 04 상속 김 정 석
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
프로그래밍 개론 Ⅰ 제 1장 . 서론 ①.
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
JA A V W. 04.
내부 클래스와 내부 인터페이스에 대하여 내부 클래스의 선언 방법과 이용 방법 내부 인터페이스의 선언 방법과 이용 방법
CACM 구현 public class CACM { public CACM(File file)
JA V A W. 07 Sb.L.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
[ 단원 06 ] 상속과 다형성.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
C# 10장. 참조형.
2013년도 상반기 고객만족도 조사 결과 보고서
2013년도 하반기 고객만족도 조사 결과 보고서
6장 클래스(상속).
컴퓨터 프로그래밍: 실습 1 제 1장 . 서론.
김희정 Bridge Pattern.
Java 5장. 객체지향 개념 public class SumTest {
C# 09장. 클래스와 객체.
C++ 언어의 특징
발 표 자 : 7조 손 창 국 윤 오 성, 박 진 완 객체 지향 프로그래밍 C++
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
임베디드 프로그래밍 Lecture #
Presentation transcript:

C# 09장. 상속성

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

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

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

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

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으로 유지된다.

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 (상속 가능)

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

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);

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

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. 파생 클래스의 객체 생성 // (파생 클래스의 생성자도 호출) }

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행 파생 클래서에서 기반 클래스의 생성자를 호출하는 코드는 없다  암시적으로 기반 클래스의 생성자를 호출한다.

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

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();

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

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

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

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

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

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

오버라이드 메소드 구현 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 사용가능 함.

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

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

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

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행) 상속과 오버라이드 후 객체 생성 가능

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 클래스)에서 추상 메소드로 재정의해서 선언되었다. 추상메소드는 몸체인 구현 부가 없기 때문에 위의 코드처럼 선언만 한다.

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 가 기술 안됨

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

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

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

인터페이스 예제 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행) 가능하고 실제로 구현은 인터페이스를 상속받은 클래스에서 구현한다. 인터페이스를 인스턴스화해서 객체를 생성하고자 한다면 컾파일 에러 발생 추상 클래스는 인스턴스화 되지 못하는 것과 유사함

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

다중 상속 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개의 인터페이스에서 선언된 메소드를 모두 구현한다.

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

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

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

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

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