[Chapter 8] 컴포지션 예시가 좋은 예시인가..? #64
-
책의 "다양한 강한결합 사례와 대처 방법(p.160)"을 보면, 슈퍼클래스class PhysicalAttack {
int singleAtackDamage() {...}
int doubleAtackDamage() {...}
}
class FighterPhysicalAttack extends PhysicalAttack {
@Override
int singleAttackDamage() {
return super.singleAttackDamage() + 20;
}
@Override
int doubleAtackDamage() {
return super.doubleAtackDamage() + 20;
}
} 컴포지션class FighterPhysicalAttack extends PhysicalAttack {
PhysicalAttack physicalAttack;
int singleAttackDamage() {
return physicalAttack.singleAttackDamage() + 20;
}
int doubleAtackDamage() {
return physicalAttack.doubleAtackDamage() + 20;
}
} 책이는 "서브 클래스는 슈퍼 클래스의 구조를 신경쓰고, 슈퍼 클래스는 서브클래스를 신경쓰지 않고 변경한다", 저는 위 예시를 보면서 위 예시에선 저 설명을 잘 표현하지 못하지 않았나 생각이 들었는데요, 여러분은 위의 예시가 잘 납득이 되셨을지 궁금합니다. |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 1 reply
-
160p 내용입니다! public class PhysicalAttack {
int singleAttackDamage() {
return 10;
}
int doubleAttackDamage() {
return 25;
}
} public class FightPhysicalAttack extends PhysicalAttack {
@Override
int singleAttackDamage() {
return super.singleAttackDamage() + 10;
}
@Override
int doubleAttackDamage() {
return super.doubleAttackDamage() + 10;
}
} 이런 상속 구조에서 FightPhysicalAttack는 10 만큼 큰 데미지를 리턴하기 위한 목적으로 오버라이드 되었습니다. PhysicalAttack physicalAttack = new FightPhysicalAttack();
int damage = physicalAttack.doubleAttackDamage();
System.out.println("damage = " + damage); //35 이때 만약 부모 클래스가 이런 식으로 바뀐다면 결과가 달라집니다. public class PhysicalAttack {
int singleAttackDamage() {
return 10;
}
int doubleAttackDamage() {
return singleAttackDamage() * 2; //이렇게 바꼈다면?
}
} PhysicalAttack physicalAttack = new FightPhysicalAttack();
int damage = physicalAttack.doubleAttackDamage();
System.out.println("damage = " + damage); //50 (메서드 순서를 생각해보세요!) singleAttackDamage()를 오버라이드를 했기 때문에 원하는 대로 동작하지 않았고, 이래서 상속 구조에서 부모클래스의 메서드 구현을 알고 있어야 정확하게 오버라이드 할 수 있게 됩니다. 컴포지션을 사용하면 위임해서 메서드를 사용하니까 예상하지 못한 동작을 막을 수 있지 않을까요? |
Beta Was this translation helpful? Give feedback.
-
예전에 정리한 내용이 있는데, |
Beta Was this translation helpful? Give feedback.
160p 내용입니다!
이런 상속 구조에서 FightPhysicalAttack는 10 만큼 큰 데미지를 리턴하기 위한 목적으로 오버라이드 되었습니다.
이때 만약 부모 클래스가 이런 식으로 바뀐다면 결과가 달라집니다.