본문 바로가기

프로그래밍 공부/Java

Java - Java의 다형성 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
interface Cannon{
    void fireCannon();
}
 
interface Missile{
    void fireMissile();
}
 
interface Nuclear{
    void fireNuclear();
}
 
class Cannon1 implements Cannon{
    @Override
    public void fireCannon() {
        System.out.println("1단계 대포 : 펑!");
    }
}
 
class Cannon2 implements Cannon{
    @Override
    public void fireCannon() {
        System.out.println("2단계 대포 : 펑펑!");
    }
}
 
class Cannon3 implements Cannon{
    @Override
    public void fireCannon() {
        System.out.println("3단계 대포 : 콰쾅!");
    }
}
 
class InstallMissile implements Missile{
    @Override
    public void fireMissile() {
        System.out.println("미사일 발사 : 슈~펑!");
    }
}
 
class InstallNuclear implements Nuclear{
    @Override
    public void fireNuclear() {
        System.out.println("핵 미사일 발사 : 초전박살!");
    }
}
 
abstract class Tank{
    private String tName;
    private Cannon cannon;
    private Missile missile;
    private Nuclear nuclear;
    
    Tank(String tName, Cannon cannon){
        this.tName = tName;
        this.cannon = cannon;
    }
    
    Tank(String tName, Cannon cannon, Missile missile){
        this(tName, cannon);
        this.missile = missile;
    }
    
    Tank(String tName, Cannon cannon, Missile missile, Nuclear nuclear){
        this(tName, cannon, missile);
        this.nuclear = nuclear;
    }
    
    public void printTankName() {
        System.out.printf("%s : ", tName);
    }
    
    public void fireCannon() {
        if(cannon == null) {
            return;
        }
        printTankName();
        cannon.fireCannon();
    }
    
    public void fireMissile() {
        if(missile == null) {
            return;
        }
        printTankName();
        missile.fireMissile();
    }
    
    public void fireNuclear() {
        if(nuclear == null) {
            return;
        }
        printTankName();
        nuclear.fireNuclear();
    }
}
 
class Tank1 extends Tank{
    public Tank1(String name, Cannon cannon) {
        super(name, cannon);
    }
}
 
class Tank2 extends Tank{
    public Tank2(String name, Cannon cannon, Missile missile) {
        super(name, cannon, missile);
    }
}
 
class Tank3 extends Tank{
    public Tank3(String name, Cannon cannon, Missile missile, Nuclear nuclear) {
        super(name, cannon, missile, nuclear);
    }
}
 
public class Main{
    public static void main(String[] args) {
        Tank1 tank1 = new Tank1("레벨1 탱크"new Cannon1());
        Tank2 tank2 = new Tank2("레벨2 탱크"new Cannon2(), new InstallMissile());
        Tank3 tank3 = new Tank3("레벨3 탱크"new Cannon3(), new InstallMissile(), new InstallNuclear());
        
        tank1.fireCannon();
        tank1.fireMissile();
        tank1.fireNuclear();
        
        tank2.fireCannon();
        tank2.fireMissile();
        tank2.fireNuclear();
        
        tank3.fireCannon();
        tank3.fireMissile();
        tank3.fireNuclear();
    }
}
cs