25.08.01 학습개발일지 C++ Study5

2025. 8. 1. 23:36·LMS 7/개발일지

과제5.

스마트폰에서, 모든 전자제품의 전원을 조작을 구현한다고 가정합니다.

#include <iostream>
#include <string>

// 최상위 가전제품 클래스
class ElectronicDevice {
protected:
    std::string name;
    bool powerOn;

public:
    ElectronicDevice(const std::string& deviceName) : name(deviceName), powerOn(false) {}

    void togglePower() {
        powerOn = !powerOn;
        std::cout << name << (powerOn ? " 켜짐o\n" : " 꺼짐x\n");
    }

    std::string getName() {
        return name;
    }
};
// 주방가전 클래스
class KitchenAppliance : public ElectronicDevice {
public:
    KitchenAppliance(const std::string& deviceName) : ElectronicDevice(deviceName) {}
};
// 전자레인지 클래스
class Microwave : public KitchenAppliance {
public:
    Microwave() : KitchenAppliance("전자렌지") {}
};
// 커피머신 클래스
class CoffeeMaker : public KitchenAppliance {
public:
    CoffeeMaker() : KitchenAppliance("캡슐커피") {}
};
// 리모컨 클래스: 단일 기기만 토글 가능하도록 구현
class ControlRemote {
public:
    void togglePower(ElectronicDevice& device) {
        device.togglePower();
    }
};

int main() {
    Microwave microwave;
    CoffeeMaker coffeeMaker;

    ControlRemote remote;

    // 전자레인지, 커피머신 전원 토글 (on)
    remote.togglePower(microwave);
    remote.togglePower(coffeeMaker);

    // 전자레인지, 커피머신 전원 토글 (off)
    remote.togglePower(microwave);
    remote.togglePower(coffeeMaker);

    return 0;
}

 

- 간단한 클래스 다이어그램을 그리고, 소스코드 구조를 분석하고 설명할 것

더보기

 

> ElectronicDevice 클래스(기초 클래스 1)

- proetected

: 멤버변수 name, powerOn를 가지고 있음

- public

: 생성자로 string을 인자로 받아 멤버변수를 초기화함

: void togglePower()은 멤버변수 powerOn에 접근하여 변경하는 함수이다

: std::string getName()은 멤버변수 name에 접근하여 값을 출력하는 함수이다

> KitchenAppliance 클래스(유도 클래스 1, 기초 클래스 2)

- ElectronicDevice를 상속한 클래스임

- public

: 생성자로 string을 인자로 받아 기초 클래스 생성자를 통해 멤버변수를 초기화함

(기초 클래스의 protected 멤버들은 유도 클래스에서 직접 접근할 수 있으므로 기초 클래스 생성자를 이용하지 않고 직접 초기화도 가능함, 하지만 기초 클래스 초기화를 유도 클래스에서 맡는다는 점에서 책임이 섞이게 되어 유지 보수성을 떨어트릴 위험이 있다)

> Microwave 클래스(유도 클래스 2)

- KitchenAppliance를 상속한 클래스임

- public

: 생성자로 아무 인자를 받지 않고, 기초 클래스 생성자를 통해 멤버변수를 초기화함

> CoffeeMaker 클래스(유도 클래스 2)

- KitchenAppliance를 상속한 클래스임

- public

: 생성자로 아무 인자를 받지 않고, 기초 클래스 생성자를 통해 멤버변수를 초기화함

> ControlRemote 클래스

- public

: void togglePower()은 ElectronicDevice형 객체를 인자로 받아(해당 클래스의 유도 클래스들인 KitchenAppliance, Microwave, CoffeeMaker 객체를 모두 받을 수 있다) 해당 객체의 멤버함수인 togglePower를 호출하는 함수이다

> main 함수

- Microwave microwave;

: Microwave형 객체 microwave를 선언

- CoffeeMaker coffeeMaker;

: CoffeeMaker형 객체 coffeeMaker를 선언

- ControlRemote remote;

: ControlRemote형 객체 remote를 선언

- remote.togglePower();

: remote 객체의 멤버함수 togglePower에 객체를 인자로 사용하고 있다.

(위에서 언급한 것처럼 해당 함수는 ElectronicDevice형 객체를 인자로 받는데 해당 클래스의 상속을 받은 클래스형으로 생성된microwave와 coffeeMaker는 인자로 사용될 수 있다.)

 

- 추가로, 현실적인 관점에서, 어떻게 기능이 확장 가능할지, 아이디어를 만들어 제시 할 것

더보기

> 첫번째 아이디어

- 주방가전 클래스에 국한될 것이 아니라 on/off 형태의 기능을 모두 공용으로 사용할 수 있는 가전 클래스를 만든다

(Appliance)

class Appliance : public ElectronicDevice{
    ~
}
class lamp : public Appliance { // Appliance(가전) 클래스를 상속받은 lamp(전등) 클래스
    ~
}

 

> 두번째 아이디어

- on/off 기능 말고도 모든 가전제품이 공유할 수 있는 기능을 최상위 클래스와 리모콘 클래스에 각각 추가한다

ex) on 시간 설정 기능 : 정해진 시간이 지나면 off

#include <iostream>
#include <string>
#include <unistd.h> // sleep 함수 사용을 위한 헤더

// 최상위 가전제품 클래스
class ElectronicDevice {
protected:
    std::string name;
    bool powerOn;
    int powerTime; // 전원이 가동되는 시간(추가사항)

public:
    ElectronicDevice(const std::string& deviceName) : name(deviceName), powerOn(false), powerTime(0) {} // 생성자(추가사항)

    void togglePower() {
        powerOn = !powerOn;
        std::cout << name << (powerOn ? " ON\n" : " OFF\n");
    }
    void AutoTogglePower(int time){ // 자동 타이머(추가사항)
        if(powerOn){
            powerTime += time;
            std::cout << name << "의 타이머가 " << time << " 초로 설정되었습니다\n";
            for(int i=0; i<time; i++){
                sleep(1); // 1초 대기
                std::cout << name << " 가동 중... " << (time - i) << "초 남았습니다.\n";
            }
            powerOn = !powerOn; // 자동으로 꺼짐
            std::cout << name << " OFF\n";
        }
        else{
            std::cout << name << " 의 전원이 꺼져있습니다.\n";
        }
    }

    std::string getName() {
        return name;
    }
};

// 주방가전 클래스
class KitchenAppliance : public ElectronicDevice {
public:
    KitchenAppliance(const std::string& deviceName) : ElectronicDevice(deviceName) {}
};
// 전자레인지 클래스
class Microwave : public KitchenAppliance {
public:
    Microwave() : KitchenAppliance("전자렌지") {}
};
// 커피머신 클래스
class CoffeeMaker : public KitchenAppliance {
public:
    CoffeeMaker() : KitchenAppliance("캡슐커피") {}
};
// 리모컨 클래스: 단일 기기만 토글 가능하도록 구현
class ControlRemote {
public:
    void togglePower(ElectronicDevice& device) {
        device.togglePower();
    }
    void autoTogglePower(ElectronicDevice& device, int time) { // 자동 타이머 기능(추가사항)
        device.AutoTogglePower(time);
    }
};

int main() {
    Microwave microwave;
    CoffeeMaker coffeeMaker;

    ControlRemote remote;

    // 전자레인지, 커피머신 전원 토글 (on)
    remote.togglePower(microwave);
    remote.togglePower(coffeeMaker);

    // 전자레인지, 커피머신 자동 토글 (5초)
    remote.autoTogglePower(microwave, 5);
    
    // 커피머신 전원 토글 (off)
    remote.togglePower(coffeeMaker);

    return 0;
}

 

'LMS 7 > 개발일지' 카테고리의 다른 글

25.08.04 학습개발일지 / C++ Study6(2)  (4) 2025.08.04
25.08.02 학습개발일지 / C++ Study 6(1)  (0) 2025.08.02
25.07.31 학습개발일지 C++ Study5  (11) 2025.07.31
25.07.30 개발학습일지 / C++ Study4(chapter 5, chapter 6)  (2) 2025.07.30
25.07.29 학습개발일지 / C++ Study4  (2) 2025.07.30
'LMS 7/개발일지' 카테고리의 다른 글
  • 25.08.04 학습개발일지 / C++ Study6(2)
  • 25.08.02 학습개발일지 / C++ Study 6(1)
  • 25.07.31 학습개발일지 C++ Study5
  • 25.07.30 개발학습일지 / C++ Study4(chapter 5, chapter 6)
m_Dev
m_Dev
  • m_Dev
    m_Dev
    m_Dev
  • 전체
    오늘
    어제
    • 분류 전체보기
      • MAIN STUDY
        • 정보보안
        • 빅데이터
        • 정보처리
        • 컴퓨터 구조
        • 기타
      • JOB
        • Study
        • Project
      • LMS 7
        • 개발일지
      • FRAMEWORK
        • Qt
        • MFC
        • Winform
        • WPF
        • MAUI
      • NETWORK
        • Study
        • Assignment
      • PYTHON
        • Set
        • Study
        • Assignment
        • Project
      • C
        • Set
        • Study
        • Assignment
        • Project
      • C++
        • Set
        • Study
        • Assignment
        • Project
      • C#
        • Set
        • Study
        • Assignment
        • Project
      • DATABASE
        • MySQL
        • SQLite
      • IDE
        • VisualStudioCode
        • VisualStudio
        • Pycharm
        • Colab
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
m_Dev
25.08.01 학습개발일지 C++ Study5
상단으로

티스토리툴바