다형성

jinkyung·2021년 1월 15일
0

JAVA2

목록 보기
17/35

객체 지향의 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("*********************");
	}
}

0개의 댓글

관련 채용 정보