たけいせい

4351 ワード

オブジェクト向けの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();				//객체의 메서드 호출 ! 
	}	
}
Tankのみ追加
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("*********************");
	}
}