SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
12. 상속 : 고급
차례 
• 상속에서 멤버 함수 재정의 
• 추상 클래스 
• 동적 형 변환 
• 다중 상속 
2/21
함수 오라이딩/동적결합/다형성/가상함 
수 1 
• 함수 오버라이딩 (Function Overriding) 
– 기반 클래스의 멤버 함수를 파생 클래스에서 
다시 정의하는 것 
• 동적 결합 (Dynamic Binding) 
– 실행 시 호출될 함수를 결정하는 것으로 이는 
하나의 함수가 여러 클래스에서 오버라이딩되 
었을때 사용 
3/21
함수 오라이딩/동적결합/다형성/가상함수 2 
• 다형성(Polymorphism) 
– 하나의 함수가 여러 구현 형태로 정의되는 것 
을 다형성이라 함 
• 다형성에 의해 함수 재정의시 요구조건 
– 기반 클래스의 멤버 함수가 가상함수로 선언 
되어야 함 
– 함수에서 매개변수로 전달된 변수는 객체의 
주소를 포함해야 함 
4/21
함수 오라이딩/동적결합/다형성/가상함수 3 
• 가상함수 
– 함수 오버라이딩을 목적으로 기반 클래스의 
함수 
– 함수 선언시 virtual 키워드를 표시함 
5/21 
virtual 함수리턴형 함수이름( ) ;
소스 12-2 (ch12_02.cpp) – 동적결합이 안된 경우 
#include <iostream> 
using namespace std; 
class A 
{ 
public: 
string ClassMessage() 
{ 
return "class A"; 
} 
}; 
class B : public A 
{ 
public: 
string ClassMessage() 
{ 
return "class B"; 
} 
}; 
void TestFunction1(A x) 
{ 
cout << x.ClassMessage().data() << endl; 
} 
int main() 
{ 
A a; 
B b; 
TestFunction1(a); 
TestFunction1(b); 
return 0; 
} 
예상 실행 결과 : 
class A 
class B 
실제 실행 결과 : 
class A 
class A 
6/21
소스 12-3 (ch12_03.cpp) – 동적결합 
#include <iostream> 
using namespace std; 
class A 
{ 
public: 
string ClassMessage() 
{ 
return "class A"; 
} 
}; 
class B : public A 
{ 
public: 
string ClassMessage() 
{ 
return "class B"; 
} 
}; 
기존 내용 (ch12_02.cpp) 
#include <iostream> 
using namespace std; 
class A 
{ 
public: 
virtual string ClassMessage() 
{ 
return "class A"; 
} 
}; 
class B : public A 
{ 
public: 
string ClassMessage() 
{ 
return "class B"; 
} 
}; 
수정 내용 (ch12_03.cpp) 
7/21
소스 12-2 (ch12_03.cpp) – 동적결합 
void TestFunction1(A x) 
{ 
cout << x.ClassMessage().data() << endl; 
} 
int main() 
{ 
A a; 
B b; 
TestFunction1(a); 
TestFunction1(b); 
return 0; 
} 
기존 내용 (ch12_02.cpp) 수정 내용 (ch12_03.cpp) 
void TestFunction1(A *x) 
{ 
cout << x->ClassMessage().data() << endl; 
} 
int main() 
{ 
A a; 
B b; 
TestFunction1(&a); 
TestFunction1(&b); 
return 0; 
} 
실행 결과 : 
class A 
class B 
실행 결과 : 
class A 
class A 
8/21
추상 클래스 
• 순수 가상 함수 (Pure Virtual Function) 
– 함수 내용을 정의하지 않고 파생 클래스에서 함수 
오버라이딩에 의해 내용이 결정되는 형태의 함수 
• 추상 클래스 (Abstract Class) 
– 객체 생성이 목적이 아닌 클래스 
– 상속에서 기반 클래스 역할을 담당 
– 순수 가상 함수를 포함 
9/21 
virtual 반환형 함수이름( ) =0;
소스 12-5 ( ch12_04.cpp) 
#include <iostream> 
#include <string> 
using namespace std; 
class AbstractClass 
{ 
public: 
virtual string SampleFunction()=0; 
}; 
class TestClass : public AbstractClass 
{ 
public: 
string SampleFunction() 
{ 
return "SampleFunction"; 
} 
}; 
int main() 
{ 
AbstractClass obj1; 
cout << obj1.SampleFunction() << endl; 
return 0; 
} 
추상 클래스 AbstractClass는 객체 
를 생성하지 못함!!!  Error!!! 
10/21
소스 12-5 ( ch12_04.cpp) 
#include <iostream> 
#include <string> 
using namespace std; 
class AbstractClass 
{ 
public: 
virtual string SampleFunction()=0; 
}; 
class TestClass : public AbstractClass 
{ 
public: 
string SampleFunction() 
{ 
return "SampleFunction"; 
} 
}; 
int main() 
{ 
TestClass obj1; 
cout << obj1.SampleFunction() << endl; 
return 0; 
} 
파생 클래스 TestClass로 객체 생성!!! 
11/21
실습 1-1 
다음의 클래스를 정의하자. 
클래스 이름: GeometricObject 
멤버 변수: 두 개의 선(line1, line2)으로 구성된 배정도형 자료를 다루며, 클래스 
상속 시 파생 클래스에서 참조케 함 
12/21 
멤버 함수 
생성자: 매개변수 없이 멤버 변수를 0으로 초기화 
생성자: 두 개의 멤버 변숫값을 매개변수로 전달하여 초기화 
각각의 멤버 변숫값을 매개변수로 전달하여 초기화 
각각의 멤버 변숫값을 객체 외부로 전달 
멤버 변수를 이용하여 도형의 면적을 계산하는 순수 가상 함수 
(AreaCalculation) 
멤버 변수를 이용하여 도형의 둘레를 계산하는 순수 가상 함수 
(RoundCalculation)
실습 1-2 
13/21 
클래스 이름: Isosceles 
GeometricObject를 기반 클래스로 하는 파생 클래스 
멤버 변수: 이등변 삼각형의 밑면, 높이, 면적(area)과 등변(side)으로 구성되며 밑 
변과 높이는 기반 클래스의 멤버 변수 line1과 line2로 사용함 
멤버 함수 
생성자: 매개변수 없이 멤버 변수를 0으로 초기화 
생성자: 밑변과 높이의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 
변수는 0으로 초기화 
기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 
기반 클래스의 Compute( )을 등변 계산 함수로 함수 오버라이딩 
멤버 변수인 면적과 등변을 각각 객체 외부로 전달
실습 1-3 
14/21 
클래스 이름: Rectangle 
GeometricObject를 기반 클래스로 하는 파생 클래스 
멤버 변수: 사각형의 가로와 세로, 면적(area)과 둘레(round)로 구성됨, 가로와 세 
로는 기반 클래스의 멤버 변수 line1과 line2로 사용함 
멤버 함수 
생성자: 매개변수 없이 멤버 변수를 0으로 초기화 
생성자: 가로와 세로의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 
변수는 0으로 초기화 
기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 
기반 클래스의 Compute( )을 사각형 둘레 계산 함수로 함수 오버라이딩 
멤버 변수인 넓이와 둘레를 각각 객체 외부로 전달
동적 형 변환 
• 동적 형 변환 
– 클래스 상속에서 파생 클래스의 객체를 기반 
클래스 형으로 변환(업캐스팅;Upcasting) 것 
또는 기반 클래스의 객체를 파생 클래스 형으 
로 변환(다운캐스팅;Downcasting)하는 것 
– 객체의 포인터를 변환을 원하는 클래스의 포 
인터로 할당 
15/21 
객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2)
업 캐스팅 예제 – 소스 12-11(ch12_05.cpp) 
16/21 
업캐스팅은 자동으로 형변환이 실행됨 (기반  파생) 
#include "ch12_GeometricObject.h" 
int main() 
{ 
GeometricObject *p1 = new Isosceles(9,15); 
Isosceles *p2 = new Isosceles(5,6); 
cout << "p1 : " << p1->GetLine1() << endl; 
cout << "p2 : " << p2->GetLine1() << endl; 
return 0; 
}
다운 캐스팅 예제 – 소스 12-12(ch12_06.cpp) 
17/21 
다운캐스팅은 dynamic_cast 연산자가 명시되어야 함 (파생  기반) 
#include "ch12_GeometricObject.h" 
void DisplayGeometricObject(GeometricObject &object) 
{ 
cout << "line1 : " << object.GetLine1() << endl; 
cout << "line2 : " << object.GetLine2() << endl; 
GeometricObject *p=&object; 
Isosceles *p1 = dynamic_cast<Isosceles*>(p); //다운 캐스팅 
Rectangle *p2 = dynamic_cast<Rectangle*>(p); //다운 캐스팅 
if (p1 != NULL) 
{ 
p1->AreaCalculation(); 
p1->Compute(); 
cout << "이등변 삼각형의 넓이 : " << p1->GetArea() << endl; 
cout << "이등변 삼각형의 등변 : " << p1->GetSide() << endl; 
} 
매개변수로 전달받은 
GeometricObject 객체 포인터 
주소를 저장
if (p2 != NULL) 
{ 
p2->AreaCalculation(); 
p2->Compute(); 
cout << "사각형의 넓이 : " << p2->GetArea() << endl; 
cout << "사각형의 둘레 : " << p2->GetRound() << endl; 
} 
} 
int main() 
{ 
Isosceles p1(9, 15); 
Rectangle p2(10, 12); 
DisplayGeometricObject(p1); 
cout << "****************************" << endl; 
DisplayGeometricObject(p2); 
return 0; 
} 
18/21
소스 12-12 설명 
• 36번 라인 DisplayGeometricObject(Isosceles p1); 이 호출되면 함수에서 p1은 
정상적인 주소의 객체, p2는 NULL이 할당되며 여러 번 동적 형 변환이 발생함!! 
• 37번 라인 DisplayGeometricObject(Rectangle p2); 이 호출되면 함수에서 p1은 
NULL이 할당되고 , p2는 정상적인 주소의 객체가 할당되고 여러 번 동적 변환이 
발생함 
19/21
다중 상속 
• 클래스 상속의 형태 
20/21 
기반 클래스 
파생 클래스 
기반 클래스 
파생 클래스1 파생 클래스2 
기반 클래스 
파생 클래스 
파생 클래스 
기반 클래스1 
기반 클래스2 
파생 클래스
소스 12-13~소스 12-17 
(ch12_multi.h, ch12_multi.cpp, ch12_07.cpp) 
21/21 
class ScoreSource 
{ 
……………………….. 
}; 
class RankGrade 
{ 
……………………….. 
}; 
class SungJuk : public ScoreSource, public RankGrade 
{ 
……………………….. 
};

Más contenido relacionado

La actualidad más candente

Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda기현 황
 
GDG 2014 - RxJava를 활용한 Functional Reactive Programming
GDG 2014 - RxJava를 활용한 Functional Reactive Programming GDG 2014 - RxJava를 활용한 Functional Reactive Programming
GDG 2014 - RxJava를 활용한 Functional Reactive Programming waynejo
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 양 한빛
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Ji Ung Lee
 
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기cranbe95
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기Jong Wook Kim
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료beom kyun choi
 
10. pointer & function
10. pointer & function10. pointer & function
10. pointer & function웅식 전
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개Sungchul Park
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 

La actualidad más candente (20)

Java8 람다
Java8 람다Java8 람다
Java8 람다
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
GDG 2014 - RxJava를 활용한 Functional Reactive Programming
GDG 2014 - RxJava를 활용한 Functional Reactive Programming GDG 2014 - RxJava를 활용한 Functional Reactive Programming
GDG 2014 - RxJava를 활용한 Functional Reactive Programming
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2
 
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기
활용예시를 통한 Sql server 2012의 향상된 프로그래밍 기능 엿보기
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료
 
10. pointer & function
10. pointer & function10. pointer & function
10. pointer & function
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 

Destacado

이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
Week12 chapter11
Week12 chapter11 Week12 chapter11
Week12 chapter11 웅식 전
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation웅식 전
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization웅식 전
 
상속 관련 이것저것
상속 관련 이것저것상속 관련 이것저것
상속 관련 이것저것EG Lim
 
Responding to change
Responding to changeResponding to change
Responding to change기룡 남
 

Destacado (9)

이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
Week12 chapter11
Week12 chapter11 Week12 chapter11
Week12 chapter11
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization
 
13. structure
13. structure13. structure
13. structure
 
상속 관련 이것저것
상속 관련 이것저것상속 관련 이것저것
상속 관련 이것저것
 
Responding to change
Responding to changeResponding to change
Responding to change
 

Similar a 12장 상속 (고급)

13th chapter12 slide
13th chapter12 slide13th chapter12 slide
13th chapter12 slide웅식 전
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
Kubernetes & helm 활용
Kubernetes & helm 활용Kubernetes & helm 활용
Kubernetes & helm 활용SK Telecom
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄SeongHyun Ahn
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10hungrok
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Functionwonmin lee
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 Chanwook Park
 

Similar a 12장 상속 (고급) (20)

13th chapter12 slide
13th chapter12 slide13th chapter12 slide
13th chapter12 slide
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
06장 함수
06장 함수06장 함수
06장 함수
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
6 function
6 function6 function
6 function
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
Kubernetes & helm 활용
Kubernetes & helm 활용Kubernetes & helm 활용
Kubernetes & helm 활용
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄
 
Changes in c++0x
Changes in c++0xChanges in c++0x
Changes in c++0x
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기
 

Más de 유석 남

02장 Introduction to Java Applications
02장 Introduction to Java Applications02장 Introduction to Java Applications
02장 Introduction to Java Applications유석 남
 
01장 Introduction to Computers and Java
01장 Introduction to Computers and Java01장 Introduction to Computers and Java
01장 Introduction to Computers and Java유석 남
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿유석 남
 
13장 연산자 오버로딩
13장 연산자 오버로딩13장 연산자 오버로딩
13장 연산자 오버로딩유석 남
 
11장 상속
11장 상속11장 상속
11장 상속유석 남
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스유석 남
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)유석 남
 
08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)유석 남
 
05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체유석 남
 
04장 고급변수 사용
04장 고급변수 사용04장 고급변수 사용
04장 고급변수 사용유석 남
 
03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스유석 남
 
[20140624]소개자료
[20140624]소개자료[20140624]소개자료
[20140624]소개자료유석 남
 

Más de 유석 남 (13)

02장 Introduction to Java Applications
02장 Introduction to Java Applications02장 Introduction to Java Applications
02장 Introduction to Java Applications
 
01장 Introduction to Computers and Java
01장 Introduction to Computers and Java01장 Introduction to Computers and Java
01장 Introduction to Computers and Java
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿
 
13장 연산자 오버로딩
13장 연산자 오버로딩13장 연산자 오버로딩
13장 연산자 오버로딩
 
11장 상속
11장 상속11장 상속
11장 상속
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)
 
08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)
 
05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체
 
04장 고급변수 사용
04장 고급변수 사용04장 고급변수 사용
04장 고급변수 사용
 
03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스
 
[20140624]소개자료
[20140624]소개자료[20140624]소개자료
[20140624]소개자료
 
Example
ExampleExample
Example
 

Último

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 

Último (8)

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 

12장 상속 (고급)

  • 1. 12. 상속 : 고급
  • 2. 차례 • 상속에서 멤버 함수 재정의 • 추상 클래스 • 동적 형 변환 • 다중 상속 2/21
  • 3. 함수 오라이딩/동적결합/다형성/가상함 수 1 • 함수 오버라이딩 (Function Overriding) – 기반 클래스의 멤버 함수를 파생 클래스에서 다시 정의하는 것 • 동적 결합 (Dynamic Binding) – 실행 시 호출될 함수를 결정하는 것으로 이는 하나의 함수가 여러 클래스에서 오버라이딩되 었을때 사용 3/21
  • 4. 함수 오라이딩/동적결합/다형성/가상함수 2 • 다형성(Polymorphism) – 하나의 함수가 여러 구현 형태로 정의되는 것 을 다형성이라 함 • 다형성에 의해 함수 재정의시 요구조건 – 기반 클래스의 멤버 함수가 가상함수로 선언 되어야 함 – 함수에서 매개변수로 전달된 변수는 객체의 주소를 포함해야 함 4/21
  • 5. 함수 오라이딩/동적결합/다형성/가상함수 3 • 가상함수 – 함수 오버라이딩을 목적으로 기반 클래스의 함수 – 함수 선언시 virtual 키워드를 표시함 5/21 virtual 함수리턴형 함수이름( ) ;
  • 6. 소스 12-2 (ch12_02.cpp) – 동적결합이 안된 경우 #include <iostream> using namespace std; class A { public: string ClassMessage() { return "class A"; } }; class B : public A { public: string ClassMessage() { return "class B"; } }; void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } int main() { A a; B b; TestFunction1(a); TestFunction1(b); return 0; } 예상 실행 결과 : class A class B 실제 실행 결과 : class A class A 6/21
  • 7. 소스 12-3 (ch12_03.cpp) – 동적결합 #include <iostream> using namespace std; class A { public: string ClassMessage() { return "class A"; } }; class B : public A { public: string ClassMessage() { return "class B"; } }; 기존 내용 (ch12_02.cpp) #include <iostream> using namespace std; class A { public: virtual string ClassMessage() { return "class A"; } }; class B : public A { public: string ClassMessage() { return "class B"; } }; 수정 내용 (ch12_03.cpp) 7/21
  • 8. 소스 12-2 (ch12_03.cpp) – 동적결합 void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } int main() { A a; B b; TestFunction1(a); TestFunction1(b); return 0; } 기존 내용 (ch12_02.cpp) 수정 내용 (ch12_03.cpp) void TestFunction1(A *x) { cout << x->ClassMessage().data() << endl; } int main() { A a; B b; TestFunction1(&a); TestFunction1(&b); return 0; } 실행 결과 : class A class B 실행 결과 : class A class A 8/21
  • 9. 추상 클래스 • 순수 가상 함수 (Pure Virtual Function) – 함수 내용을 정의하지 않고 파생 클래스에서 함수 오버라이딩에 의해 내용이 결정되는 형태의 함수 • 추상 클래스 (Abstract Class) – 객체 생성이 목적이 아닌 클래스 – 상속에서 기반 클래스 역할을 담당 – 순수 가상 함수를 포함 9/21 virtual 반환형 함수이름( ) =0;
  • 10. 소스 12-5 ( ch12_04.cpp) #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass { public: string SampleFunction() { return "SampleFunction"; } }; int main() { AbstractClass obj1; cout << obj1.SampleFunction() << endl; return 0; } 추상 클래스 AbstractClass는 객체 를 생성하지 못함!!!  Error!!! 10/21
  • 11. 소스 12-5 ( ch12_04.cpp) #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass { public: string SampleFunction() { return "SampleFunction"; } }; int main() { TestClass obj1; cout << obj1.SampleFunction() << endl; return 0; } 파생 클래스 TestClass로 객체 생성!!! 11/21
  • 12. 실습 1-1 다음의 클래스를 정의하자. 클래스 이름: GeometricObject 멤버 변수: 두 개의 선(line1, line2)으로 구성된 배정도형 자료를 다루며, 클래스 상속 시 파생 클래스에서 참조케 함 12/21 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 두 개의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 객체 외부로 전달 멤버 변수를 이용하여 도형의 면적을 계산하는 순수 가상 함수 (AreaCalculation) 멤버 변수를 이용하여 도형의 둘레를 계산하는 순수 가상 함수 (RoundCalculation)
  • 13. 실습 1-2 13/21 클래스 이름: Isosceles GeometricObject를 기반 클래스로 하는 파생 클래스 멤버 변수: 이등변 삼각형의 밑면, 높이, 면적(area)과 등변(side)으로 구성되며 밑 변과 높이는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 밑변과 높이의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 등변 계산 함수로 함수 오버라이딩 멤버 변수인 면적과 등변을 각각 객체 외부로 전달
  • 14. 실습 1-3 14/21 클래스 이름: Rectangle GeometricObject를 기반 클래스로 하는 파생 클래스 멤버 변수: 사각형의 가로와 세로, 면적(area)과 둘레(round)로 구성됨, 가로와 세 로는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 가로와 세로의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 사각형 둘레 계산 함수로 함수 오버라이딩 멤버 변수인 넓이와 둘레를 각각 객체 외부로 전달
  • 15. 동적 형 변환 • 동적 형 변환 – 클래스 상속에서 파생 클래스의 객체를 기반 클래스 형으로 변환(업캐스팅;Upcasting) 것 또는 기반 클래스의 객체를 파생 클래스 형으 로 변환(다운캐스팅;Downcasting)하는 것 – 객체의 포인터를 변환을 원하는 클래스의 포 인터로 할당 15/21 객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2)
  • 16. 업 캐스팅 예제 – 소스 12-11(ch12_05.cpp) 16/21 업캐스팅은 자동으로 형변환이 실행됨 (기반  파생) #include "ch12_GeometricObject.h" int main() { GeometricObject *p1 = new Isosceles(9,15); Isosceles *p2 = new Isosceles(5,6); cout << "p1 : " << p1->GetLine1() << endl; cout << "p2 : " << p2->GetLine1() << endl; return 0; }
  • 17. 다운 캐스팅 예제 – 소스 12-12(ch12_06.cpp) 17/21 다운캐스팅은 dynamic_cast 연산자가 명시되어야 함 (파생  기반) #include "ch12_GeometricObject.h" void DisplayGeometricObject(GeometricObject &object) { cout << "line1 : " << object.GetLine1() << endl; cout << "line2 : " << object.GetLine2() << endl; GeometricObject *p=&object; Isosceles *p1 = dynamic_cast<Isosceles*>(p); //다운 캐스팅 Rectangle *p2 = dynamic_cast<Rectangle*>(p); //다운 캐스팅 if (p1 != NULL) { p1->AreaCalculation(); p1->Compute(); cout << "이등변 삼각형의 넓이 : " << p1->GetArea() << endl; cout << "이등변 삼각형의 등변 : " << p1->GetSide() << endl; } 매개변수로 전달받은 GeometricObject 객체 포인터 주소를 저장
  • 18. if (p2 != NULL) { p2->AreaCalculation(); p2->Compute(); cout << "사각형의 넓이 : " << p2->GetArea() << endl; cout << "사각형의 둘레 : " << p2->GetRound() << endl; } } int main() { Isosceles p1(9, 15); Rectangle p2(10, 12); DisplayGeometricObject(p1); cout << "****************************" << endl; DisplayGeometricObject(p2); return 0; } 18/21
  • 19. 소스 12-12 설명 • 36번 라인 DisplayGeometricObject(Isosceles p1); 이 호출되면 함수에서 p1은 정상적인 주소의 객체, p2는 NULL이 할당되며 여러 번 동적 형 변환이 발생함!! • 37번 라인 DisplayGeometricObject(Rectangle p2); 이 호출되면 함수에서 p1은 NULL이 할당되고 , p2는 정상적인 주소의 객체가 할당되고 여러 번 동적 변환이 발생함 19/21
  • 20. 다중 상속 • 클래스 상속의 형태 20/21 기반 클래스 파생 클래스 기반 클래스 파생 클래스1 파생 클래스2 기반 클래스 파생 클래스 파생 클래스 기반 클래스1 기반 클래스2 파생 클래스
  • 21. 소스 12-13~소스 12-17 (ch12_multi.h, ch12_multi.cpp, ch12_07.cpp) 21/21 class ScoreSource { ……………………….. }; class RankGrade { ……………………….. }; class SungJuk : public ScoreSource, public RankGrade { ……………………….. };