Presentation on theme: "명품 C++ 프로그래밍 3장. 클래스와 객체."— Presentation transcript: 1 명품 C++ 프로그래밍 3장. 클래스와 객체
2 세상의 모든 것이 객체이다. 세상 모든 것이 객체 TV 의자 책 집
카메라 컴퓨터 3 객체는 캡슐화된다. 캡슐화(encapsulation) 객체의 본질적인 특성 4 토끼의 간과 객체의 캡슐화
5 객체의 일부 요소는 공개된다. 객체의 일부분 공개 외부와의 인터페이스(정보 교환 및 통신)를 위해 객체의 일부분 공개
6 C++ 객체는 멤버 함수와 멤버 변수로 구성된다. 7 TV와
C++로 설계된 TV 객체
8 C++클래스와 C++객체 클래스 객체 객체를 만들어내기 위해 정의된 설계도, 틀 클래스는 객체가 아님. 실체도 아님
9 클래스와 객체 관계
10 C++ 클래스 만들기 클래스 작성 클래스 선언부(class declaration)
11 클래스
선언과 클래스 구현으로 분리하는 이유는 클래스를 다른 파일에서 활용하기 위함 12 예제 3-1 Circle 클래스의 객체 생성 및
활용
13
객체 생성 및 활용 설명 객체 이름 및 객체 생성 객체의 멤버 변수 접근 객체의 멤버 함수 접근 14 객체 이름과 생성, 접근 과정
15 예제 3-2(실습) – Rectangle 클래스 만들기 16 예제 3-2(실습) 정답 #include <iostream> using
namespace std; 17 탁구공 생산 장치와 생성자 똑 같은 탁구공이 생산되지만 페인트 색으로 초기화된다.
18 생성자 생성자(constructor) 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수 클래스 이름과 동일한 멤버 함수
19 생성자 함수의 특징 생성자의 목적 생성자 이름 생성자는 리턴 타입을 선언하지 않는다. 객체 생성 시 오직 한 번만 호출 20 예제 3–3.
2 개의 생성자를 가진 Circle 클래스
21 객체 생성 및 생성자 실행 과정 Circle donut; Circle pizza(30); Circle 클래스
22 기본 생성자 생성자는 꼭 있어야 하는가? 개발자가 클래스에 생성자를 작성해 놓지 않으면? 기본 생성자란? 예
23 기본 생성자가 자동으로 생성되는 경우 생성자가 하나도 작성되어 있지 않은 클래스의 경우 컴파일러가 기본 생성자 자동 생성
24
Circle 클래스에 생성자가 선언되어 있기 때문에, 컴파일러는 기본 생성자를 자동 생성하지 않음 25 예제 3-4(실습) – Rectangle 클래스 만들기 26 예제 3-4 정답 #include <iostream> using namespace std;
27 소멸자 소멸자 객체가 소멸되는 시점에서 자동으로 호출되는 함수 오직 한번만 자동 호출, 임의로 호출할 수 없음 28 소멸자
특징 소멸자의 목적 소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙인다. 29 예제 3-5 Circle 클래스에 소멸자 작성 및 실행
30
생성자/소멸자 실행 순서 객체가 선언된 위치에 따른 분류 객체 생성 순서 객체 소멸 순서 31 예제 3-6 지역 객체와 전역 객체의 생성 및 소멸 순서
32 예제 3-6의 지역 객체와 전역 객체의 생성과 소멸 과정 33 접근 지정자(Access Specifier)
34 중복 접근 지정과 디폴트 접근 지정 접근 지정의 중복 가능 접근 지정의 중복 사례 디폴트 접근 지정은 private
35 멤버 변수는 private으로 지정하는 것이 바람직
36 예제 3–7 다음 소스의 컴파일 오류가 발생하는 곳은 어디인가?
37 함수 호출에 따른 시간 오버헤드 돌아올 리턴 주소 저장 CPU 레지스터 값 저장 함수의 매개 변수를 스택에 저장 함수 호출 함수 실행 돌아갈 주소를 알아내어 리턴 저장한 레지스터 값 CPU에 복귀 함수의 리턴 값을 임시 저장소에 저장 함수
호출에 따른 시간 오버헤드 작은 크기의 함수를 호출하면, 함수 실행 시간에 비해, 호출을 위해 소요되는 부가적인 시간 오버헤드가 상대적으로 크다. 38
10000번의 함수 호출. 호출에 따른 엄청난 오버헤드 시간이 소모됨. 39 인라인 함수 인라인 함수 인라인 함수에 대한 처리 인라인 함수의 목적 inline 키워드로 선언된 함수 40 인라인 함수 사례 #include <iostream> using namespace std;
41 인라인 함수 장단점 및 자동 인라인 장점 단점 프로그램의 실행 시간이
빨라진다.
42 자동 인라인 함수 자동 인라인 함수 : 클래스 선언부에 구현된 멤버 함수 inline으로 선언할 필요 없음
43 C++ 구조체 C++ 구조체 C++에서 구조체를 수용한 이유? 구조체 객체 생성
44 구조체와 클래스의 디폴트 접근 지정 비교 struct Circle { Circle(); Circle(int r);
45 예제 3-8 Circle 클래스를 C++ 구조체를 이용하여 재작성
46 바람직한 C++ 프로그램 작성법 클래스를 헤더 파일과 cpp 파일로 분리하여 작성 목적 클래스마다 분리 저장 클래스 선언 부
47 예제3-3의 소스를 헤더 파일과 cpp 파일로 분리하여 작성한 사례
48 헤더 파일의 중복 include 문제 헤더 파일을 중복 include 할 때 생기는 문제
49 헤더 파일의 중복 include 문제를 조건 컴파일로 해결 50 include 됨 circle.h main.cpp circle.cpp 컴파일 circle.obj main.obj
링킹 51 헤드파일 분리 52 main.cpp circle.cpp circle.h
53 예제 3–9 헤더 파일과 cpp 파일로 분리하기 아래의 소스를 헤더 파일과 cpp 파일로 분리하여 재작성하라. 54 분리 전 실행 예
55 예제 3-9 정답 Adder.h Calculator.h #ifndef ADDER_H #define ADDER_H 56 57 Open Challenge 3. 지수표현 클래스 만들기 58 실행결과
59 Exp.h 설계 exp.h #ifndef EXP_H #define EXP_H class Exp { int exp; // 지수부 60 exp.cpp #include "exp.h" int
Exp::getValue() { int res=1; for(int i=0; i<exp; i++) res = res*base; return res; } bool Exp::equals(Exp b) { if(getValue() == b.getValue()) return true; else return false; 61 실습문제
9. Box 클래스 작성하기(파일분리)
62 Box::Box(int w, int h) { setSize(w, h); fill = '*'; }
void Box::setFill(char f) { fill = f; void Box::setSize(int w, int h) { width = w; height = h; void Box::draw() { for(int n=0; n<height; n++) { for(int m=0; m<width; m++)cout << fill; cout << endl;
63 int main() { Box b(10, 2); b.draw(); cout << endl; b.setSize(7, 4); b.setFill('^'); }
64 실습문제 3. Random 클래스 작성 65
main.cpp #include <iostream> #include “Random.h” 66 #include <ctime> |