즐거운프로그래밍

[자바] 다형성(polymorphism)

수수께끼 고양이 2023. 11. 13. 18:09
728x90
반응형

다형성(polymorphism) : 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것

다형성을 이용하면 복잡한 형태의 분기문을 간단하게 처리할 수 있다.

 

Main.java

class MyApp extends App { // 상속
    public MyApp(String name) { // 생성자
        super(name);
    }
    @Override
    void show_menu() { // 오버라이딩
    }
}
// 상속, 생성자, 오버라이딩 = 다형성

public class Main {
    public static void main(String[] args) throws IOException {
        App app = new MyApp("MyApp"); // 1. app을 만들고, 다형성
        app.add("1", new CmdListener() { // 인터페이스의 다형성
            @Override
            public void processCmd() {
                System.out.println("process 1");
            }
        });
        app.add("2", new CmdListener() {

            @Override
            public void processCmd() {
                System.out.println("process 2");
            }
        });

        app.add("3", new MyCmdlistener());
        // CmdListener listener - new MyCmdListener()

        app.exec(); // while 문 포함, cmd loop // 2. app을 실행하고
    }
}
class MyCmdlistener implements CmdListener {

    @Override
    public void processCmd() {
        System.out.println("process 3");
    }
}

 

CmdListener.java(인터페이스)

 

public interface CmdListener {
    void processCmd();
}

 

App.java

import java.io.IOException;
import java.util.HashMap;

abstract public class App {
    String name; // 속성
        HashMap<String, CmdListener> cmdMap;
        App(String name) {  // 생성자
            this.name = name;
            this.cmdMap = new HashMap<>();
        }
        abstract void show_menu(); // 추상 클래스(위에도 추상클래스화)

        private int get_cmd() throws IOException { // 바깥쪽에서 쓰지 못하게 private로 함
            int cmd = System.in.read();
            return cmd;
        }

        final void add(String cmd, CmdListener listener) { // final = 오버라이딩용이 아니다
            cmdMap.put(cmd,listener);
        }

        final void exec() throws IOException {
            while (true) { // command loop, .message loop, event loop
                show_menu();
                int cmd = get_cmd(); // 일반화
                if(cmd==10) continue;
                String cmd_str = String.format("%c", cmd);
                System.out.println(cmd_str);
                if (cmdMap.containsKey(cmd_str)) {
                    CmdListener listener = cmdMap.get(cmd_str);
                    listener.processCmd();
                }
                if(cmd=='q') break;
            }
        }
}

 

 


Main.java 전체코드

import java.io.IOException;
import java.util.HashMap;

class MyApp extends App { // 상속
    public MyApp(String name) { // 생성자
        super(name);
    }
    @Override
    void show_menu() { // 오버라이딩
    }
}

// 상속, 생성자, 오버라이딩 = 다형성

public class Main {
    public static void main(String[] args) throws IOException {
        App app = new MyApp("MyApp"); // 1. app을 만들고, 다형성
        app.add("1", new CmdListener() { // 인터페이스의 다형성
            @Override
            public void processCmd() {
                System.out.println("process 1");
            }
        });
        app.add("2", new CmdListener() {

            @Override
            public void processCmd() {
                System.out.println("process 2");
            }
        });

        app.add("3", new MyCmdlistener());
        // CmdListener listener - new MyCmdListener()

        app.exec(); // while 문 포함, cmd loop // 2. app을 실행하고
    }
}

class MyCmdlistener implements CmdListener {

    @Override
    public void processCmd() {
        System.out.println("process 3");
    }
}

 

 

 

 

728x90
반응형