개발 공부/JAVA

[JAVA] 추상클래스/인터페이스/상속 예제

sngynhy 2021. 7. 18. 19:28

가전제품

  • 음향/영상기기 - TV/Radio
  • 습도조절기기 - 가습기/제습기
  • 온도조절기기 - 에어컨/히터

 

각 기기들의 공통 기능

  • 전원 On/Off 기능
  • 오토모드 기능

 

[음향/영상기기]

  • 오토모드> 볼륨 조절
  • 채널 변경 기능
  • 음소거 기능

 

[습도조절기기]

  • 오토모드> 습도 자동 조절 유지 ( 가습기 60% / 제습기 40%)
  • 수동모드> 물의 양에 따라 습도 조절

 

[온도조절기기 ]

  • 오토모드> 온도 자동 조절 유지 ( 여름철 적정 온도 26도 / 겨울철 적정 온도 20도)
  • 수동모드> 희망 온도 입력받아 온도 조절 (18도~26도)

 

 

package miniproject;

interface Operation {  // 기기 작동 메뉴얼
	
	public static final int MAX_VOLUME = 10;
	public static final int MIN_VOLUME = 0;
	public static final int MAX_HUMIDITY = 60;  // 실내 적정 습도 40~60%
	public static final int MIN_HUMIDITY = 40;
	public static final int MAX_TEMPERATURE = 26;  // 여름철 실내 적정 온도 26도 / 에어컨 설정 가능 온도 18~26
	public static final int DEFALUT_TEMPERATURE = 20;  // 실내 적정 온도 18~20도
	public static final int MIN_TEMPERATURE = 18; // 겨울철 실내 적정 온도 18~20도
	
	void turnOn();
	void turnOff();
	void autoSetting(int value);  // 자동 작동 value값: 볼륨(TV/Radio), 습도(가습/제습), 온도(에어컨/히터)
	
}

abstract class Home_Appliance implements Operation {  // 가전 제품
	
	String type; // 음향/영상 or 습도조절 or 냉난방
	String name;
	boolean power;  // 전원 on off
	
	@Override
	public void turnOn() {
		System.out.println(this.name + "를 켭니다.");
		this.power = true;
	}
	@Override
	public void turnOff() {
		System.out.println(this.name + "를 끕니다.");
		this.power = false;
	}
	
	@Override
		public String toString() {
			return "[" + this.type + "] " + this.name;
	}
}
//////////////////////////////////////////////////////
// 

abstract class RemoteControl extends Home_Appliance {
	
	int channel;
	int volume;
	int tmp;  // 음소거 시 원래 볼륨 저장할 변수
	
	RemoteControl() {
		this.type = "음향/영상기기";
	}
	
	abstract void changechannel(int channel); // 채널 or 주파수 변경
	abstract void recording(); // 녹화 or 녹음 기능
	
	
	// 볼륨 조절 기능
	// 만약 볼륨 입력값이 최저~최고범위를 벗어나면 최저/최고볼륨으로 자동 설정
	// 범위 내의 값이면 입력값으로 볼륨 설정
	@Override
	public void autoSetting(int volume) {  // 볼륨 조절 기능
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (volume > Operation.MAX_VOLUME) {
			this.volume = Operation.MAX_VOLUME;
			System.out.println("설정 가능한 최고 볼륨은 " + Operation.MAX_VOLUME + "입니다.");
		}
		else if (volume < Operation.MIN_VOLUME) {
			this.volume = Operation.MIN_VOLUME;
			System.out.println("설정 가능한 최저 볼륨은 " + Operation.MIN_VOLUME + "입니다.");
		}
		else {
			this.volume = volume;
		}
		this.tmp = this.volume;
		System.out.println("현재 볼륨은 " + this.volume + "입니다.");
	}
	
	// 음소거 기능
	public void setMute(boolean mute) {
		if (mute) {
			System.out.println("음소거 처리합니다.");
			this.volume = 0;
		} else {
			System.out.println("음소거 해제합니다.");
			this.volume = this.tmp;  // 볼륨 원상태로
		}
	}
	
}

abstract class HumidityControl extends Home_Appliance {
	
	int humidity;
	int water; // 현재 물의 양

	HumidityControl(int water) {
		this.water = water;
		this.type = "습도조절기기";
	}
	
	abstract void manualSetting(int water);  // 습도 수동 조절

}

abstract class TemperatureControl extends Home_Appliance {
	
	int temperature;
	TemperatureControl() {
		this.type = "냉난방기기";
	}

	abstract void manualSetting(int temperature);  // 온도 수동 조절

}
	
//////////////////////////////////////////////////////

class TV extends RemoteControl {
	
	TV() {
		super();
		this.name = "TV";
	}
	
	@Override
	public void changechannel(int channel) { // 채널 변경
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		this.channel = channel;
		System.out.println("채널 " + this.channel + "번으로 변경!");
	}
	@Override
	public void recording() { // 녹화
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		System.out.println("TV 녹화를 시작합니다.");
	}

}
class Radio extends RemoteControl {
	
	Radio() {
		super();
		this.name = "Radio";
	}
	
	@Override
	public void changechannel(int channel) { // 주파수 변경
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		this.channel = channel;
		System.out.println("주파수 " + this.channel + "Hz로 변경!");
	}
	@Override
	public void recording() { // 녹음
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		System.out.println("Radio 녹음을 시작합니다.");
	}

}

//////////////////////////////////////////////////////

class Humidifier extends HumidityControl {
	
	Humidifier(int water) {
		super(water);
		this.name = "가습기";
	}
	
	// 자동 습도 조절
	// 실내 적정 습도 범위 40~60% 를 벗어나면 자동으로 습도를 조절하여 유지
	// 가습기 사용은 건조할 때 이므로 습도가 40% 아래로 떨어지면 60%가 유지되도록
	@Override
	public void autoSetting(int humidity) {
		this.humidity = humidity;
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (humidity < Operation.MIN_HUMIDITY) {  // 현재 습도 < 40%이면 60%로 맞추기
			System.out.println("가습기가 Auto 모드로 작동합니다.");
			boolean flag = true;
			do {
				this.humidity++;
				this.water--;
				System.out.print(this.humidity + "% "); // 실시간 습도 확인
				// 습도가 60%가 되거나 물의 양이 0이 되면 동작을 멈추도록
				if(this.humidity == Operation.MAX_HUMIDITY || this.water == 0) {
					flag = false;
				}
			} while (flag);
			System.out.println();
			if (this.humidity == Operation.MAX_HUMIDITY) {
				System.out.println("현재 습도는 "+ Operation.MAX_HUMIDITY +"% 입니다. Auto 모드를 종료합니다.");
			}
		}
		if (this.water == 0) {
			System.out.println("삐!삐! 물이 없습니다. 물을 추가해주세요.");
		}
	}
	
	// 수동 조절
	// 가습기 내 물의 양이 0이거나 습도가 100%가 될때까지 실행
	@Override
	public void manualSetting(int water) {   // 물의 양과 반비례
		this.water = water;
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (this.water > 0) {
			System.out.println("[현재 습도>> " + this.humidity + "%  물의 양>> " + this.water + "]");
			System.out.println("가습기가 작동합니다.");
			boolean flag = true;
			do {
				this.humidity++;
				this.water--;
				System.out.print(this.humidity + "% "); // 실시간 습도 확인
				if (this.water == 0 || this.humidity == 100) {  // 물이 모두 사용되거나 습도가 100이면 동작을 멈추도록
					flag = false;
				}
			} while (flag);
		}
		System.out.println();
		if (this.water == 0) {
			System.out.println("삐!삐! 물이 없습니다. 물을 추가해주세요.");
		}
		System.out.println("현재 습도는 " + this.humidity + "% 입니다.");
	}
	
}
class Dehumidifier extends HumidityControl {
	
	Dehumidifier(int water) {
		super(water);
		this.name = "제습기";
	}
	
	// 자동 습도 조절
	// 실내 적정 습도 범위 40~60% 를 벗어나면 자동으로 습도를 조절하여 유지
	// 제습기 사용은 습할 때 이므로 습도가 60% 위로 올라가면 40%가 유지되도록
	@Override
	public void autoSetting(int humidity) { 
		this.humidity = humidity;
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (humidity > Operation.MAX_HUMIDITY) { // 현재 습도 < 40%
			System.out.println("제습기가 Auto 모드로 작동합니다.");
			boolean flag = true;
			do {
				this.humidity--;
				this.water++;
				System.out.print(this.humidity + "% "); // 실시간 습도 확인
				if (this.water == 100 || this.humidity == Operation.MIN_HUMIDITY) {  // 물이 가득 차거나 습도가 40이면 동작을 멈추도록
					flag = false;
				}
			} while (flag);  // 현재 습도 == 60% 될 때까지 실행
			System.out.println();
			if (this.humidity == Operation.MIN_HUMIDITY) {
				System.out.println("현재 습도는 "+ Operation.MIN_HUMIDITY +"% 입니다. Auto 모드를 종료합니다.");
			}
		}
		if (this.water == 100) {
			System.out.println("삐!삐! 물이 가득 찼습니다. 물을 비워주세요.");
		}
	}
	
	// 수동 조절
	// 제습기 내 물의 양이 100이거나 습도가 0%가 될때까지 실행
	@Override
	public void manualSetting(int water) { // 물의 양과 반비례
		this.water = water;
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (this.water < 100) {
			System.out.println("[현재 습도>> " + this.humidity + "%  물의 양>> " + this.water + "]");
			System.out.println("제습기가 작동합니다.");
			boolean flag = true;
			do {
				this.humidity--;
				this.water++;
				System.out.print(this.humidity + "% "); // 실시간 습도 확인
				if (this.water == 100 || this.humidity == 0) {  // 물이 100으로 가득 차거나 습도가 0이면 동작을 멈추도록
					flag = false;
				}
			} while (flag);
		}
		System.out.println();
		if (this.water == 100) {
			System.out.println("삐!삐! 물이 가득 찼습니다. 물을 비워주세요.");
		}
		System.out.println("현재 습도는 " + this.humidity + "% 입니다.");
	}
}

//////////////////////////////////////////////////////

class AirConditioner extends TemperatureControl {
	
	AirConditioner() {
		super();
		this.name = "에어컨";
	}
	
	// 자동 온도 조절 - 여름철 실내 적정 온도 26도에 맞추기
	// 현재 온도(입력값)가 26도가 아니면 실행
	@Override
	public void autoSetting(int temperature) {
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		} else if (temperature > 26) {  // 온도 > 26이면 26도로 자동 설정
			this.temperature = temperature;
			System.out.println("에어컨이 Auto 모드로 작동합니다.");
			System.out.println("여름철 적정 실내 온도는 26˚C 입니다. 실내 온도를 26˚C로 유지합니다.");
			do {
				this.temperature--;
				System.out.print(this.temperature + "˚C "); // 실시간 온도 확인
			} while (this.temperature > Operation.MAX_TEMPERATURE);  // 26도
		} else if (temperature < 26) {
			this.temperature = temperature;
			System.out.println("에어컨이 Auto 모드로 작동합니다.");
			System.out.println("여름철 적정 실내 온도는 26˚C 입니다. 실내 온도를 26˚C로 유지합니다.");
			do {
				this.temperature++;
				System.out.print(this.temperature + "˚C "); // 실시간 온도 확인
			} while (this.temperature < Operation.MAX_TEMPERATURE);  // 26도
		}
		System.out.println();
		System.out.println("현재 온도는 " + this.temperature + "˚C 입니다.");
	}
	
	// 수동 조절
	// 에어컨 설정 가능 온도 18~26
	// 만약 희망온도 입력값이 최저~최고범위를 벗어나면 최저/최고 온도로 자동 설정
	// 범위 내의 값이면 입력값으로 온도 설정
	@Override
	public void manualSetting(int temperature) {
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (temperature > Operation.MAX_TEMPERATURE) { // 설정하고자 하는 온도가 에어컨 최고기온보다 높으면
			this.temperature = Operation.MAX_TEMPERATURE; // 26도로 설정
			System.out.println("설정 가능한 최고 온도는 " + Operation.MAX_TEMPERATURE +"˚C 입니다.");
		} else if (temperature < Operation.MIN_TEMPERATURE) {
			this.temperature = Operation.MIN_TEMPERATURE; // 26도로 설정
			System.out.println("설정 가능한 최저 온도는 " + Operation.MIN_TEMPERATURE +"˚C 입니다.");
		} else {
			this.temperature = temperature;
		}
		System.out.println("희망 온도를 " + this.temperature + "˚C로 설정합니다.");
			
	}
		
}

class Heater extends TemperatureControl {
	
	Heater() {
		super();
		this.name = "히터";
	}
	
	// 겨울철 실내 적정 온도 20도에 맞추기 (18~20도)
	// 현재 온도(입력값)가 20도가 아니면 실행
	@Override
	public void autoSetting(int temperature) {
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		} else if (temperature < 20) {
			this.temperature = temperature;
			System.out.println("히터가 Auto 모드로 작동합니다.");
			System.out.println("겨울철 적정 실내 온도는 20˚C 입니다. 실내 온도를 20˚C로 유지합니다.");
			do {
				this.temperature++;
				System.out.print(this.temperature + "˚C "); // 실시간 온도 확인
			} while (this.temperature < Operation.DEFALUT_TEMPERATURE);  // 20도로 설정
		} else if (temperature > 20) {
			this.temperature = temperature;
			System.out.println("히터가 Auto 모드로 작동합니다.");
			System.out.println("겨울철 적정 실내 온도는 20˚C 입니다. 실내 온도를 20˚C로 유지합니다.");
			do {
				this.temperature--;
				System.out.print(this.temperature + "˚C "); // 실시간 온도 확인
			} while (this.temperature > Operation.DEFALUT_TEMPERATURE);  // 20도로 설정
		}
		System.out.println();
		System.out.println("현재 온도는 " + this.temperature + "˚C 입니다.");
	}
	
	// 수동 - 히터 설정 가능 온도 18~26
	// 히터 설정 가능 온도 18~26
	// 만약 희망온도 입력값이 최저~최고범위를 벗어나면 최저/최고 온도로 자동 설정
	// 범위 내의 값이면 입력값으로 온도 설정
	@Override
	public void manualSetting(int temperature) {
		if (!this.power) {
			System.out.println("전원이 꺼져있는 상태입니다.");
			return;
		}
		else if (temperature > Operation.MAX_TEMPERATURE) { // 설정하고자 하는 온도가 에어컨 최고기온보다 높으면
			this.temperature = Operation.MAX_TEMPERATURE; // 26도로 설정
			System.out.println("설정 가능한 최고 온도는 " + Operation.MAX_TEMPERATURE +"˚C 입니다.");
		} else if (temperature < Operation.MIN_TEMPERATURE) {
			this.temperature = Operation.MIN_TEMPERATURE; // 18도로 설정
			System.out.println("설정 가능한 최저 온도는 " + Operation.MIN_TEMPERATURE +"˚C 입니다.");
		} else {
			this.temperature = temperature;
		}
		System.out.println("희망 온도를 " + this.temperature + "˚C로 설정합니다.");
		
	}
}

//////////////////////////////////////////////////////

public class Miniproject {
	
	public static void main(String[] args) {
		
		TV tv = new TV();
		Radio rd = new Radio();
		Humidifier hd = new Humidifier(50);
		Dehumidifier dhd = new Dehumidifier(50);
		AirConditioner ac = new AirConditioner();
		Heater ht = new Heater();
		
		Home_Appliance[] data = new Home_Appliance[6];
		data[0] = tv;
		data[1] = rd;
		data[2] = hd;
		data[3] = dhd;
		data[4] = ac;
		data[5] = ht;
		
		for (Home_Appliance ha : data) {
			System.out.println(ha);
		}
		
		System.out.println();
		
		tv.turnOn();
		tv.changechannel(10);
		tv.autoSetting(20);
		tv.recording();
		tv.turnOff();
		
		System.out.println();
		
		rd.turnOn();
		rd.changechannel(108);
		rd.autoSetting(7);
		rd.setMute(true);
		System.out.println("현재볼륨: " + rd.volume);
		rd.setMute(false);
		System.out.println("현재볼륨: " + rd.volume);
		rd.recording();
		rd.turnOff();
		
		System.out.println();
		
		hd.turnOn();
		hd.autoSetting(35);
		hd.manualSetting(10);;
		hd.turnOff();
		
		System.out.println();
		
		dhd.turnOn();
		dhd.autoSetting(80);
		dhd.manualSetting(40);
		dhd.turnOff();
		
		System.out.println();
		
		ac.turnOn();
		ac.autoSetting(24);
		ac.autoSetting(30);
		ac.manualSetting(17);
		ac.manualSetting(20);
		ac.turnOff();
		
		System.out.println();
		
		ht.turnOn();
		ht.autoSetting(18);
		ht.autoSetting(26);
		ht.manualSetting(17);
		ht.manualSetting(28);
		ht.turnOff();

		
	}
}