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

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
제 3 장 변수와 자료형.
명품 C++ 프로그래밍 3장. 클래스와 객체.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제1장 기초 사항.
Internet Computing KUT Youn-Hee Han
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
Java Presentation 중간 시험2 풀이
강좌명 : C++프로그래밍 (C++ Programming)
Chapter 6 구조체.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
C++ Exspresso 제5장 클래스의 기초.
Internet Computing KUT Youn-Hee Han
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
8. 객체와 클래스 (기본).
명품 JAVA Programming 제 4 장 클래스와 객체.
C++ Espresso 제9장 다형성.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
C++ Espresso 제6장 생성자와 소멸자.
명품 JAVA Essential.
6. 기본 클래스 프로그래밍 6 컴퓨터공학과 신동일.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
명품 Java Programming.
MFC Application Frameworks (AFX)
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
7장 클래스.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C ++ 프로그래밍 시작.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 08. 상속과 다형성.
김 정 석 Web Programming 김 정 석
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
명품 C++ 프로그래밍 1장. C++ 시작.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Chapter 3 클래스. 최호성.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
소프트웨어 공학 (Software Engineering)
가상함수와 추상 클래스.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
3장. 클래스의 기본.
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
Chapter 02. 소프트웨어와 자료구조.
A Basic of C++.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
3장,4장 발표 서정우.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
자바 5.0 프로그래밍.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
컴퓨터 계측 및 실습 C++ 기초 영남대학교 기계공학부.
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
C# 09장. 클래스와 객체.
C.
C++ 언어의 특징
프로그래밍 기법 최적화 프로그래밍.
발 표 자 : 7조 손 창 국 윤 오 성, 박 진 완 객체 지향 프로그래밍 C++
Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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++는 변수와 함수를 함께 클래스에 묶음 

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

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

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

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); // 멤버함수의 접근 클래스 사용시 직접 멤버변수에 접근 하는 것과 멤버함수를 통해서 멤버변수에 접근하는 두 가지 방식이 있음

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

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

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

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! }

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

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

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

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; } 포인터를 사용하면 메모리를 직접 접근할 수 있어 속도가 빠르다. 메모리를 효율적으로 관리할 수 있다. 단점 : 아이에게 칼을 쥐어 주는 것과 같다. (자바는 가상머신이 알아서 메모리 관리를 해준다.)

1. C++ Overview 1.8 정적 멤버변수 1) 정적 멤버변수 변수 선언문 앞에 static 이라는 키워드가 붙는 변수 pp. 50 그림 1-15 참조 각각의 인스턴스들은 멤버함수를 공유하지만 멤버변수는 공유하지 않음  각 인스턴스들이 공유할 수 있는 멤버변수가 필요할 경우 있음 이때 정적 멤버변수 사용함 (그림 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; };

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

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

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); 함수이름이 같으나 매개변수의 타입이나 개수가 틀릴 경우 별도의 다른 함수를 만들 수 있다. 중복함수다

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

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 참조

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 참조)

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

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

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

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

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 함수 호출

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 함수 호출

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 함수 호출

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

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

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

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

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

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

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

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

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

1. C++ Overview 1.18 const 변수/ 함수 변수 이름 앞이나 함수 이름 뒤에 const 키워드를 붙임 잘 정의해서 사용하면 속도를 최적화 할 수 있고 의도되지 않은 멤버변수의 변경을 예방할 수 있음 const double pi = 3.141592; 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;

2. Q&A Thank you