반응형

언어 자료구조 알고리즘 1251

[C++] 44. 상속과 다형성 최종 실습 - 코드

상속과 다형성 최종 실습한 코드예요. //StuConst.h #pragma once class StuConst { public: static const int def_iq; static const int max_iq; static const int min_iq; static const int def_hp; static const int max_hp; static const int min_hp; static const int def_stress; static const int max_stress; static const int min_stress; static const int def_scnt; static const int max_scnt; static const int min_scnt; private:..

[C++] 43. 상속과 다형성 최종 실습 - 파생 클래스

이제 파생 형식인 학사 학생, 운동학생, 마법학생과 진입점 main 부분을 구현합시다. 먼저 학사 학생 클래스에 필요한 멤버들을 고민해 보기로 해요.class SStudent : public Student{학사 학생은 더미 뇌가 멤버 필드로 필요합니다. int dummy;그리고 더미 뇌는 공부한 횟수가 5이 배수일 때마다 1씩 증가해야 하므로 공부한 횟수도 기억해야죠. int total_scnt;public: SStudent(string name); “공부하다.”, “강의받다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.” 메서드를 재정의해야겠죠. virtual void Study(); virtual void ListenLecture(); virtual void Sleep(); vir..

[C++] 42. 상속과 다형성 최종 실습 - 학생

이제 상속과 다형성의 마지막 실습 시나리오를 보고 설계 및 구현해 보기로 해요. 시나리오를 보면 정의할 형식은 학생, 학사 학생, 운동학생, 마법학생이 있습니다. 학생을 기반 클래스로 정의하고 나머지 클래스는 파생 클래스로 정의하면 되겠죠.먼저 학생 클래스에 필요한 멤버들을 고민해 보기로 해요. 학생 클래스는 멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스와 연속으로 공부한 횟수가 필요합니다.그리고 주민번호를 순차적으로 부여하기 위해서는 정적 멤버로 가장 최근에 부여한 주민번호가 필요하겠죠. 그리고 멤버 메서드로 “공부하다.”, “자습하다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.”가 필요합니다. 그리고 이들 메서드는 파생 형식에 따라 멤버 필드를 변경하는 값이 달라서 순수 ..

[C++] 41. 상속과 다형성 최종 실습 시나리오

이제 상속과 다형성의 마지막 실습이예요. 다음의 시나리오를 보고 직접 클래스 다이어그램도 작성해 보고 구체적으로 구현해 보세요. 시나리오프로그램이 시작하면서 학사 학생과 운동 학생, 마법 학생을 한 명씩 생성학생을 생성 후 전체 학생에게 강의=>자습=>잠자기=>휴식하기=>음료마시기=>노래하기 순으로 진행(각 단계마다 학생 정보를 출력)자습하기에서는 해당 학생이 학사 학생이면 독서도 지시함휴식하기에서는 해당 학생이 마법 학생이면 여행도 지시함노래하기에서는 해당 학생이 운동 학생이면 춤추게 지시함 1. 학생멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스가 있음주민번호: 순차적 부여 이름: 생성 시 전달 지력:100(최소 0, 최대 200) 체력: 100 (최소 0, 최대 200) 스트레스: 0 (최소 ..

[C++] 40. 상속과 다형성 실습2 (도형)

이번 실습은 도형을 소재로 할게요. 위 그림은 Visual Studio에서 제공하는 기능을 사용하여 출력한 클래스 다이어그램입니다. 시나리오 1. 도형 도형 ID를 순차적으로 부여합니다. 순수 가상 메서드로 Draw 메서드를 제공합니다. 파생 형식에서도 접근 가능한 GetID 접근자를 제공합니다. 2. 점 x와 y 좌표 멤버를 갖습니다. 생성자에서 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 3. 선 두 개의 점을 멤버로 갖습니다. 생성자에서 두 점의 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 여러분께서 먼저 작성해 본 후에 비교해 보세요. 작성하다 막히면 앞에 상속과 다형성에 관한 내용을 보시면서 하시기 바랍니다. 여기에 작성한 것을 보면서 그대로..

[C++] 39. 상속, 다형성 실습1 (상품, 할인 상품)

이제 상속과 다형성 실습을 해 봅시다. 이번 실습은 상품을 소재로 할게요. 시나리오 1. 상품 상품 이름과 가격을 멤버 필드로 갖습니다. 생성할 때 이름과 가격을 입력 인자로 받습니다. 가격과 이름의 접근자를 제공하며 가격 접근자는 가상 메서드입니다. 상품 정보를 출력하는 가상 메서드를 제공합니다. 형식 내부에서만 접근 가능한 가격 설정자와 이름 설정자가 있습니다. 2. 할인 상품 할인율을 멤버 필드로 갖습니다. 상품 이름과 가격, 할인율을 입력 인자로 받습니다. 가격 접근자와 상품 정보 출력하는 메서드를 재정의합니다. 할인율의 접근자 메서드를 제공합니다. 형식 내부에서만 접근할 수 있는 할인율 설장자가 있습니다. 여러분께서 먼저 작성해 본 후에 비교해 보세요. 작성하다 막히면 앞에 상속과 다형성에 관한..

[C++] 38. C++에서의 형 변환

이번에는 C++언어에서 제공하는 형 변환에 관해 살펴보기로 해요. 이 부분은 OOP 특징은 아니지만 앞에서 dynamic_cast를 사용하는 방법을 소개하여 다른 형 변환도 알아보려는 거예요. 먼저 C++ 언어에서도 강제 형변환(명시적 형변환이라고도 부름)을 제공하고 있습니다. 하지만 강제 형변환은 잘못 사용하면 심각한 버그를 유발할 수 있습니다. 다음은 서로 관련이 없는 Man 클래스와 Student 클래스를 정의한 후에 강제 형변환을 사용하는 예제입니다. 컴파일 오류는 발생하지 않지만 프로그램 동작 중에 버그로 런 타임 오류가 발생할 수 있습니다. //강제 형 변환이 갖는 위험 요소#include #include using namespace std; class Man{ string name;publi..

[C++] 37. 하향 캐스팅(dynamic_cast)

이번에는 기반 형식 포인터 변수로 참조하고 있는 형식을 프로그램 동작 시에 파생 형식으로 형 변환하는 하향 캐스팅을 알아보기로 해요. 다형성은 캡슐화와 상속을 보다 효과적이고 현실 세계에 근접하게 표현할 수 있게 해주는 특징입니다. 하지만 기반 클래스 형식 포인터 변수로 파생 개체를 관리하는 것은 치명적인 단점이 있습니다. 만약 기반 클래스 형식에서는 약속할 필요가 없는 메서드가 파생 클래스 형식에 있을 때 해당 메서드의 접근 수준을 public으로 제공해도 접근하지 못합니다. 이러한 약점을 보완하기 위해 많은 OOP언어에서는 런 타임에 파생 개체 형식으로 형 변환(캐스팅)하는 방법을 제공하고 있으며 이를 하향 캐스팅이라 합니다. C++언어에서는 dynamic_cast를 통해 하향 캐스팅을 제공하고 있습..

[C++] 36. 다중 상속

이번에는 여러 개의 기반 형식에서 파생하는 형식을 정의하는 다중 상속을 살펴볼게요. C++언어에서는 기반 형식을 여러 개를 정의하는 다중 상속을 지원합니다. 많은 이들은 다중 상속을 사용할 때 주의하라고 권하거나 아예 다중 상속을 사용하지 말 것을 권합니다. 실제 Java나 C#에서는 여러 개의 기반 클래스에서 파생하는 형식을 정의하는 문법을 제공하지 않습니다. C++보다 나중에 만들어진 이들 언어에서는 C++언어의 다중 상속 문법의 위험을 알고 난 이후에 만들어져서 이러한 문법을 제외하고 있습니다. 그렇지만 Java나 C#에서도 여러 개의 인터페이스를 기반으로 파생한 형식을 정의하는 문법은 제공하고 있습니다. 여기에서는 C++언어에서 제공하는 다중 상속이 어떠한 위험을 갖고 있는지 살펴보고 Java나 ..

[C++] 35. 인터페이스 (INTERFACE)

이번에는 인터페이스(interface)를 살펴볼게요. 인터페이스는 특정 기능을 구현할 것을 약속한 추상 형식을 말합니다. Java나 C# 등의 다른 OOP언어에서는 인터페이스 형식을 제공합니다. C++언어에서는 인터페이스 형식을 제공하지는 않지만 순수 가상 메서드를 이용하여 정의할 수 있습니다. 인터페이스는 멤버 필드나 구체적으로 구현한 메서드를 갖지 않고 특정 기능을 약속한 메서드만 갖습니다. 그리고 모든 멤버는 사용하는 개발자와의 약속으로 모든 멤버를 public으로 접근 지정합니다. C++언어에서는 구조체는 디폴트 가시성이 public이어서 구조체를 이용하여 인터페이스를 정의하는 이들도 많습니다. #define interface struct interface IPlay //구조체는 디폴트 가시성 {..

반응형