Presentation is loading. Please wait.

Presentation is loading. Please wait.

C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선

Similar presentations


Presentation on theme: "C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선"— Presentation transcript:

1 C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
And Immediately they left their nets and followed him. 객체지향 윈도우즈 프로그래밍 C++ 개요 한국성서대학교 유일선

2 1. C++ Overview 1.1 소프트웨어 위기 1) 소프트웨어란? Program + Data + Document
2) 소프트웨어 위기  소프트웨어의 요구와 그 공급 능력 간의 차이가 갈수록 심화 1968년 10월 독일에서 개최된 ‘NATO Science Committee’ 국제회의에서 처음 언급됨 소프트웨어 분야에서는 결정적인 전환점이나 발전 없이 느리고 점진적인 변화만 지속 되었음 소프트웨어 개발 기술의 낙후와 전문 인력의 부족 현상이 소프트웨어의 생산성을 떨어뜨림 개발 예산과 일정이 설정하기 어려움 개발자의 역량에 의하여 개발의 성패가 좌우됨 체계적인 품질 관리 체계의 부재로 고품질 소프트웨어 생산이 어려움

3 1. C++ Overview 1.1 소프트웨어 위기 3) 소프트웨어 위기의 원인
소프트웨어 생산성이 사용자의 서비스 지원을 따라가지 못함 (낙후된 생산성)  사용자의 기대치는 점점 커지지만 생산성은 그 만큼 증대하지 않음 소프트웨어의 품질이 향상되지 않으며, 유지보수가 어려움  소프트웨어는 고정적인 것이 아니고 계속 진화됨  변경이 어려움  과다한 유지 보수 비용

4 1. C++ Overview 1.1 소프트웨어 위기 3) 소프트웨어 위기의 원인
 새로운 프로그램 작성보다 기존 프로그램의 수정 및 유지보수에 많은 시간과 비용이 요구되는 현상 발생

5 1. C++ Overview 1.1 소프트웨어 위기 4) 소프트웨어 위기를 극복하기 위한 노력들
Goto 문의 남용으로 인한 스파게티 코드  소프트웨어의 재사용 및 유지보수가 불가능 모듈화 프로그래밍  프로그램을 모듈단위로 개발 구조적 프로그래밍  Goto 문을 없엠 (대신 while, for, switch 등의 명령어 사용) 4세대 언어 - 비 절차적 언어  프로그램을 자동으로 생성 RAD Tool (Visual Studio 등) 소프트웨어 공학  소프트웨어 생산성을 공장의 기계 부품 처럼 높이려는 학문 객체지향 기술 컴포넌트 기반 기술 재사용성 향상

6 1. C++ Overview 1.2 객체지향 프로그래밍 개요 1) 기본개념 소프트웨어 시스템의 기본 성분은 객체이다.
1.2 객체지향 프로그래밍 개요 1) 기본개념 소프트웨어 시스템의 기본 성분은 객체이다. 객체는 서로 관련되는 정보와 행위를 묶어 놓은 일종의 패키지이다. 정보는 객체 안에 있는 속성 내에 저장되어 있으며, 모든 행위 또한 객체의 책임하에 수행된다. 객체간의 상호 작용은 다른 객체에 메시지를 보내고, 그 객체의 응답을 받는 것이 전부이다. 객체들은 무엇인가를 얻기 위하여 다른 객체의 속성 내에 저장된 자료를 읽거나 다른 객체의 구조를 제어할 필요가 없다.

7 1. C++ Overview 1.2 객체지향 프로그래밍 개요 2) 비교 (pp.23 표1-1, 표1-2)
1.2 객체지향 프로그래밍 개요 2) 비교 (pp.23 표1-1, 표1-2) 객체지향 방법 (자료와 관련 함수의 결합) 구조적 방법 (기능중심, 변경의 파급효과 큼) 객체 = 자료구조 + 함수 프로그램 = 객체 + 객체 + ... 프로그램 = 자료구조 + 함수 자료 자료 함수 함수 자료 함수1 함수2 함수3 자료 자료 함수 함수

8 1. C++ Overview 1.2 객체지향 프로그래밍 개요 3) 객체
1.2 객체지향 프로그래밍 개요 3) 객체 효율적으로 정보를 관리하기 위하여, 사람들이 의미를 부여하고 분류하는 논리적인(개념적인) 단위 실세계에 존재하는 하나의 단위에 대한 소프트웨어적 표현 객체의 구성은 다음과 같음 - 속성값을 나타내는 데이터(data) - 데이터를 변경하거나 조작할 수 있는 연산(메소드)로 구성 - state와 behavior를 가진다  State: 객체의 상태 – data에 의해 표현  Behavior: 객체의 행동 (state의 변화)

9 1. C++ Overview 1.2 객체지향 프로그래밍 개요 4) 클래스
1.2 객체지향 프로그래밍 개요 4) 클래스 객체는 항상 클래스로부터 생성된다. 즉 클래스는 객체를 생성하는 형판(template) 클래스는 두개의 구성요소(member)인 자료구조(필드)와 연산(메소드)을 가진다 클래스로부터 생성된 객체를 instance라 한다. 객체 = instance 정보처리의 주체는 클래스가 아니라 객체이다 객체지향 프로그래밍의 시작은 클래스의 생성이다

10 1. C++ Overview 1.2 객체지향 프로그래밍 개요 4) 클래스 인스턴스 속성(변수) 털색깔 품종 클래스
1.2 객체지향 프로그래밍 개요 4) 클래스 인스턴스 속성(변수) 털색깔 품종 꼬리모양 클래스 “Sparky” “dog” 행위(메소드) 앉는다 뛴다 짖는다 “Rex”

11 1. C++ Overview 1.2 객체지향 프로그래밍 개요 5) 메시지 메시지 송신객체 수신객체 객체에게 일을 시키는 행위
1.2 객체지향 프로그래밍 개요 5) 메시지 객체에게 일을 시키는 행위 메시지는 세가지 요소로 구성된다 - 메시지를 받을 객체의 이름(주소) - 송신객체가 실행을 원하는 수신객체의 메소드 이름 - 실행을 원하는 메소드에 전달할 매개변수 메시지 수신객체 송신객체 객체이름.메소드(매개변수)

12 1. C++ Overview 1.2 객체지향 프로그래밍 개요 6) 캡슐화 및 정보은닉
1.2 객체지향 프로그래밍 개요 6) 캡슐화 및 정보은닉 객체의 data와 관련 연산을 한데 모아 캡슐화 What만 보여주고 How는 감춘다. 객체를 작성할 때 숨겨야 하는 정보(private)와 공개해야 하는 정보(public)를 구분하여 작성 객체의 사용자는 기능만 알고 사용하며 어떻게 처리되는지는 은폐된다 (Information Hiding) 숨겨진 데이터와 메소드들 public 공개된 인터페이스 객체 객체의 사용자들은 공개된 인터페이스를 통해서만 객체에 접근할 수 있다

13 1. C++ Overview 1.2 객체지향 프로그래밍 개요 7) 상속 클래스는 계층구조를 구성할 수 있다
1.2 객체지향 프로그래밍 개요 7) 상속 클래스는 계층구조를 구성할 수 있다 상위 계층의 모든 요소를 상속 받고 추가적으로 필요로 되는 새로운 자료구조와 메소드를 추가하여 하위 계층의 클래스를 생성 객체지향에서는 상속의 개념을 이용하여 코드 재사용(reusing)을 지원 도형 2차원 3차원 삼각형 입방체

14 1. C++ Overview 1.2 객체지향 프로그래밍 개요 7) 상속 Person id name get_id()
1.2 객체지향 프로그래밍 개요 7) 상속 Person id name get_id() get_name() Student Employee id name gpa id name pay get_id() get_name() register() get_id() get_name() raise_pay()

15 1. C++ Overview 1.2 객체지향 프로그래밍 개요 8) 다형성
1.2 객체지향 프로그래밍 개요 8) 다형성 동일한 메시지(메소드 명)에 대해 서로 다른 객체가 각기 다른 방식으로 반응하는 것. 즉, 의미상으로는 같은 작업이나 수행방법에 차이가 있는 메소드들을 동일한 이름으로 표현하는 것을 말함  one interface, multiple implementation 연산자 및 메소드 중복정의

16 1. C++ Overview 1.2 객체지향 프로그래밍 개요 8) 다형성 도형 그리기 좌표구하기 점 그리기 (중복정의)
1.2 객체지향 프로그래밍 개요 8) 다형성 도형 그리기 좌표구하기 그리기 (중복정의) 좌표구하기(중복정의) 그리기 (중복정의) 좌표구하기(중복정의) 그리기 (중복정의) 좌표구하기(중복정의) 면적구하기

17 1. C++ Overview 1.3 C++ 의 역사 C++은 1980년 미국 벨 연구소의 Bjarne Stroustrup 박사에 의해 개발 1980년 발표 당시에는 “C with class” 라는 이름으로 발표 “C++”라는 이름은 1983년부터 사용되기 시작 C++ C 함수 및 연산자의 다중정의 참조자, 클래스 함수, 포인터 구조체, 공용체 풍부한 연산자 ⊙ 객체지향 프로그래밍 ⊙

18 1. C++ Overview 1.3 C++의 역사 Bjarne Stroustrup

19 1. C++ Overview 1.4 Hello C++ void main() { cout << “Hello C++”;
}

20 1. C++ Overview 1.5 C++: 클래스의 개요 1) 캡슐화 데이터와 함수를 하나로 묶어서 관리할 수 있는 메카니즘
관련있는 데이터와 함수를 일괄적으로 관리할 수 있도록 함  재사용성을 증가시킴 C에서는 구조체를 통해 변수만을 하나로 묶었음 C++ 에서는 클래스를 통해 변수와 함수를 함께 묶었음 C와 C++의 비교 pp. 30 표1-3과 그림 1-5참조

21 1. C++ Overview 1.5 C++ 클래스의 개요 1) 캡슐화 struct Point{ int x; int y;
}  C는 변수를 구조체에 묶음 class Point{ public: int m_nX; int m_nY; void SetPosition(int nX, int nY); void Move(int nX, int nY); void Show(); } C++는 변수와 함수를 함께 클래스에 묶음 

22 1. C++ Overview 1.5 C++ 클래스의 개요 2) 클래스 사용
클래스를 사용하기 위해서는 다음과 같은 세 가지 부분이 필요함 클래스의 선언 클래스의 구현 클래스의 사용

23 1. C++ Overview 1.5 C++ 클래스의 개요 2) 클래스 사용 – 클래스의 선언
클래스의 선언이란 클래스의 이름과 멤버변수, 멤버함수 등을 정의하는 것임 클래스는 아래와 같이 선언되며 클래스의 선언부는 *.h 파일에 저장됨 class Point{ // 클래스의 이름 정의 public: // 멤버변수 int m_nX; int m_nY; // 멤버함수 void SetPosition(int nX, int nY); void Move(int nX, int nY); void Show(); }

24 1. C++ Overview 1.5 C++ 클래스의 개요 2) 클래스 사용 – 클래스의 구현
클래스의 구현이란 클래스의 멤버함수를 기술해 주는 것을 의미함 클래스의 구현부분은 *.cpp 파일에 저장됨 void Point::SetPosition(int nX, int nY){ m_nX = nX; m_nY = nY; } void Point:: Move(int nX, int nY){ m_nX += nX; m_nY += nY; void Point:: Show(){ cout << “X=“ << m_nX << “Y=“ << m_nY << “\n”;

25 1. C++ Overview 1.5 C++ 클래스의 개요 3) 클래스 사용 – 클래스의 사용
* 인스턴스 실세계에서 동작하는 실제 객체 즉 메모리에 생성된 클래스의 실체 int a, b; // a와 b가 int라는 객체의 인스턴스임 Point pt; // pt가 Point라는 객체의 인스턴스임 // 클래스를 인스턴스화 한 후, 인스턴스를 통해 클래스를 사용함 pt.m_nX = 50; // 멤버변수의 접근 pt.Move(20,30); // 멤버함수의 접근 클래스 사용시 직접 멤버변수에 접근 하는 것과 멤버함수를 통해서 멤버변수에 접근하는 두 가지 방식이 있음

26 1. C++ Overview 1.5 C++ 클래스의 개요 4) 인스턴스들 사이의 멤버함수 공유
각각의 인스턴스는 멤버변수를 위한 별도의 메모리 공간을 부여 받지만 멤버변수의 경우 모든 인스턴스들이 함께 공유함 (pp.36 그림 1-6,7 참조) #include “Point.h” void main(){ Point myPosition, yourPosition; myPosition.SetPosition(10,30); yourPosition.SetPosition(50,30); myPosition.Move(20,50); yourPosition. Move(30,40); myPosition.Show(); yourPosition. Show(); }

27 1. C++ Overview 1.6 데이터 감추기 (Information Hiding) 1) 지역변수와 공유변수
변수의 종류에는 지역변수와 전역변수가 있음 (그림 1-9,10 참조) 지역변수: 어떤 함수 혹은 { }내에서 선언된 변수로 그 영역을 벗어나면 자동으로 삭제됨 (스택에 할당됨) 따라서 해당영역에서만 유효함  자동변수 전역변수: 함수 밖에서 선언된 변수로 프로그램 시작부터 종료까지 메모리에 존재하는 변수임 (메모리에 할당됨) int g; // 전역변수 void func1() { int a, b; // 지역변수 }

28 1. C++ Overview 1.6 데이터 감추기 (Information Hiding) 1) 지역변수와 공유변수
전역변수가 많아 지면 변수 관리가 어려워짐 변수의 형태를 변경하기 어려워짐 (그림 1-10)  여러 변수와 여러 함수가 서로 얽혀 있기 때문에 프로그램 개발 도중에 변수를 변경하거나 새로운 변수를 추가하기 어려움 위의 문제점을 해결하기 위해 클래스는 연관 있는 데이터와 함수를 함께 묶어 캡슐화를 함 그림 1-11과 그림 1-12 참조

29 1. C++ Overview 1.6 데이터 감추기 (Information Hiding) 2) 캡슐화된 데이터 감추기
내부의 복잡함을 숨기고 이해하기 쉬운 인터페이스만을 제공함으로써 클래스의 재사용성을 증가시킴 클래스의 멤버변수에 대한 외부의 접근을 통제함으로써 무분별한 외부접근으로 인한 부작용을 방지할 수 있음 키워드: public, protected, private class Point{ public: void SetPosition(int nX, int nY); void Move(int nX, int nY); void Show(); protected: // 외부에서 접근할 수 없음 int m_nX, m_nY; } void main() { Point myPosition; myPosition.SetPosition(10,20); myPosition.m_nX+=20; //error! }

30 1. C++ Overview 1.7 생성자와 소멸자 함수 1) 생성자와 소멸자 함수란?
모든 클래스는 생성자와 소멸자라는 특수한 함수를 가짐 생성자: 함수이름이 클래스와 일치하는 함수 소멸자: 클래스 이름 앞에 ~가 붙는 함수 명시적으로 만들어 주지 않아도 컴파일러가 암시적으로 만들어 줌 class Point{ public: Point(); // 생성자 virtual ~Point(); // 소멸자 }

31 1. C++ Overview 1.7 생성자와 소멸자 함수 2) 생성자와 소멸자의 호출시기
생성자와 소멸자는 명시적으로 직접 호출되는 경우는 없음  알아서 자동으로 호출됨 생성자는 인스턴스가 생성될 때, 소멸자는 인스턴스가 소멸될 때 호출됨 클래스의 인스턴스는 지역변수, 전역변수, 정적변수로 선언될 수 있음 전역변수와 정적변수: 프로그램이 시작될 때 생성되고 종료될 때 소멸됨 지역변수: 함수나 영역이 시작될 때 생성되고 종료될 때 소멸됨 int a; // 전역변수 void main() { int b; // 지역변수 static int c; // 정적변수 }

32 1. C++ Overview 1.7 생성자와 소멸자 함수 3) 생성자와 소멸자 함수의 역할
생성자 함수는 멤버변수를 초기화 하거나 필요한 메모리를 할당하는 초기화 기능을 수행함 소멸자 함수는 할당받은 메모리를 해제하는 등의 정리루틴을 수행함 생성자 함수도 다른 함수와 유사하게 매개변수를 넘겨 받을 수 있음  이처럼 디폴트 생성자 함수 외에 매개변수를 넘겨받는 중복함수를 부가적으로 추가하면 멤버변수를 초기화하는 유용한 방법이 됨 생성자/소멸자 함수 정의시 주의사항 - 함수의 이름이 자동으로 결정됨 - 반환값을 가질 수 없음 (return) - 생성자는 가상함수로 정의될 수 없고 소멸자는 가상함수로 정의되어야 함 - 생성자는 매개변수를 받을 수 있지만 소멸자는 그럴 수 없음

33 void setDataAmount(int amount); int getDataAmount(); char * getData();
class MyData{ public: MyData(); MyData(int amount); virtual ~MyData(); void setDataAmount(int amount); int getDataAmount(); char * getData(); protected: char *m_pData; int m_nAmount; } void main() { MyData a; a. setDataAmount(10); MyData b(10); } MyData::MyData(){ m_pData = NULL; m_nAmount = 0; } MyData::MyData(int amount){ m_nAmount = amount; m_pData = (char*) new char[amount]; MyData::~MyData(){ if(m_pData != NULL) delete[] m_pData; void MyData::setDataAmount(int amount){ } int MyData::getDataAmount(){ return m_nAmount; } char * MyData::getData(){ return m_pData; } 포인터를 사용하면 메모리를 직접 접근할 수 있어 속도가 빠르다. 메모리를 효율적으로 관리할 수 있다. 단점 : 아이에게 칼을 쥐어 주는 것과 같다. (자바는 가상머신이 알아서 메모리 관리를 해준다.)

34 1. C++ Overview 1.8 정적 멤버변수 1) 정적 멤버변수 변수 선언문 앞에 static 이라는 키워드가 붙는 변수
pp. 50 그림 참조 각각의 인스턴스들은 멤버함수를 공유하지만 멤버변수는 공유하지 않음  각 인스턴스들이 공유할 수 있는 멤버변수가 필요할 경우 있음 이때 정적 멤버변수 사용함 (그림 1-16 참조) int Point::m_nCount = 0; Point::Point(){ m_nCount++; cout << "현재 총 " << m_nCount << "개의 인스턴스 존재\n"; } Point::~Point(){ m_nCount--; class Point { // 정적 멤버 변수 static int m_nCount; };

35 1. C++ Overview 1.9 연산자 오버로딩 1) 연산자 오버로딩이란?
연산자를 함수처럼 정의해서 사용하는 기능 예) Point pt1, pt2; pt1 = pt1 + pt2; 연산자의 종류에는 단항연산자(전위형, 후위형)와 이항연산자가 있음 - 단항 연산자: a++, ++a - 이항 연산자: a+b

36 1. C++ Overview 1.9 연산자 오버로딩 2) 단항 연산자의 경우 ( pp. 59 표1-4 참조)
Point::Point(){ m_nX = 0; m_nY = 0; } Point::Point(int nX, int nY){ m_nX = nX; m_nY = nY; void Point::SetPosition(int nX, int nY){ Point Point::operator++(){ return Point(++m_nX, ++m_nY); Point Point::operator ++(int dummy){ return Point(m_nX++, m_nY++); class Point { public: Point(); // 생성자, 소멸자 함수 virtual ~Point(); Point(int nX, int nY); // 멤버 함수 void SetPosition(int nX, int nY); // 단항 연산자 Point operator++(); // 전위형 Point operator++(int dummy); // 후위형 protected: // 멤버 변수 int m_nX, m_nY; };

37 1. C++ Overview 1.9 연산자 오버로딩 3) 이항 연산자의 경우 ( pp. 60 그림 1-17 참조)
class Point { public: Point(); // 생성자, 소멸자 함수 virtual ~Point(); Point(int nX, int nY); // 멤버 함수 void SetPosition(int nX, int nY); // 이항 연산자 Point operator-(Point &point); Point operator+(Point &point); Point operator=(Point &point); protected: // 멤버 변수 int m_nX, m_nY; }; Point Point::operator+(Point &point){ return Point(m_nX+point.m_nX, m_nY+point.m_nY); } Point Point::operator-(Point &point){ return Point(m_nX-point.m_nX, m_nY-point.m_nY); Point Point::operator=(Point &point){ return Point(m_nX=point.m_nX, m_nY=point.m_nY); 함수이름이 같으나 매개변수의 타입이나 개수가 틀릴 경우 별도의 다른 함수를 만들 수 있다. 중복함수다

38 1. C++ Overview 1.9 연산자 오버로딩 4) 활용예 (CD에 있는 예제 참조: Operator Overloading) void main(){ // Point alpha, beta, gamma; // alpha.SetPosition(10, 10); // beta.SetPosition(50, 50); Point alpha(10,10), beta(50,50), gamma; beta = alpha++; alpha.Show(); beta.Show(); beta = ++alpha; gamma = alpha + beta; gamma.Show(); }

39 1. C++ Overview 1.10 상속성 1) 기반 클래스와 파생 클래스 그림 1-19 참조
class BaseClass { public: int baseVariable1, baseVariable2; BaseClass(); virtual ~ BaseClass(); void baseFunction(); }; class DerivedClass: public BaseClass { int dVariable1; DerivedClass(); virtual ~ DerivedClass(); void dFunction(); void main() { DerivedClass do; do.baseVariable1 = 0; do.dVariable1 = 0; do.baseFunction(); do.dFunction(); } 그림 1-19 참조

40 1. C++ Overview 1.10 상속성 1) 기반 클래스와 파생 클래스 pp.64 그림 1-19 참조
protected와 private의 공통점 및 차이  protected와 private는 클래스 멤버 에 대한 외부 접근을 허용하지 않음  protected는 후손 클래스의 직접 접근을 허용 private는 후손 클래스의 직접 접근을 허용하지 않음 public 상속과 private 상속의 차이  public 상속: 외부에서 조상의 public 멤버 접근을 허용  private 상속: 외부에서 조상의 public 멤버 접근을 허용하지 않음 (pp. 66 그림 1-20, 21 참조)

41 1. C++ Overview 1.11 멤버함수 재정의 (Overriding) 1) 멤버함수 재정의란?
클래스 상속의 경우 조상 클래스 멤버함수의 개선이 필요할 때 멤버함수의 이름을 그대로 유지하면서 후손 클래스에 적합하도록 기능을 변경하는 것 예) 2차원 좌표를 나타내는 Point의 Draw 함수와 Point 를 상속한 3차원 좌표를 나타내는 3DPoint의 Draw 함수는 다름

42 1. C++ Overview 1.11 멤버함수 재정의 (Overriding) 2) 함수 재정의 예 // 기능수정 // 기능추가
class Point{ public: void Show(); protected: // 멤버 변수 int m_nX, m_nY; }; class Point3D: public Point{ int m_nZ; // 기능수정 void Point3D::Show(){ cout << "X=" << m_nX << ", Y=" << m_nY << ", Z=" << m_nZ << "\n"; } // 기능추가 void Point3D::Show(){ cout << "Z=" << m_nZ << ", "; Point::Show(); }

43 1. C++ Overview 1.11 멤버함수 재정의 (Overriding)
3) 오버로딩(Overloading)과 재정의(Overriding)의 차이점 오버로딩 함수이름은 같지만 매개변수가 서로 다른 함수를 두개 이상 정의하는 것 연산자 중복도 같은 예임  int Max(int a, int b), double Max(double a, double b) 재정의 조상 클래스와 동일한 함수이름과 매개변수를 갖지만 기능이 다른 함수를 정의하는 것

44 1. C++ Overview 1.12 가상함수 (Virtual Function) 1) 함수의 바인딩
함수 바인딩 함수를 호출한 부분에 함수가 위치한 메모리 위치를 연결시켜 주는 것 (pp. 72 그림 1-22 참조)  정적 바인딩과 동적 바인딩이 존재함 정적 바인딩 컴파일 시간에 바인딩이 이루어 지는 것 즉 컴파일 시간에 호출될 함수로 점프할 번지가 결정됨 동적 바인딩 실행 시간에 바인딩이 이루어 지는 것 즉 실행시간에 호출될 함수로 점프할 번지가 결정됨  수행속도의 저하와 가상함수별로 메모리 번지를 저장할 포인터를 위한 4바이트의 메모리 요구

45 1. C++ Overview 1.12 가상함수 (Virtual Function) 2) 동적 바인딩의 효과
다형성 지원이 주된 목적임 (CD 예제 중 Virtual Function 참조) class Point{ public: void Show(); }; class Point3D: public Point{ void Show(); // 함수 재정의 Point ::Show(){ cout<<"Point의 Show 함수 호출" } Point3D :: Show(){ cout<<"Point 3D 의 Show 함수 호출 " void main(){ Point point; Point3D poin3d; point.Show(); poin3d.Show(); } Point의 Show 함수 호출 Point 3D 의 Show 함수 호출

46 1. C++ Overview 1.12 가상함수 (Virtual Function) 2) 동적 바인딩의 효과
class Point{ public: void Show(); }; class Point3D: public Point{ void Show(); // 함수 재정의 Point :: Show(){ cout<<"Point의 Show 함수 호출" } Point3D :: Show(){ cout<<"Point 3D 의 Show 함수 호출 " void main(){ Point* p; Point point; Point3D poin3d; p = &point; p->Show(); p = & poin3d; } Point의 Show 함수 호출

47 1. C++ Overview 1.12 가상함수 (Virtual Function) 2) 동적 바인딩의 효과
class Point{ public: virtual void Show(); }; class Point3D: public Point{ void Show(); // 함수 재정의 Point :: Show(){ cout<<"Point의 Show 함수 호출" } Point3D :: Show(){ cout<<"Point 3D 의 Show 함수 호출 " void main(){ Point* p; Point point; Point3D poin3d; p = &point; p->Show(); p = & poin3d; } Point의 Show 함수 호출 Point 3D 의 Show 함수 호출

48 1. C++ Overview 1.13 인라인(inline) 함수 1) 인라인 함수란?
일반 함수의 경우, 함수호출시 호출 위치에서 함수코드가 있는 곳으로 점프하여 함수를 실행함 인라인 함수는 일반 함수와 달리 함수를 호출하는 위치마다 함수의 소스코드를 통째로 복사함  일반 함수 보다 수행속도가 빠름 인라인 함수의 단점 - 함수가 호출되는 곳마다 코드가 복사되기 때문에 이 함수를 호출하는 부분이 많을 수록 실행화일의 크기가 커짐 인라인 함수와 매크로의 차이점 (#define에 의한 방법)  타입 체크를 함 인라인 함수는 빈번히 호출되는 함수와 코드사이즈가 작은 함수에 사용하면 유용함

49 1. C++ Overview 1.13 인라인(inline) 함수 2) 인라인 함수 사용법 묵시적인 방법  헤더에서 정의함
class Point{ void SetPosition(int nX, int nY){ m_nX = nX; m_nY = nY; } int m_nX, m_nY; }; 명시적인 방법 .cpp파일에서 구현되는 함수명 앞에 inline이라는 키워드를 덧붙임 class Point{ void SetPosition(int nX, int nY); int m_nX, m_nY; }; inline void Point::SetPosition(int nX, int nY){ m_nX = nX; m_nY = nY; }

50 1. C++ Overview 1.14 레퍼런스 1) 매개변수 전달방법 (실습)
Call by value (값 복사에 의한 방법)  변수를 전달하지 않고 변수의 값을 함수에 복사함 void swap(int a, int b){ int temp; temp = a; a = b; b = temp; } void main(){ int x = 10, y = 20; swap(x,y); cout << x << “,” << y; } 10,20

51 1. C++ Overview 1.14 레퍼런스 1) 매개변수 전달방법 (실습)
Call by reference (레퍼런스에 의한 호출)  변수의 복사본을 만들지 않고 변수 자체를 함수에 전달함 void swap(int &a, int &b){ int temp; temp = a; a = b; b = temp; } void main(){ int x = 10, y = 20; swap(x,y); cout << x << “,” << y; } 20,10

52 1. C++ Overview 1.14 레퍼런스 1) 매개변수 전달방법 (실습)
Call by reference (레퍼런스에 의한 호출)  변수의 복사본을 만들지 않고 변수 자체를 함수에 전달함 void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; } void main(){ int x = 10, y = 20; swap(&x,&y); cout << x << “,” << y; } 20,10

53 1. C++ Overview 1.15 템플릿 (Template) 1) 템플릿이란?
클래스의 형태는 그대로 유지하면서 멤버변수의 타입만 변경할 때 사용하는 방법  구현 내용을 헤더화일에 같이 써주어야 함 template <class type> class Point { public: // 멤버 함수 void SetPosition(type nX, type nY); void Move(type nX, type nY); void Show(); protected: // 멤버 변수 type m_nX, m_nY; };

54 template <class type>
void Point<type>::SetPosition(type nX, type nY) { m_nX = nX; m_nY = nY; } void Point<type>::Move(type nX, type nY) m_nX += nX; m_nY += nY; void Point<type>::Show() cout << "X=" << m_nX << ", Y=" << m_nY << "\n"; void main() { // 인스턴스 생성 Point <double> dPosition; Point <int> nPosition; // 변수 값 초기화 dPosition.SetPosition(10.45, 30.52); nPosition.SetPosition(50, 30); // 현재 좌표 출력 dPosition.Show(); nPosition.Show(); }

55 1. C++ Overview 1.16 디폴트 매개변수 함수의 매개변수 값을 디폴트로 정할 수 있음 즉 함수에 매개변수를 넘기지 않으면 묵시적을 디폴트값이 지정됨 class Date{ int year, month, day; void SetDate(int y=2000, int m=1, int d=1); } void Date::SetDate(int y, int m, int d){ year = y; month = m; day = d; Date date; Date.SetDate(); // 2000,1,1 Date.SetDate(2005); // 2005,1,1 Date.SetDate(2005,3); // 2005,3,1 Date.SetDate(2005,3,21); // 2005,3,21

56 1. C++ Overview 1.17 this 클래스 자신을 가르키는 포인터 이 변수를 통해 자신의 주소를 알 수 있음
클래스 자신을 가르키는 포인터 이 변수를 통해 자신의 주소를 알 수 있음 this->SetPosition(10,20,20); this->m_nX;

57 1. C++ Overview 1.18 const 변수/ 함수 변수 이름 앞이나 함수 이름 뒤에 const 키워드를 붙임
잘 정의해서 사용하면 속도를 최적화 할 수 있고 의도되지 않은 멤버변수의 변경을 예방할 수 있음 const double pi = ; Pi = 10; // error class Count{ int m_nCount; Public: void GetCount() const; void SetCount(int c){m_nCount = c; } } void Count::GetCount() const { return m_nCount;

58 2. Q&A Thank you


Download ppt "C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선"

Similar presentations


Ads by Google