chapter 04. 클래스의 완성

31
Chapter 04. 클클클클 클클 C++ 클클클클클

Upload: amy-daugherty

Post on 01-Jan-2016

79 views

Category:

Documents


4 download

DESCRIPTION

C++ 프로그래밍. Chapter 04. 클래스의 완성. C++ 프로그래밍. Chapter 04-1. 정보은닉. 정보은닉의 이해. 정보은닉 실패. 정보은닉 실패. 예제에서 보이듯이 멤버변수의 외부접근을 허용하면 , 잘못된 값이 저장되는 문제가 발생할 수 있다 . 따라서 멤버변수의 외부접근을 막게 되는데 , 이를 가리켜 정보은닉 이라 한다. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Chapter 04.  클래스의 완성

Chapter 04. 클래스의 완성

C++ 프로그래밍

Page 2: Chapter 04.  클래스의 완성

Chapter 04-1. 정보은닉

C++ 프로그래밍

Page 3: Chapter 04.  클래스의 완성

3

정보은닉의 이해

예제에서 보이듯이 멤버변수의 외부접근을 허용하면 , 잘못된 값이 저장되는 문제가 발생할 수 있다 . 따라서 멤버변수의 외부접근을 막게 되는데 , 이를 가리켜 정보은닉이라 한다 .

정보은닉 실패

정보은닉 실패

Point 의 멤버변수에는 0~100 이외의 값이 들어오는 것을 막는 장치가 없고 , Rectangle

의 멤버변수에는 좌우 정보가 뒤바뀌어 저장되는 것을 막을 장치가 없다 .

Page 4: Chapter 04.  클래스의 완성

4

Rectangle 객체의 이해

객체도 다른 객체의 멤버가 될 수 있다 .

Page 5: Chapter 04.  클래스의 완성

5

Point 클래스의 정보은닉 결과

정보은닉 !클래스의 멤버변수를 private 으로 선언하고 , 해당 변수에 접근하는 함수를 별도로 정의해서 , 안전한 형태로 멤버변수의 접근을 유도하는 것이 바로 ‘정보은닉’이며 , 이는 좋은 클래스가 되기 위한 기본조건이다 !

벗어난 범위의 값 저장을 원천적으로 막고 있다 !

정보은닉으로 인해서 추가되는 엑세스 함수들 !

함수만 한번 잘 정의되면 잘못된 접근은 원천적으로 차단된다 !

정보은닉을 하지 않는다면 , 접근할 때마다 주의해야 한다 !

Page 6: Chapter 04.  클래스의 완성

6

Rectangle 클래스의 정보은닉 결과

좌 상단과 우 하단이 바뀌는 것을 근본적으로 차단 !

Page 7: Chapter 04.  클래스의 완성

7

const 함수

멤버함수의 const 선언

const 함수는 클래스 멤버변수의 값을 변경하지 못한다 !

const 함수는 const 가 아닌 함수를 호출하지 못한다 !

간접적인 멤버의 변경 가능성까지 완전히 차단 !

GetNum 이 const 선언되지 않았다고 가정 !

const 로 상수화 된 객체를 대상으로는 const

멤버함수만 호출이 가능하다 !

이 둘은 멤버함수입니다 .

Page 8: Chapter 04.  클래스의 완성

Chapter 04-2. 캡슐화

C++ 프로그래밍

Page 9: Chapter 04.  클래스의 완성

캡슐화 (Encapsulation)

클래스 멤버 일부에 대한 외부로부터의 접근을 제한함Restricting access to some of the object's compo-

nents

데이터 ( 멤버변수 ) 를 그 데이터를 조작하기 위한 함수( 멤버함수 ) 들과 함께 묶어 놓음Bundling of data with the methods (or other func-

tions) operating on that data

기본개발자과정 - 자바강원대학교9

Page 10: Chapter 04.  클래스의 완성

Chapter 04-3. 생성자와 소멸자

C++ 프로그래밍

Page 11: Chapter 04.  클래스의 완성

11

생성자의 이해

클래스의 이름과 동일한 이름을 가지며반환형을 갖지 않는다 ( 아무 값도 반환하지 않음 ).

생성자는 객체 생성시 딱 한번 호출되며 메모리 할당과 멤버변수의 초기화에 사용된다 .

오버로딩이 가능하고 디폴트 값 설정이 가능하다 .

전역변수 , 지역변수 , 매개변수 동적 메모리 할당

Page 12: Chapter 04.  클래스의 완성

12

생성자 오버로딩 ( 다중정의 )

매개변수의 디폴트 값 설정이 가능하다 .

Page 13: Chapter 04.  클래스의 완성

13

Point, Rectangle 클래스에 생성자 적용

초기화

초기화

Page 14: Chapter 04.  클래스의 완성

14

멤버 이니셜라이저

이니셜라이저의 실행을 포함한 객체 생성의 과정

Page 15: Chapter 04.  클래스의 완성

15

이니셜라이저를 이용한 변수 및 상수의 초기화

멤버변수의 초기화 가능이 경우 , 선언과 동시에 초기화되는 형태로 실행코드가 구성됨즉 , 다음의 형태로 멤버변수가 선언과 동시에 초기화된다고 볼 수 있다 .

int num1 = n1;

따라서 const 로 선언된 멤버변수도 초기화가 가능하다 .

선언과 동시에 초기화 되는 형태이므로 ...

Page 16: Chapter 04.  클래스의 완성

16

참조자를 멤버변수로 선언하기

이니셜라이저의 초기화는 선언과 동시에 초기화 되는 형태이므로 ,

참조자의 초기화도 가능하다 !

int main(void){

AAA obj1;BBB obj2(obj1, 20);obj2.ShowYourName();return 0;

}

Page 17: Chapter 04.  클래스의 완성

17

디폴트 생성자

생성자를 정의하지 않으면 인자를 받지 않고 , 하는 일이 없는 디폴트 생성자라는 것이 컴파일러에 의해서 추가된다 .

따라서 모든 객체는 무조건 생성자의 호출 과정을 거쳐서 완성된다 .

Page 18: Chapter 04.  클래스의 완성

18

생성자 불일치

생성자가 있는 경우에는 , 디폴트 생성자가 자동으로 추가되지 않는다 .

따라서 인자 없이 생성자를 호출하는 것은 불가능하다 .

이 형태로 객체 생성이 가능하기 위해서는 다음 형태의 생성자를 별도로 추가해야 한다 .

SoSimple( ) : num(0) { }

Page 19: Chapter 04.  클래스의 완성

19

private 생성자

생성자가 private 이므로 클래스 외부에서는 이 생성자의 호출을 통해서 객체 생성이 불가능하다 .

클래스 내부에서는 private 생성자의 호출이 가능하다 .

AAA 클래스의 멤버함수 내에서도 AAA 클래스의 객체 생성이 가능하다 !

생성자가 private 이라는 것은 외부에서의 객체 생성을 허용하지 않겠다는 뜻이다 !

int main(void){

AAA base;base.ShowNum();

AAA &obj1=base.CreateInitObj(3);obj1.ShowNum();

AAA &obj2=base.CreateInitObj(12);obj2.ShowNum();

delete &obj1;delete &obj2;return 0;

}

Page 20: Chapter 04.  클래스의 완성

20

소멸자 (Destructor) 의 이해

AAA 클래스의 소멸자 !

객체 소멸 시 자동으로 호출된다 .

소멸자를 정의하지 않으면 디폴트 소멸자가 삽입된다 .

Page 21: Chapter 04.  클래스의 완성

21

소멸자의 활용

생성자에서 할당한 메모리 공간을 반납하는 데 사용

Page 22: Chapter 04.  클래스의 완성

Chapter 04-4. 클래스와 배열 그리고 this 포인터

C++ 프로그래밍

Page 23: Chapter 04.  클래스의 완성

23

객체 배열과 객체 포인터 배열

Person arr[3];

Person * parr=new Person[3];

Person * arr[3];

arr[0]=new Person(name,

age );

arr[1]=new Person(name,

age );

arr[2]=new Person(name,

age );

객체 배열 ! 객체로 이뤄진 배열 !

배열 생성시 객체가 함께 생성된다 .

이 경우 호출되는 생성자는 void 생성자

객체 포인터 배열 !

객체를 가리킬 포인터 변수로 이뤄진 배열 !

별도의 객체생성 과정을 거쳐야 한다 .

객체 관련 배열을 선언할 때에는 객체 배열을 선언할지 , 아니면 객체 포인터 배열을 선언할지를 먼저 결정해야 한다 .

Page 24: Chapter 04.  클래스의 완성

24

this 포인터의 이해

실행결과

this 포인터는 this 가 사용된 객체 자신을 가리키는 주소이다 .

Page 25: Chapter 04.  클래스의 완성

25

this 포인터의 활용

this->num1 은 멤버변수 num1 을 의미한다 .

num1 은 매개변수를 의미한다 .

Page 26: Chapter 04.  클래스의 완성

26

Self-reference 의 반환

실행결과

Page 27: Chapter 04.  클래스의 완성

27

확인문제

C4-1

P. 177 Rectangle 클래스를 참고하여 Line 클래스를 작성하고 적절한 main 함수를 작성하시오 . Point 클래스는 기존의 것을 그대로 사용합니다 .

Page 28: Chapter 04.  클래스의 완성

28

실습문제 P4-1 181 쪽 FruitSaleSim3 프로그램에 다음 조건을 추가하시오 .

1 인당 최대 과일 구매 개수는 50 개로 한정되어 있음 과일장수는 과일 10 개 당 1 개를 덤으로 줌

P4-2 177 쪽 Rectangle 클래스를 참고하여 Triangle 클래스를 작성하고 적절한 main 함수를 작성하시오 .

Page 29: Chapter 04.  클래스의 완성

29

실습문제 P4-3 190 쪽 문제 04-3 의 문제 2 의 NameCard 클래스에 다음

멤버함수를 추가하고 main 함수에서 이들을 사용하도록 수정하시오 . char *GetPhone();

전화번호를 반환하는 멤버 함수 void SetPhone(cchar *phone);

전화번호를 설정하는 멤버 함수 P4-4 다음 조건을 만족하는 Temperature 클래스와 구동 프로그램을

작성하시오 . [ 클래스 이름 ]

Temperature [ 멤버 변수 ]

kelvin: 캘빈 온도를 저장 [ 멤버 함수 ]

SetTempK, GetTempK: 캘빈 온도를 저장하고 얻어오는 함수 SetTempF, GetTempF: 화씨 온도를 캘빈 온도로 저장하고 , 화씨 온도로 얻어오는 함수 SetTempC, GetTempC: 섭씨 온도를 캘빈 온도로 저장하고 , 섭씨 온도로 얻어오는 함수

Kelvin = Celsius + 273.15Celsius = (5/9)*(Fahrenheit-32)

Page 30: Chapter 04.  클래스의 완성

30

실습문제 P4-5 192 쪽 프로그램에서 Person 클래스는 이름과 나이 등 두 개의

멤버 변수를 가지고 있습니다 . 이를 수정하여 이름과 나이 외에 친구를 멤버 변수로 추가하시오 . 친구는 Person 타입이어야 합니다 . 프로그램의 나머지 부분도 이에 따라 적절히 변경하시오 .

P4-6 위 P4-5 프로그램을 194 쪽 프로그램처럼 객체 포인터의 배열을 사용하도록 수정하시오 .

Page 31: Chapter 04.  클래스의 완성

Chapter 04 가 끝났습니다 . 질문

있으신지요 ?