[객체지향 윈도우즈 프로그래밍]중간고사 시험 정리

류명운

·

2015. 4. 21. 03:14

반응형


객체지향프로그래밍 중간고사 정리.hwp

1장 객체지향 프로그래밍

* 소프트웨어란? -> Program + Data + Document

* Document에서 중요도-> 메뉴얼<소스코드<설계도(UML)    

* 소프트웨어의 위기: 공급과 수요가 불일치함->소프트웨어 공학 등장(그 중 하나가 재사용성을 극대화 하겠다는 객체지향기술’)

 

1. 소프트웨어 위기의 원인 (주요원인: 공급과 수요의 불일치)

- 결정적인 발전 없이 느리고 점진적인 변화

- 개발 기술의 낙후 및 부족한 전문 인력

- 개발 예산과 일정을 설정하기 어려움

- 사용자의 요구에 못 미침

- 품질개선이 안됨

- 유지보수가 어려움

 

2. 소프트웨어 위기 극복의 방법(노력)

- 스파게티 코드를 자제함

- 모듈화 프로그램

- 구조적 프로그래밍

- 4세대 언어(비 절차적 언어)

- (재사용성 향상)소프트웨어 공학

- (재사용성 향상)객체지향 기술

- (재사용성 향상)컴포넌트 기반 기술

 

3. CC++ 프로그래밍 구조 비교

C

C++

(구조적) 프로그래밍

(객체지향) 프로그래밍

(기능) 단위로 세분

(오브젝트) 단위

(함수)로 이루어짐

(클래스)로 이루어짐

(중형 프로그램) 작성에 적합

(대형 프로그램) 작성에 적합

 

4. 객체지향 프로그래밍

- 소프트웨어 시스템의 기본 성분은 (객체)이다.

- 객체는 서로 관련되는 (정보)(행위)를 묶어 놓은 일종의 (패키지)이다.

- 객체간의 (상호 작용)은 다른 객체에 (메시지)를 보내고, 그 객체의 응답을 받는 것이 전부이다.

- 객체들은 무엇인가를 얻기 위하여 다른 객체의 모든 것(속성)을 들여다 볼 필요가 없다

- 효율적으로 정보를 관리하기 위하여 사람들이 의미를 부여하고 분류하는 논리적인 단위를 (객체)라 하고, 객체를 생성하는 형판(template)에 해당하는 것을 (클래스)라 하고, (클래스)로부터 생성된 객체를 (인스턴스(instance))라 한다. * 인스턴스: 메모리에 생성된 클래스의 실체

- 정보처리의 주체는 (객체)이며, 객체지향 프로그래밍의 시작은 (클래스의 생성)이다

- (클래스)는 두 개의 구성요소인 (자료구조(필드)) (연산(메소드))을 가진다

 

구조적 방법: 프로그램=자료구조+함수

객체지향 방법: 프로그램=객체+객체+... / 객체=자료구조+함수

객체지향 프로그래밍의 장점

- 유지보수가 용이

- 요구사항의 변화에 쉽게 대처

- 분석과 설계단계로 전이 과정이 쉬움

- 대형 프로젝트에 적합

객체의 구성

- data(속성:변수)

- method(데이터를 조작하는 행위(연산))

- State(객체의 상태)

- Behavior(객체의 행동)

 

5. 메시지의 구성요소: 주소(수신자), 메소드이름(수신객체의 실행할), 매개변수

 

6. 멤버 함수: 메모리에 한번만 로딩, 모든 인스턴스가 공유

멤버 변수: 각 인스턴스마다 독립적으로 생성

지역변수 : 함수 내에서 선언된 변수(함수가 실행되는 동안에만 메모리에 존재, 함수내에서만 사용가능)

전역변수 : 함수 밖에서 선언된 변수(프로그램 시작~종료까지 메모리에 존재, 어떤 함수든 사용가능)

* 전역변수가 많으면 생기는 문제점

- 변수 관리가 어려움(모두 서로 다른 이름을 가져야함)

- 변수 형태를 변경하기 어려움(여러 변수와 함수와 관계를 맺기 때문에)

 

7. 캡슐화(정보 은닉)

- (What)만 보여주고 (How)는 감춘다.

- 객체의 사용자는 기능만 알고 사용하며 어떻게 처리되는지는 은폐된다.

- 클래스는 연관있는 (데이터)(함수)를 함께 묶어 (캡슐화)를 함

- public : 모든 접근을 허용

- protected : 자신의 클래스와 프렌드 클래스, 자식 클래스에서만 접근을 허용한다.

- private(기본값) : 자신의 클래스와 프렌드 클래스에서만 접근을 허용한다.

* 프렌드 클래스 지정법: friend

 

8. 생성자/소멸자 함수 정의시 주의사항 (Point(); / virtual ~Poing();)

- 함수의 이름은 자동으로 결정

- 반환값을 가질 수 없음

- 생성자는 가상함수 정의x, 소멸자는 가상함수로 정의o

- 생성자는 매개변수o, 소멸자는 매개변수x

 

9. 정적변수: 프로그램 시작시 인스턴스 생성, 함수 내에서 선언되면 함수내에서만 호출가능(static int a; )

 

10. 연산자 오버로딩(중복함수)의 규칙

연산자

연산자의 기능

.

구조체나 클래스의 멤버를 지정

*

구조체나 클래스에서 포인터로 가지고 있는 멤버를 지정

::

전역 변수를 참조

? :

주어진 조건에 따라 다른 작업을 수행

 

11. 상속성: 이미 만들어진 클래스에 구현된 모든 특성을 그대로 계승 받아 새로운 클래스를 만드는 것

기반 클래스: 상위 레벨에 있는 클래스

파생 클래스: 기반 클래스를 상속 받아 만들어진 클래스

상속 받는 법: class childClass : public parentClass{ }

 

12. 멤버 함수 재정의(Overriding) -> * 재정의 함수는 반드시 가상함수로 지정해 줄 것!

-> 상속받은 조상 클래스 멤버함수의 개선이 필요할 때 멤버함수의 이름을 그대로 유지하면서 후손 클래스에 적합하도록 기능을 변경하는 것

 

13. 중복함수(Overloading)과 재정의(Overriding)의 구분법(차이점)

중복함수(Overloading)

재정의(Overriding)

함수 이름만 동일

부모함수랑 똑같은 형식(매게변수까지)

 

14. 가상함수(Virtual Function)

함수의 바인딩: 함수를 호출한 부분에 함수가 위치한 메모리 위치를 연결시켜 주는 것

- 정적 바인딩: 컴파일 시 주소가 결정 됨 *컴파일을 하면 실행 파일이 생김

- 동적 바인딩: 실행 시 주소가 결정 됨(다형성지원 / 가상함수별로 4바이트의 메모리를 요구하여 수행속도 저하)

가상함수 사용법: 부모클래스의 함수 선언 앞에 ‘virtual'을 붙여 줌.

 

15. 인라인(inline) 함수

일반 함수는 함수호출시, 호출 위치에서 함수코드가 있는 곳을 가서 함수를 실행하지만,

인라인 함수는 함수를 호출하는 위치마다 함수의 코드를 통째로 복사함(일반함수보다 빠르지만, 전체적인 파일의 크기가 커진다 -> 크기가 작은 함수에 사용하면 좋다)

* #define(매크로)와의 차이점: inline 함수는 타입을 체크 함

* 인라인 함수 사용법

-묵시적인 방법: 헤더에서 정의함

-명시적인 방법: .cpp파일에서 구현되는 함수명 앞에 ‘inline’을 붙여 줌.

 

16. 레퍼런스(특정 변수를 참조하는 변수)

* Call by value: 변수의 값을 복사하여 전달

* Call by reference: 복사본이아닌, 변수 자체를 전달 (전달하는곳:&x , 전달받는곳:*x 사용)

 

17. 템플릿: 클래스의 형태는 유지하면서 멤버변수의 타입만 변경할 때 사용

템플릿 사용법

- template <class type> class Point

- Point <double> dPosition;

 

18. 디폴트 매개변수(함수의 매개변수 값을 디폴트로 정할 수 있음)

- 매개변수의 값에 내용을 안 넣어주면 미리 정해놓은 값으로 지정

ex)void SetDate(int y=200, int m=1, int d=1);

 

19. this 포인터(자기자신(멤버)을 가리 킴/ 사용법:this->x;)

 

20. const (변수 이름 앞이나 함수 이름 뒤‘const’ 키워드를 붙임)

- 속도를 최적화 할 수 있음.

- const함수의 경우 멤버변수의 값 변경 불가능(읽기전용)

중간고사 시험 최종 정리

매개변수로 넘겨 받은 값만큼 메모리를 할당 받도록 하고, 소멸자 함수에서는 할당 받은 메모리를 해제해주기

char *m_pData;

MyData::MyData(int amount){

m_pData = (char *) new char[amount];}

MyData::~MyData(){

delete [ ] m_pData;}

 

1. 개념문제

[1] 소프트웨어의 위기를 극복할 수 있는 가장 좋은 대안은 재사용이다. (2) : O

[2] 과다한 유지보수는 소프트웨어의 위기를 초래한 주요 원인이 되었다. (2) : X

[3] 스파게티 코드, 모듈화 프로그램, 구조적 프로그램, 4세대 언어, 소프트웨어 공학 등은 모두 소프트웨어의 위기를 극복하기 위한 기술이다. (2) : X

[4] 효율적으로 정보를 관리하기 위하여 사람들이 의미를 부여하고 분류하는 논리적인 단위를 (객체)라 하고, 객체를 생성하는 형판(template)에 해당하는 것을 (클래스)라 하고, (클래스)로부터 생성된 객체를 (인스턴스(instance))라 한다.

2. 교수님께서 특정 소스파일을 보여주신 후,

[1]. 중복함수(정의 및 찾기)

->함수명은 같으나 매개변수가 틀린 것

[2]. 소멸자가 호출되는 곳

->delete가 쓰인 곳

[3]. 인라인 함수를 모두 쓰기

->헤더파일 내에 정의 된 함수 및 'inline'이 붙은 함수

[4]. 동적바인딩이 실제로 발생하는 곳

->‘virtual'이 붙은 곳

[5]. xx클래스를 상속받아 cc정보를 더 추가하는 cc클래스를 작성 ->길음.

[6]. protected 접근지정자를 갖고, string 유형의 멤버변수 name를 추가

protected:

string name;

[7]. 추가한 ff에 대한 set/get 함수를 만들기

void setName(string name){ this->name=name;}

string getName(){ return name;}

[8]. 기본 생성자와 매게변수 생성자 만들기

test();

test(string name, int phone);

[9]. 실행결과처럼 보일수 있는 xxshow()를 재정의 (가상함수사용) ->길음.

 

[5~9] Phone 클래스를 상속받고, 이메일 정보를 더 추가하는 Email 클래스를 작성하시기 바랍니다. (15)

a. protected 접근지정자를 갖고, string 유형의 멤버변수 emailEmail 클래스에 추가하시기 바랍니다. (5)

b. 앞서 추가된 email 변수를 위한 setEmail/getEmail 함수를 만드시기 바랍니다. (3)

c. 두 개의 생성자 Email()Email(string name, string phone, string email)를 만드시기 바랍니다. (4)

//-----------------------Email.h파일

#include <iostream>

#include <string>

using namespace std;

 

class Email:public Phone{

protected:

string email;

public:

Email(void);

Email(string name, string phone, string email);

virtual~Email(void);

void setEmail(string email){this->email = email;}

string getEmail(){return email;}

void showDetailInfo(void);

};

//-----------------------Email.cpp파일

#include "Phone.h"

#include "Email.h"

 

Email::Email(void):Phone(){

setEmail("");

}

Email::Email(string name, string phone, string email):Phone(name,phone){

setEmail(email);

}

void Email::showDetailInfo(){

cout << " Email: " << getEmail();

}

Email::~Email(void){

}

d. 실행결과에서처럼 이메일 정보가 보일 수 있도록 showDetailInfo()를 재정의 하시기 바랍니다. (3)

 

반응형