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
반응형
'즐거운프로그래밍' 카테고리의 다른 글
[자바] 예외(Exception) (0) | 2023.11.14 |
---|---|
[자바] 싱글톤 패턴(singleton) (0) | 2023.11.14 |
[자바] 인터페이스(interface) (0) | 2023.11.13 |
[자바] 상속(inheritance) (0) | 2023.11.13 |
[자바] 값에 의한 호출과 객체에 의한 호출 : 전달받은 숫자를 1만큼 증가시키는 update메서드 (0) | 2023.11.13 |