과제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 |