2025-03-26-java

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

0. 대화

0-1. OOP(Object-Oriented Programming)에 대한 개인적인 생각

  • 객체 지향 프로그래밍을 한다는 것은 지구를 구성하는 과정과 같다.
  • 동적 바인딩(Dynamic Binding)은 같은 공부를 시켰을때 부모와 다른 습관이 들어 다른 방식으로 같은 것을 공부하는 자식과 같다. 같은 일을 다르게 하는건 개인을 존중 결과만 동일하면 된다. (일하는 방식은 직업별로 다르다.)
  • 그럼 getter setter는 개인정보를 묻는 "방식"과 같다. (이름 등은 인간, 동물 모두 가지고 있지만 이를 물어보려면 각기 다른 방식으로 물어봐야한다. 또 친하지 않는 이상 알 수 없다. 인간 사이에선 예의를 갖추고 동물들이나 사물들에겐 그들과 소통하기 위한 특이한 방법을 사용해야한다.)
  • Upcasting시 자식의 능력을 잃는 건 통합과학 선생님을 모집했는데 본업이 물리 선생인 사람이 물리 커리큘럼으로 진도를 빼면 안된다는 것을 의미한다. 통합과학 선생님으로서 온 자리는 통합과학 선생님으로서 행동하자.
  • 객체 배열은 위에서 통합과학 선생님을 모집하는데 물리, 화학, 생명, 지구 과학을 가르치던 선생님들이 한데 모이는 것과 같다.
  • instanceof 를 통해 원래 물리 과목을 가르치던 선생님이 맞는지 물어본다.
  • main class는 작은 나라의 혹은 세계의 대통령과 같다.
  • main class가 부하로 두는 (Has A) 클래스는 비서 혹은 각 부처 장관과 같다. / 엄밀히 말하면 그 부처와 같다. Ex) 국방부
  • 생성자 생성 -> 대통령이 부르면 준비해서 가야지/ 각 부처에서 일할 직원을 한명 뽑는 것. 이때 직원은 자신의 이름 등을 알려야하고 일할 거리도 챙겨야 한다.
  • public void addDevice(SmartDevice device)에서 매개 변수 부분은 어떤 직업군에게 일을 시킬거나 명령을 할지 정하는 것과 같다.
  • 인터페이스는 자격증이고 상속은 구체적 직업군(목사, 스님..)을 물려받는 것, 추상화 클래스는 예를 들어 "종교인"이라는 것과 같다. 직업군이라기엔 좀 더 광범위한 범위이다. 스님도 군대에 다녀오면 종교인 -> 스님 클래스를 상속받지만 군인으로서 기본적으로 할 수 있는 역할들도 가지고 있는 것이다. 하여 종교인 행사에 초정(객체 배열)될 수도 있고 전쟁이 나면 군대에 입대할 수도 있다.
  • 국가란 국민이라고 한다면 OOP가 왜 객체를 지향하는지 알것 같다. 개인을 세세히 분류해주고 하고자 하는 일을 정해준다는 것은 그야말로 개인을 배려하는 것이기 때문이다. 여러 사람을 모아두고 돌을 나르라고 한번에 설명하는 것보다 개인이 잘하는 일을 시키는 것이 국가적, 사회적으로 효율적이기에 이를 대부분의 삶의 현장에서 지향한다. 이 의미가 객체 지향의 의미인 것 같다.
  • public은 그 자체로 공적이라는 뜻이므로 이후에 붙는 기능과 의미는 사회적으로 이해할만 해야되며 그렇게 기능해야한다. 따라서 웬만해선 비슷한 능력은 같은 이름으로 묶여서 불리며 전체 기능을 이롭게 한다.
  • 추상화: 추상적으로 특정 역할을 분류했기 때문에 능력을 구체화할때의 개인의 자유가 존중된다. (일반적으로 상속 받아서 참고하여 변형한다기보다 아예 새로 정의할 수 있다. 마치 '일'의 정의를 직업군마다 다르게 할 수 있다는 것과 같다.)
  • 추상화는 상속보다 오히려 객체의 자유를 존중한다.
  • 추상화: "이런 역할이 필요해요" // “세상에 어떤 기능이 필요하다(외부 구조)”는 정의된 틀이 있고, 객체는 그 틀 안에서 실존적 자유를 가진 존재로 행동한다.
  • 클래스 객체를 만들어 일을 시킨다는 것은 클래스라는 협회나 단체에 일을 의뢰하는 것과 같고 그때의 객체는 파견된 협회 직원이다. 협회나 단체는 위계가 있다.
  • 객체지향의 규칙을 잘 지키면 회사에서 공동 업무를 할때 편리하다는 말은 잘 갖춰놓은 국가의 미래 세대는 여전히 편안하다는 말과 같다. 즉 공동의 협업 효율이 증진되는 것은 부차적인 이익이지 본질은 어떻게 국가를 잘 가꾸어 놓을 것이냐라는 뜻이다.
  • getter와 setter가 마련된 상황에서 name은 속어 getName은 만국 공통어이다. 애초의 본인 말이 만국 공통어(getter와 setter를 설정하지 않은)가 아닌 이상 말이다.
  • 실제 업무를 위한 부처를 신설한다고 하면 직업군을 기준으로 부처를 만드는 것이 아니라 그 직업군들을 "조합(Has A)"하여 부처를 만든다. 상속은 해당 분야 전문가들의 발전과 같은 개념이고 조합은 실무를 위해 여러 분야에서 전문가를 빌려오는 역할 분담과 더욱 관련된다. -> 조합은 다른 분야가 협업할 수 있게 해준다. -> 컴퓨터의 정의에 키보드를 포함하는 것보다 그 두개를 합해 사람이 인터넷업무를 하기 위한 업무공간에 포함하는 것이 낫다.
  • 데이터를 주면 객체는 그 데이터를 받아 일을 수행할 수 있다.
  • 지금 생각해보니 직업 능력(자격증)은 역할(Interface), 정체성(역할들이 모여 정체성이 된다. 정체성은 실체이다. 즉 특정 능력을 가진 실체의 집합이다.)은 클래스(Inheritance) 그리고 역할은 역할끼리도 확장(상속)될 수 있다.

0-2. SOLID 원칙에 관한 생각 (객체지향 설계의 5대 원칙)

  • Single Responsibility Principle(단일 책임 원칙): 한 사람은 특화된 하나의 일을 해야한다.
  • Open/Closed Principle(개방/폐쇄 원칙): 문제가 생겼을때 국민을 일일히 찾아가 설명하지 말고 정책을 바꿔라
  • Liskov Substitution Principle(리스코프 치환 원칙): 교사를 모집한다면 화학, 물리교사도 강단에 설 수 있어야 한다.
  • Interface Segregation Principle(인터페이스 분리 원칙): 자격증은 하나의 자격만 명시해야한다.
  • Dependency Inversion Principle(의존 역전 원칙): 국민 개인에게 일을 시키지 말고 역할군에 일을 시켜라 // 한명에 의존하지 않아도 된다.

0-3. 하드웨어 영역에 대하여

  • 하드웨어는 무의미한 공간이고 소프트웨어는 거기에 의미를 부여하고 규칙을 만든다.
  • 메서드 영역 (공장)과 힙 영역(생활공간)은 RAM에 물리적으로 구분되어 있지는 않으나 JVM이 값을 처리하면서 논리적으로 구분한다.

1. 자바 코딩테스트

1-1. 배열 만들기 4

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
    public int[] solution(int[] arr) {
    List <Integer> stk = new ArrayList<>();
    int  i = 0;
    while (i < arr.length){
        if (stk.isEmpty()){
            stk.add(arr[i]);
            i++; 
        }

        else if (!stk.isEmpty() && stk.get(stk.size()-1) < arr[i]){
            stk.add(arr[i]);
            i++;
        }

        else if (!stk.isEmpty() && stk.get(stk.size()-1) >= arr[i]){
            stk.remove(stk.size()-1);
        }
    }
    return stk.stream().mapToInt(Integer::intValue).toArray();
}
}

2. 객체 지향의 이해 2

2-1. 추상화

  • / **로 주석으 표시할 수 있다.
  • 코딩 컨벤션

프로토스의 다양한 클래스들

public abstract class Protoss {
    private String name;
    private int hp;
    private int speed;
    private int dps;
    
    public Protoss(String name, int hp, int speed, int dps) {
        this.name = name;
        this.hp = hp;
        this.speed = speed;
        this.dps = dps;
    }

    public String getName() {
        return name;
    }

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

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDps() {
        return dps;
    }

    public void setDps(int dps) {
        this.dps = dps;
    }

    @Override
    public String toString() {
        return "EX01_Protoss [name=" + name + ", hp=" + hp + ", speed=" + speed + ", dps=" + dps + "]";
    }
    /**
     * 지정된 위치로 이동한다.
     * @param position 이동할 위치
     */
    public abstract void move(String position);

    /**
     * 지정한 대상을 공격한다. (추상 메서드)
     * @param target 공격할 대상
     */
    public abstract void attack(String target);
}

public class Zilot extends Protoss {

    public Zilot(String name, int hp, int speed, int dps){     // 이름을 어떻게 부를지에 대한 예의 같은 건 상속을 다 받아서 기본적으로 알고 있다.
        super(name, hp, speed, dps);
    }

    @Override
    public void attack(String target) {
        System.out.printf("[Zilot] %s(이)가 %s(을)를 칼로 찌릅니다. >> 데미지 %d\n", this.getName(), target, this.getDps());
    }

    @Override
    public void move(String position) {
        System.out.printf("[Zilot] %s(이)가 %s까지 빠른 속도로 이동합니다.\n", this.getName(), position);
    }
    
}

public class Dragun extends Protoss {

    public Dragun(String name, int hp, int speed, int dps){     // 이름을 어떻게 부를지에 대한 예의 같은 건 상속을 다 받아서 기본적으로 알고 있다.
        super(name, hp, speed, dps);
    }

    @Override
    public void attack(String target) {
        System.out.printf("[Dragun] %s(이)가 %s에 포탄을 발사합니다. >> 데미지 %d\n", this.getName(), target, this.getDps());
        
    }

    @Override
    public void move(String position) {
        System.out.printf("[Dragun] %s(이)가 %s까지 천천히 이동합니다.\n", this.getName(), position);
        
    }
    
}

2-2. 인터페이스

  • 능력

주인공과 몬스터가 있는 세계

public class Game {
    public static void main(String[] args) {
        몬스터 m = new 몬스터("골렘", 500, 30, 200);
        주인공 j = new 주인공("기사", 1200, 120, 320);

        m.walk();
        m.jump();
        m.run();

        j.walk();
        j.run();
        j.jump();

        m.attack();
        j.defence();
        j.attack();
        m.evasion();
        m.attack();
        j.evasion();

        j.pickUpItem();
        j.talkNpc();
    }
}

public class Unit {
    private String name;
    private int hp;
    private int speed;
    private int dps;


public Unit(String name, int hp, int speed, int dps) {
    this.name = name;
    this.hp = hp;
    this.speed = speed;
    this.dps = dps;
}

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

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

    public int getHp() {
        return this.hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getSpeed() {
        return this.speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDps() {
        return this.dps;
    }

    public void setDps(int dps) {
        this.dps = dps;
    }

    @Override
    public String toString() {
        return "Unit [name=" + name + ", hp=" + hp + ", speed=" + speed + ", dps=" + dps + "]";
    }

}

public interface Imove {
    public void walk();

    public void run();

    public void jump();
}

public interface Ifight {
    public void attack();

    public void defence();

    public void evasion();
}

public interface Imovement {
    public void pickUpItem();

    public void talkNpc();
} 

public class 주인공 extends Unit implements Ifight, Imove, Imovement{

    public 주인공(String name, int hp, int speed, int dps) {
        super(name, hp, speed, dps);
    }

    @Override
    public void attack() {
        System.out.printf("[주인공] %s(이)가 %d의 힘으로 몬스터를 공격합니다.\n", getName(), getDps());
        
    }

    @Override
    public void defence() {
        System.out.printf("[주인공] %s(이)가 상대의 공격을 방어합니다.\n", getName(), getDps());
        
    }

    @Override
    public void evasion() {
        System.out.printf("[주인공] %s(이)가 상대의 공격을 회피합니다.\n", getName());
        
    }

    @Override
    public void jump() {
        System.out.printf("[주인공] %s(이)가 점프합니다.\n", getName());
        
    }

    @Override
    public void run() {
        System.out.printf("[주인공] %s(이)가 달려갑니다.\n", getName());
        
    }

    @Override
    public void walk() {
        System.out.printf("[주인공] %s(이)가 %d의 속력으로 걷습니다.\n", getName(), getSpeed());
        
    }

    @Override
    public void pickUpItem() {
        System.out.printf("[주인공] %s(이)가 아이템을 줍습니다.\n", getName());
        
    }

    @Override
    public void talkNpc() {
        System.out.printf("[주인공] %s(이)가 NPC와 대화를 나눕니다.\n", getName());
        
    }
    
}

public class 몬스터 extends Unit implements Imove, Ifight{
    public 몬스터(String name, int hp, int speed, int dps) {
        super(name, hp, speed, dps);
    }

    @Override
    public void attack() {
        System.out.printf("[몬스터] %s(이)가 %d의 힘으로 주인공을 공격합니다.\n", getName(), getDps());
        
    }

    @Override
    public void defence() {
        System.out.printf("[몬스터] %s(이)가 주인공의 공격을 방어합니다.\n", getName(), getDps());
        
    }

    @Override
    public void evasion() {
        System.out.printf("[몬스터] %s(이)가 주인공의 공격을 회피합니다.\n", getName());
        
    }

    @Override
    public void jump() {
        System.out.printf("[몬스터] %s(이)가 점프합니다.\n", getName());
        
    }

    @Override
    public void run() {
        System.out.printf("[몬스터] %s(이)가 달려갑니다.\n", getName());
        
    }

    @Override
    public void walk() {
        System.out.printf("[몬스터] %s(이)가 %d의 속력으로 걷습니다.\n", getName(), getSpeed());
        
    }

}

2-3 실전문제

미디어 플레이 시스템

  • files[0] = new AudioFile("music.mp3"); 처럼 합쳐서 쓰는게 낫다. -> 재사용하지 않으므로
  • 어짜피 내가 일일히 입력했다는 설정이므로 if문으로 검사하고 그럴 필요없다. 그냥 쓰자.
    public class MediaFilePlayStation{
        public static void main(String[] args) {
            MediaFile[] files = new MediaFile[3];

            AudioFile a = new AudioFile("music.mp3");
            VideoFile v = new VideoFile("movie.mp4");
            ImageFile i = new ImageFile("picture.jpg");

            files[0] = a;
            files[1] = v;
            files[2] = i;

            VideoFile videoTarget = null;

            for (MediaFile x : files){
                x.getInfo();
                x.play();
                if (x instanceof VideoFile){
                    videoTarget = (VideoFile) x;
                }
            }

            if (videoTarget != null){
                videoTarget.showSubtitles();
            }
        }
    }
    
    
    
    
    abstract class MediaFile {
    private String filename;

    public MediaFile(String filename) {
        this.filename = filename;
    }


    public String getFilename() {
        return this.filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public void getInfo(){
        System.out.printf("파일명: [%s]\n", this.filename);
    }

    public abstract void play();
}

class AudioFile extends MediaFile{
    public AudioFile(String filename) {
        super(filename);
    }

    @Override
    public void play() {
        System.out.println("오디오 파일을 재생합니다.\n");
        
    }
}

class VideoFile extends MediaFile{
    public VideoFile(String filename) {
        super(filename);
    }

    @Override
    public void play() {
        System.out.println("비디오 파일을 재생합니다.\n");
        
    }

    public void showSubtitles(){
        System.out.println("자막: 영화 자막을 표시합니다.");
    }
}

class ImageFile extends MediaFile{
    public ImageFile(String filename) {
        super(filename);
    }

    @Override
    public void play() {
        System.out.println("이미지 파일을 재생합니다.\n");
        
    }
}

학교 수업 관리 시스템

public class 학교_수업_관리_시스템 {
    public static void main(String[] args) {
        Course[] courses = new Course[3];

        courses[0] = new OnlineCourse("자바 프로그래밍", "김교수");
        courses[1] = new OfflineCourse("자료구조", "이교수");
        courses[2] = new HybridCourse("AI 프로젝트", "박교수");

        for (Course i : courses){
            i.showInfo();
            i.startClass();
        }

        ((HybridCourse) courses[2]).switchMode("화상");

    }
}

abstract class Course{
    private String courseName;
    private String teacherName;


    public Course(String courseName, String teacherName) {
        this.courseName = courseName;
        this.teacherName = teacherName;
    }
    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public String getTeacherName() {
        return teacherName;
    }
    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }
    
    public void showInfo(){
        System.out.printf("수업명: %s / 교사: %s\n", this.courseName, teacherName);
    }

    public abstract void startClass();
}

class OnlineCourse extends Course{
    public OnlineCourse(String courseName, String teacherName){
        super(courseName, teacherName);
    }

    public void startClass(){
        System.out.println("Zoom 링크를 통해 온라인 수업을 시작합니다.\n");
    }
}

class OfflineCourse extends Course{
    public OfflineCourse(String courseName, String teacherName){
        super(courseName, teacherName);
    }

    public void startClass(){
        System.out.println("지정된 강의실에서 대면 수업을 시작합니다.\n");
    }
}

class HybridCourse extends Course{
    public HybridCourse(String courseName, String teacherName){
        super(courseName, teacherName);
    }

    public void startClass(){
        System.out.println("온라인과 오프라인 수업을 병행합니다.\n");
    }

    public void switchMode(String mode){
        System.out.printf("현재 수업 모드를 [%s]으로 변경합니다.", mode);
    }

}

스마트 교통수단 제어 시스템

public class 스마트_교통수단_제어_시스템 {
    public static void main(String[] args) {
        TransportManager manager = new TransportManager();

        manager.addStation(new Bus("BUS-001", "대기"));
        manager.addStation(new Train("TR-202", "운행 중"));
        manager.addStation(new Drone("DRN-A7", "정지"));

        manager.showStatus();

        manager.goToSeoul();
    }
}

abstract class Transport{
    private String vehicleId;
    private String status;

    public Transport(String vehicleId, String status) {
        this.vehicleId = vehicleId;
        this.status = status;
    }

    public String getVehicleId() {
        return vehicleId;
    }
    public void setVehicleId(String vehicleId) {
        this.vehicleId = vehicleId;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }

    public void stop(){
        System.out.printf("교통수단 [%s]가 정지합니다.\n\n", vehicleId);
    }

    public void statusI(){
        System.out.printf("[%s]의 현재 상태는 [%s]입니다.\n", vehicleId, status);
    }

    public abstract void start();
    public abstract void nevigate(String destination);
}

class Bus extends Transport{
    public Bus(String vehicleId, String status) {
        super(vehicleId, status);
    }

    @Override
    public void nevigate(String destination) {
        System.out.printf("버스가 [%s]으로 이동합니다.\n", destination);
    }

    @Override
    public void start() {
        System.out.printf("버스 [%s]가 출발합니다.\n", getVehicleId());
        
    }
}

class Train extends Transport{
    public Train(String vehicleId, String status) {
        super(vehicleId, status);
    }

    @Override
    public void nevigate(String destination) {
        System.out.printf("기차가 [%s]행 노선으로 진입합니다.\n", destination);
    }

    @Override
    public void start() {
        System.out.printf("기차 [%s]가 플랫폼을 떠납니다.\n", getVehicleId());
        
    }

    public void announceStations(){
        System.out.println("기차가 다음 역들을 안내합니다...\n");
    }
}

class Drone extends Transport{
    public Drone(String vehicleId, String status) {
        super(vehicleId, status);
    }

    @Override
    public void nevigate(String destination) {
        System.out.printf("드론이 항공 경로를 따라 [%s]으로 이동합니다.\n", destination);
    }

    @Override
    public void start() {
        System.out.printf("드론 [%s]가 이륙합니다.\n", getVehicleId());
        
    }

    public void  captureSurroundings(){
        System.out.println("드론이 주변 상황을 촬영합니다.");
    }
}

class TransportManager {
    private Transport[] station;

    public TransportManager(){
        station = new Transport[3];
    }

    public void addStation(Transport i){
        if (i instanceof Bus){
            station[0] = i;
        }

        else if (i instanceof Train){
            station[1] = i;
        }

        else if (i instanceof Drone){
            station[2] = i;
        }
    }

    public void goToSeoul(){
        for (Transport x : station){
            x.start();
            x.nevigate("서울역");
            x.stop();

            if (x instanceof Train){
                ((Train)x).announceStations();
            }

            else if (x instanceof Drone){
                ((Drone)x).captureSurroundings();
            }
        }
    }

    public void showStatus(){
        for (Transport x : station){
            x.statusI();
        }

        System.out.println();
    }
    
}

청소 로봇 제어 시스템

public class 청소_로봇_제어_시스템 {
    public static void main(String[] args) {
        Cleanable[] cleanables = new Cleanable[2];

        cleanables[0] = new VacuumRobot();
        cleanables[1] = new MopRobot();

        for (Cleanable i : cleanables){
            i.startCleaning();
            i.stopCleaning();
        }
    }
}

interface Cleanable {
    public abstract void startCleaning();
    
    public abstract void stopCleaning();
}

class VacuumRobot implements Cleanable{

    @Override
    public void startCleaning() {
        System.out.println("진공 청소를 시작합니다.");
        
    }

    @Override
    public void stopCleaning() {
        System.out.println("진공 청소를 종료합니다.");
        
    }
    
}

class MopRobot implements Cleanable{

    @Override
    public void startCleaning() {
        System.out.println("물걸레 청소를 시작합니다.");
        
    }

    @Override
    public void stopCleaning() {
        System.out.println("물걸레 청소를 종료합니다.");
        
    }
    
}

결제 시스템 구현

public class 결제_시스템_구현 {
    public static void main(String[] args) {
        Payable[] payables = new Payable[3];

        payables[0] = new CreditCard();
        payables[1] = new Cash();
        payables[2] = new MobilePay();

        for (Payable i : payables){
            i.pay(10000);
        }

        ((MobilePay) payables[2]).useBiometrics();
    }
}

interface Payable {
    public abstract void pay(int amount);
    
}

class CreditCard implements Payable{
    public void pay(int amount){
        System.out.printf("신용카드로 [%d]원 출력합니다.\n", amount);
    }
}

class Cash implements Payable{
    public void pay(int amount){
        System.out.printf("현금으로 [%d]원 출력합니다.\n", amount);
    }
}

class MobilePay implements Payable{
    public void pay(int amount){
        System.out.printf("모바일 결제로 [%d]원 출력합니다.\n", amount);
    }

    public void useBiometrics(){
        System.out.println("생체인증으로 모바일 결제를 시작합니다.");
    }
}

자율 로봇 임무 시스템

public class 자율_로봇_임무_시스템 {
    public static void main(String[] args) {
        Robot[] robots = new Robot[3];

        robots[0] = new DroneBot("드론-01", 80);
        robots[1] = new RescueBot("구조-09", 65);
        robots[2] = new HybridBot("하이브리드-X", 95);

        for (Robot i : robots){
            i.showStatus();
            i.operate();
            i.specialAbility();
            System.out.println();  // 띄어쓰기를 출력문에서 구현하는게 낫다. -> 보여지는 것을 관리하는 부분은 여기이므로
        }
    }
}

abstract class Robot {
    private String name;
    private int batteryLevel;


    public Robot(String name, int batteryLevel) {
        this.name = name;
        this.batteryLevel = batteryLevel;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getBatteryLevel() {
        return batteryLevel;
    }
    public void setBatteryLevel(int batteryLevel) {
        this.batteryLevel = batteryLevel;
    }

    public void showStatus(){
        System.out.printf("로봇명: [%s], 베터리: [%d]\n", name, batteryLevel);
    }
    
    public abstract void operate();
    
    public abstract void specialAbility();
}

interface Flyable {
    public abstract void fly();
    
}

interface Searchable {
    public abstract void search();
    
}

interface Rescuable  {
    public abstract void  rescue();
}

class DroneBot extends Robot implements Flyable, Searchable{
    public DroneBot(String name, int batteryLevel) {
        super(name, batteryLevel);
    }

    @Override
    public void operate() {
        System.out.printf("드론봇이 공중에서 임무를 시작합니다.\n");
        
    }

    @Override
    public void fly() {
        System.out.printf("드론이 비행합니다.\n");
        
    }

    @Override
    public void search() {
        System.out.printf("드론이 수색 작업을 수행합니다.\n");
        
    }

    @Override
    public void specialAbility(){
        fly();
        search();
    }
    
}

class RescueBot extends Robot implements Rescuable{
    public RescueBot(String name, int batteryLevel) {
        super(name, batteryLevel);
    }

    @Override
    public void operate() {
        System.out.printf("구조봇이 현장에 투입됩니다.\n");
        
    }

    @Override
    public void rescue() {
        System.out.printf("구조 임무를 수행합니다.\n");
        
    }

    @Override
    public void specialAbility(){
        rescue();
    }

}

class HybridBot extends Robot implements  Flyable, Searchable, Rescuable{
    public HybridBot(String name, int batteryLevel) {
        super(name, batteryLevel);
    }

    @Override
    public void operate() {
        System.out.printf("하이브리드봇이 다기능 모드로 작동합니다.\n");
        
    }

    @Override
    public void fly() {
        System.out.printf("하이브리드봇이 비행합니다.\n");
        
    }

    @Override
    public void search() {
        System.out.printf("하이브리드봇이 수색작업을 수행합니다.\n");
        
    }

    @Override
    public void rescue() {
        System.out.printf("하이브리드봇이 구조임무를 수행합니다.\n");
        
    }

    @Override
    public void specialAbility(){
        fly();
        search();
        rescue();
    }
}
profile
학생

0개의 댓글