2025-03-25 java(2)

성현규·2025년 3월 25일
post-thumbnail

클래스 확장하기

1. 스마트 홈 디바이스 기능확장

1-1. main class -> app

public class SmartHomeApp { // main이 있는 main 클래스 -> main()이 있다는 건 “여기가 프로그램의 시작이고, 전체 흐름을 이끌 책임을 가진다”**는 의미이다.
    public static void main(String[] args) { // controller는 미리 준비되어있어야 하고 이제 직접 세팅을 해야함.
        SmartHomeController controller = new SmartHomeController();

        controller.loadDevicesFromFile("device.dat"); // input output 파일 이름을 동일하게 해야한다. -> 누적되지 않는 오류 발생생

        controller.addDevice(new SmartLight("거실 전등")); // 미리 컨트롤러에 정의 안해뒀으면 이 main밑에 addDevice같은 함수들을 정의해두고 해야해서 복잡시러움.
        controller.addDevice(new SmartLight("주방전등"));   // 새로운 스마트 기기를 살때마다 앱에 추가.

        controller.turnAllOn();
        controller.runAllFeature();
        controller.showAllStatus();

        controller.showListNumber();

        controller.saveDevicesToFile("device.dat");
    }


}

1-2. app에서의 기능적 역할을 모아둔 controller

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class SmartHomeController {     // 앱은 지휘자고 컨트롤러는 실행자다.
    private List<SmartDevice> devices; // 리스트를 통해 다른 기기들을 관리한다.
    private static final long serialVersionUID = 1L; // final로 값이 안바뀌게 고정한다.
    // static을 통해 이 정보가 객체들과 함께 힙으로 들어가지 않고 메서드 영역(클래스당 1개 존재, 모든 객체가 공유)에 있게 한다. 
    // static으로 선언된 메서드는 객체에 속하지 않고, 클래스에 속하기 때문에 객체 없이도 “클래스 이름으로 직접 호출할 수 있는 것”이다.


    public SmartHomeController(){      // 생성자 생성   
        devices = new ArrayList<>();   // 컨트롤러가 생성되면 그때 새로운 배열을 정의하고 시작함. (순서 상 이게 맞다.)
    }

    public void addDevice(SmartDevice device){           // 중앙 컨트롤할 메뉴들을 메서드로 생성한다. SmartDevice 객체를 파라미터로 받는다.
        devices.add(device);
        System.out.printf("[%s]기기가 등록되었습니다.\n", device.getName());
    }

    public void turnAllOn(){
        System.out.println("등록된 모든 기기의 전원이 켜집니다.");
        for (SmartDevice i : devices){
            i.turnOn();
        }
        
    }

    public void turnAllOff(){
        System.out.println("등록된 모든 기기의 전원이 끕니다.");
        for (SmartDevice i : devices){
            i.turnOff();
        }
        
    }

    public void runAllFeature(){
        System.out.println("등록된 모든 기기의 고유기능이 켜집니다.");
        for (SmartDevice i : devices){
            i.runfeature();
        }
    }

    public void showAllStatus(){
        System.out.println("등록된 모든 기기의 현재 상태를 확인합니다.");
        for (SmartDevice i : devices){
            i.showStatus();
        }
    }

    public void showListNumber(){
        System.out.println(devices.size());
    }

    public void saveDevicesToFile(String filename){
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))){ // new FileOutputStream(filename) 지정된 파일에 출력 스트림을 연결하여 쓰기모드로 연다.
            out.writeObject(devices);                   
            System.out.println("[파일 저장 완료]");
        }
        catch (IOException e){
            e.printStackTrace();
        }
        // try 구문이 자동으로 out.close를 해준다.
        // IOException: 파일이 없거나 읽기 실패, ClassNotFoundException: 저장했던 클래스 정보를 못 찾았을 때 (예: 클래스 이름이 바뀐 경우)

    }

    public void loadDevicesFromFile(String filename){
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))){
            devices = (List<SmartDevice>) in.readObject();
            System.out.println("[파일 불러오기 완료]");
        }
        catch (IOException | ClassNotFoundException e){ // 예외처리를 해둬서 예외가 발생해도 죽지않고 에러메세지만 출력한다.
            e.printStackTrace(); // 예외 객체(e)의 발생 경로(=스택 트레이스)를 콘솔에 출력한다.
        }
        
    }
}

1-3. 스마트 디바이스들의 공통 기능을 정의한 smartdevice

import java.io.Serializable ;
public abstract class SmartDevice implements Serializable { // 저장기능을 보장함. -> 자동 상속됨.
    private String name;
    private boolean isOn;

    SmartDevice(String name){
        this.name = name;
        this.isOn = false; // 모든 기기는 처음에 꺼져있는 상태로 생각하기
    }


    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public boolean getIsOn() {
        return this.isOn;
    }

    public void setIsOn(boolean isOn) {
        this.isOn = isOn;
    }

    public void turnOn(){
        this.isOn = true;
        System.out.printf("[%s]가 켜졌습니다.\n", this.name);
    }

    public void turnOff(){
        this.isOn = false;
        System.out.printf("[%s]가 꺼졌습니다.\n", this.name);
    }

    public void showStatus(){
        System.out.printf("[%s]의 상태: %s입니다.\n", this.name, this.isOn ? "ON" : "OFF");
    }

    public abstract void runfeature(); // 공통된 이름으로 각기 다른 자식 객체의 특수 행동을 호출할 수 있게함. 
}

1-4. 스마트 전등

public class SmartLight extends SmartDevice {

    SmartLight(String name){
        super(name);
    }

    public void changeColor(String color){
        if (!getIsOn()){
            System.out.printf("%s가 꺼져있어 색상을 변경할 수 없습니다.\n", getName());
        }
        else {
            System.out.printf("%s의 색상이 %s로 변경되었습니다.\n", getName(), color);
        }
    }

    @Override
    public void runfeature() {
        changeColor("파란색");
    }
    
}

1-5. 스마트 스피커

public class SmartSpeaker extends SmartDevice {
    SmartSpeaker(String name){
        super(name);
    }
    
    public void playMusic(String song){
        if (!getIsOn()){
            System.out.printf("%s가 꺼져있어 음악을 틀 수 없습니다.\n", getName());
        }
        else {
            System.out.printf("%s에서 %s를 재생합니다.\n", getName(), song);
        }
    }

    @Override
    public void runfeature() {
        playMusic("Hip-Hop"); // 전테 컨트롤로 힙합을 틀게된다.
    }
    
}

1-6. 스마트 온도 조절기

public class SmartThermostat extends SmartDevice {
    SmartThermostat(String name){
        super(name);
    }

    public void setTemperature(int degree){
        if (!getIsOn()){
            System.out.printf("%s가 꺼져있어 온도를 조절할 수 없습니다.\n", getName());
        }
        else {
            System.out.printf("%s가 온도를 %d로 조정합니다.\n", getName(), degree);
        }
    }

    @Override
    public void runfeature() {
        setTemperature(28); // 기본값을 28도로 세팅팅
    }
    
}
profile
학생

0개의 댓글