반응형

분류 전체보기 2946

[C++] 무효화

5.2 무효화 파생을 이용해서 일반화 관계를 형성했을 때 파생 클래스에서 기반 클래스에 정의한 이름과 같은 이름으로 메서드를 만들면 기반 클래스에 정의한 메서드는 무효화가 됩니다. 기반 클래스에 있는 멤버 메서드들 중에 구체적인 구현을 다르게 하고자 한다면 무효화를 이용하면 가능합니다. 만약, 일반 프로그래머가 있고 EH 프로그래머가 있는데 대부분의 행위에 있어 EH 프로그래머는 일반 프로그래머와 같게 일을 한다고 가정을 합시다. 하지만 일반 프로그래머가 프로그래밍을 할 때 "생각하면서 코딩을 한다."와 같이 하는데 EH 프로그래머가 프로그래밍을 할 때는 "생각한 것을 문서화 하고 이를 보면서 코딩을 한다."고 해 볼께요. 이 경우에 일반 프로그래머의 프로그래밍이라는 메서드는 무효화가 됩니다. 무효화의 ..

[C++] 파생 개체 생성 과정 및 초기화

5.1.2 파생 개체 생성 과정 및 초기화 파생 개체가 생성될 때는 먼저 기반 클래스 부분이 형성된 후에 파생 클래스 부분이 형성됩니다. 즉, 기반 클래스의 생성자 메서드가 수행된 후에 파생 클래스의 생성자 메서드가 수행됩니다. 그리고 파생 개체가 소멸될 때는 역으로 파생 클래스의 소멸자 메서드가 수행되고 나서 기반 클래스의 소멸자 메서드가 수행됩니다. 만약, 기반 클래스에 입력 매개 변수가 없는 생성자(기본 생성자)가 정의되지 않고 매개 변수가 있는 생성자만 정의된 경우에는 파생 개체가 생성될 때 어떻게 될까요? 파생 개체가 생성되기 위해선 기반 클래스의 생성자 메서드 부분이 수행이 되어야 하는데, 인자를 어떤 값으로 전달할 것인지 컴파일러가 결정하지 못합니다. 이 경우에 파생된 클래스의 소스 코드에서..

[C++] 일반화 관계와 파생

5.1 일반화 관계 일반화 관계는 음악가와 피아니스트처럼 “피아니스트는 음악가이다.”라는 논리적 관계를 형성하는 관계를 말합니다. C++에서는 이와 같은 관계를 효과적으로 사용할 수 있도록 파생에 관련한 문법을 제공하고 있으며 이러한 특징은 OOP의 상속에 속합니다. [그림 5.1] 5.1.1 일반화 관계와 파생 C++에서 일반화 관계를 표현할 때 파생에 관련된 문법을 이용합니다. 파생을 표현할 때는 파생 클래스에서 어느 클래스를 기반 클래스로 할 것인지를 다음과 같이 명시하면 됩니다. class Derived : public Base{}; 파생을 표현할 때 기반 클래스의 접근 지정된 것을 파생된 것에서 그대로 계승하고자 할 때 public 키워드를 명시하면 기반 클래스의 각 멤버의 접근 지정도 동일하게..

[C++] 실현관계 (Realization)

4. 5 실현관계 (Realization) 실현관계는 추상적으로 행위에 대한 약속만 정의하고 이를 기반으로 약속된 행위를 구체적으로 정의할 경우에 약속하는 형식과 구체적 정의를 하는 형식 간의 관계입니다. 여기에서 행위에 대한 약속을 정의한 추상 형식을 인터페이스라 부르며 인터페이스를 구현 약속하는 클래스와의 관계를 실현관계라 합니다. 이때 약속된 행위는 묵시적으로 접근 지정자가 public입니다. [그림 4.10] C++ 언어에서는 행위에 대한 추상적인 약속은 순수 가상 함수를 형식 내에 캡슐화하는 방식으로 할 수 있습니다. 순수 가상 함수를 형식 내에 캡슐화할 때에는 virtual 키워드를 앞에 붙이고 메서드 뒤에 =0;를 명시하면 됩니다. 그리고 소스 코드에서 해당 형식에 대한 구체적 구현은 하지 ..

[C++] 의존 관계 (Dependency)

4. 4 의존 관계 (Dependency) 학생과 시험에서처럼 "학생의 성적은 시험 문제의 난이도에 영향을 받는다." 와 같이 특정 개체에 따라 특정 행위에 영향이 생기는 관계를 얘기합니다. 그리고 공장과 상품처럼 "공장에 상품을 주문하면 상품을 생산한다." 와 같이 특정 형식의 개체 생성을 책임질 때에도 의존 관계로 표시합니다. [그림 4.8] 먼저, 학생이 시험을 보았을 때 성적이 시험의 난이도에 영향을 받는 경우의 예제 코드를 살펴봅시다. Stu.cpp #include "Stu.h" Stu::Stu(string _name) { name = name; score = -1; } Stu::~Stu(void) { } void Stu::TestAnExamination(Examination *ex) { sco..

[C++] 연관(Association) 관계와 직접 연관(Directed Association) 관계

4. 3 연관(Association)와 직접 연관(Directed Association) 약사와 의사처럼 "약사와 의사는 환자 치료에 연관이 있다."와 같이 수평적인 관계를 연관 관계라 한다. [그림 4.6] 예제에서는 의사가 먼저 치료하고 약사가 조재하거나 약사가 먼저 조재하고 의사가 치료하는 예를 들어보도록 하겠습니다. 의사에게 먼저 치료를 수행시킬 때 약사를 입력 인자로 전달하면 치료를 하는 멤버 메서드에서 약사의 조재하다를 호출하면 사용자는 의사의 치료하다만 호출하더라도 자동으로 약사의 조재하다도 수행되게 됩니다. 이처럼 하나의 개체의 메서드에 다른 개체를 인자로 넘기고 인자로 받은 개체의 메서드를 호출해야 수행되는 것을 더블 디스패치라고 합니다. 이처럼 특정 목적을 수행하기 위해 더블 디스패치를..

[C++] 집합(Aggregation)관계와 구성(Composition) 관계

4. 2 집합(Aggregation) 과 구성(Composition) 학생과 책의 관계처럼 "철수라는 학생은 책을 가지고 있다."라는 논리적 관계를 집합이라 합니다. 집합 관계에서는 소유 개체와 피 소유 개체의 생성 시기와 소멸 시기가 같지 않아도 됩니다. 이와 같은 관계에서 대부분 소유 개체가 피 소유 개체의 메서드를 호출하여 명령하는 직접 연관 관계가 존재하는 경우와 단순히 피 소유 개체들을 보관하는 집합체일 수 있습니다. 집합체일 경우에는 집합 관계만 표시하겠지만 직접 연관 관계가 존재하는 경우에는 집합 관계와 직접 연관 관계도 같이 표현하는 것이 좀 더 정확한 표현입니다. [그림 4.2]는 집합 관계만 있는 경우이고 [그림 4.3]은 집합 관계에 직접 연관 관계도 있는 경우입니다. [그림 4.2]..

[C++} 4. 1 일반화 (Generalization) 관계

4. 클래스간의 관계 프로그래밍 개발 공정에서 설계 단계에서는 사용자가 정의하는 형식들 사이에 관계를 정의하는 작업이 수반됩니다. 이번 장에서는 사용자가 정의하는 형식 클래스 간의 관계에 관해 얘기를 하려고 합니다. 4. 1 일반화 (Generalization) 음악가와 피아니스트와 같이 "피아니스트는 음악가이다."라는 논리적 관계를 형성하는 관계를 일반화 혹은 파생 관계(Derivation)라 합니다. 이와 같은 일반화 관계에 있을 때 기반이 되는 클래스에 정의되어 있는 멤버를 파생 클래스에서는 상속을 받게 되며 OOP의 중요한 특징 중의 하나라고 할 수 있습니다. [그림 4.1] 이러한 일반화 관계에 대한 자세한 설명은 5장에서 설명을 하기로 하고 여기에서는 간단한 언급만 하기로 하겠습니다. 다음의 ..

[C++] 캡슐화 실습 소스 코드

캡슐화 실습 소스 코드 Stu.cpp #include "Stu.h" int Stu::last_num; Stu::Stu(string _name):num(SetStuNum()) { name = _name; hp = StuProperty::def_hp; iq = StuProperty::def_iq; stress = StuProperty::def_stress; scnt = StuProperty::def_scnt; } void Stu::Dance() { SetIq(GetIq()+3); SetHp(GetHp()-30); SetStress(GetStress()-20); SetSCnt(0); } void Stu::Drink() { SetIq(GetIq()-4); SetHp(GetHp()-20); SetStress(Ge..

[C++] 캡슐화 실습 - 멤버 메서드 구현

3. 5 멤버 메서드 구현 이제 Stu 클래스에 멤버 메서드들을 약속에 따라 구현을 하는 작업을 수행해 봅시다. 여기에서는 멤버 메서드들 중에 번호를 자동 부여하기 위한 부분과 상수 멤버 메서드를 구현하는 부분, 나머지 부분으로 나누어서 설명하려고 합니다. 여러분께서는 각 부분을 구현해 보고 각 부분에 대한 설명을 살펴보시고 참고하십시오. 3.5.1 번호 자동 부여하기 구현 Stu 클래스에서는 정적 멤버인 last_num 멤버 필드가 가장 최근에 생성한 학생 번호를 가지고 있습니다. 이를 이용해서 번호를 부여하면 될 것입니다. 그런데 Stu 개체의 번호에 해당하는 num 멤버 필드는 상수 멤버 필드로 약속하여 생성자 메서드의 초기화 기법을 이용해야 합니다. 여기에서는 부여할 번호를 반환하는 정적 메서드를..

반응형