객체 지향의 3대 속성
다형성
1) 하나의 부모로 파생된 여러 자식을 어떻게 묶을 것이냐 (하나로 모아주기 위해)
2) 자식들은 고유의 개성을 가진다
3) 화목하게 = 관리
능력발휘 = 개성을 드러내줘야 한다
최소한의 코드로 사용가능!
package ex03.inheritance.polymorphism11;
/*
[다형성]
1) 객체지향언어는 1개의 부모로부터 파생된 여러 형태의 자식들을
효율적으로 관리하기 위해 이런 문법을 추가했다
"부모 변수 = 자식 객체"
2) 자식들의 개성이 살아있어야 한다
2-1) 부모 변수에 자식 객체를 담는다
2-2) 부모 변수로 메서드를 호출한다
2-3) 이 때 부모메서드가 호출되는 것이 아니라 자식 객체의 메서드가 호출된다
*/
public class StarMain {
public static void main(String[] args) {
// 너희들은 내 자식이야(형제야!)
// 부모님을 중심으로 뭉쳤다
StarUnit[] sUnits = new StarUnit[3];
sUnits[0] = new Marine();
sUnits[1] = new SCV();
sUnits[2] = new Hydra();
for (int i = 0; i < sUnits.length; i++) {
endOfStarUnit(sUnits[i]);
}
}
/* StarUnit sUnit
* StarUnit 객체이거나
* 상속받은 자식객체
*/
public static void endOfStarUnit(StarUnit sUnit) { //부모를 전달받았지만 자식메서드 호출가능
for (int i = 0; i < 2; i++)
sUnit.move(); //객체의 메서드 호출 !
for (int i = 0; i < 5; i++)
sUnit.attack(); //객체의 메서드 호출 !
sUnit.die(); //객체의 메서드 호출 !
}
}
package ex03.inheritance.polymorphism11;
public class StarUnit {
public void move() {
System.out.println("이동한다~");
}
public void attack() {
System.out.println("공격한다~");
}
public void die() {
System.out.println("**************************\n");
}
}
package ex03.inheritance.polymorphism11;
public class SCV extends StarUnit {
@Override
public void move() {
System.out.println("지이잉~");
}
@Override
public void attack() {
System.out.println("징~파바팍~");
}
@Override
public void die() {
System.out.println("펑~");
super.die();
}
}
package ex03.inheritance.polymorphism11;
public class Marine extends StarUnit {
@Override
public void move() {
System.out.println("터벅 터벅~");
}
@Override
public void attack() {
System.out.println("두두두두~");
}
@Override
public void die() {
System.out.println("으아악~");
super.die();
}
}
package ex03.inheritance.polymorphism11;
public class Hydra extends StarUnit {
@Override
public void move() {
System.out.println("질질~");
}
@Override
public void attack() {
System.out.println("퉷~");
}
@Override
public void die() {
System.out.println("크아악~");
super.die();
}
}
자식 하나를 확장해도 쉽게 추가하여 메서드를 사용할 수 있다
package ex03.inheritance.polymorphism12;
/*
[다형성]
1) 객체지향언어는 1개의 부모로부터 파생된 여러 형태의 자식들을
효율적으로 관리하기 위해 이런 문법을 추가했다
"부모 변수 = 자식 객체"
2) 자식들의 개성이 살아있어야 한다
2-1) 부모 변수에 자식 객체를 담는다
2-2) 부모 변수로 메서드를 호출한다
2-3) 이 때 부모메서드가 호출되는 것이 아니라 자식 객체의 메서드가 호출된다
3) 새로운 자식을 생성해도 기존 코드의 변경을 최소화할 수 있다
기존 부모 변수를 사용해 메서드를 그냥 사용할 수 있다
*/
public class StarMain {
public static void main(String[] args) {
// 너희들은 내 자식이야(형제야!)
// 부모님을 중심으로 뭉쳤다
StarUnit[] sUnits = new StarUnit[4];
sUnits[0] = new Marine();
sUnits[1] = new SCV();
sUnits[2] = new Hydra();
sUnits[3] = new Tank();
for (int i = 0; i < sUnits.length; i++) {
endOfStarUnit(sUnits[i]);
}
}
/* StarUnit sUnit
* StarUnit 객체이거나
* 상속받은 자식객체
*/
public static void endOfStarUnit(StarUnit sUnit) {
for (int i = 0; i < 2; i++)
sUnit.move(); //객체의 메서드 호출 !
for (int i = 0; i < 5; i++)
sUnit.attack(); //객체의 메서드 호출 !
sUnit.die(); //객체의 메서드 호출 !
}
}
package ex03.inheritance.polymorphism12;
public class Tank extends StarUnit {
@Override
public void move() {
System.out.println("위이잉~");
}
@Override
public void attack() {
System.out.println("퍼엉, 펑~");
}
@Override
public void die() {
System.out.println("폭발~쾅");
super.die();
}
}
추상클래스로 정의해도 된다.
package ex03.inheritance.starInterface;
public abstract class StarUnit {
//불필요한 메서드 추상메서드로 정의
public abstract void move();
public abstract void attack();
//자식들이 써먹는 유일한 메서드. (경계선 역할)
public void die() {
System.out.println("*********************");
}
}