[객체지향 윈도우즈 프로그래밍]중간고사 시험 정리
류명운
·2015. 4. 21. 03:14
1장 객체지향 프로그래밍
* 소프트웨어란? -> Program + Data + Document
* Document에서 중요도-> 메뉴얼<소스코드<설계도(UML)
* 소프트웨어의 위기: 공급과 수요가 불일치함->소프트웨어 공학 등장(그 중 하나가 재사용성을 극대화 하겠다는 ‘객체지향기술’)
★1. 소프트웨어 위기의 원인 (주요원인: 공급과 수요의 불일치)
- 결정적인 발전 없이 느리고 점진적인 변화
- 개발 기술의 낙후 및 부족한 전문 인력
- 개발 예산과 일정을 설정하기 어려움
- 사용자의 요구에 못 미침
- 품질개선이 안됨
- 유지보수가 어려움
★2. 소프트웨어 위기 극복의 방법(노력)
- 스파게티 코드를 자제함
- 모듈화 프로그램
- 구조적 프로그래밍
- 4세대 언어(비 절차적 언어)
- (재사용성 향상)소프트웨어 공학
- (재사용성 향상)객체지향 기술
- (재사용성 향상)컴포넌트 기반 기술
3. C와 C++ 프로그래밍 구조 비교
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 유형의 멤버변수 email을 Email 클래스에 추가하시기 바랍니다. (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){ } |
|
'삶의 늪에 들어 가기 전 > 정리중(미정리)' 카테고리의 다른 글
[데이터베이스 프로그래밍]중간고사 시험정리 (4) | 2015.04.22 |
---|---|
[세계문명과 기독교1]중간고사 시험 정리 (2) | 2015.04.22 |
[한국성서대학교/한국성서대 묵상지] 8주차 묵상지 (중간고사) (5) | 2015.04.20 |
[운영체제]중간고사 시험 정리 (0) | 2015.04.19 |
[소프트웨어공학]Use Case 정리 (0) | 2015.04.18 |