한 클래스는 하나의 책임만 가져야 한다
는 원칙이다객체지향의 세계에서의
책임
이란 어떤 객체가 어떤 요청에 대해 대답해줄 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체가책임
을 가진다고 말한다. 즉, 어떤 기능을 담당한다고 생각하면 된다.
프로그램 유지보수를 용이하게 하기 위함
이다.class Restaurant
{
void Order(); // 주문
void Cook(); // 요리
void Serving(); // 서빙
}
위와 같이 식당은 주문, 요리, 서빙의 3가지 책임을 가지고 있다. 만약 주문 기능에 수정사항이 생기면 이는 곧 요리와 서빙에도 영향을 미칠 수 있게 된다.
class Shef()
{
void Cook();
}
class Customer
{
void Order();
}
class Server
{
void Serving();
}
하지만 각각의 기능을 분리하게 되면 하나의 클래스는 하나의 기능만을 담당하게 되므로 쉐프의 기능이 변경되더라도 고객이나 서버에게 영향을 미치지 않는다.
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
추상화
와 다형성
을 통해 OCP를 지향할 수 있다확장에 열려있다 -> 새로운 변경 사항이 생겼을 때 유연하게 코드를 추가함으로써 쉽게 기능을 확장할 수 있음
변경에 닫혀있다 -> 새로운 변경 사항이 생겼을 때 객체의 직접적인 수정을 제한함
class Creature
{
protected int _hp;
}
class Knight : Creature
{
_hp = 100;
int _mp = 100;
}
class Monster : Creature
{
_hp = 50;
}
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다
class Creature
{
virtual void Hit()
{
_hp -= 10;
}
}
class Knight : Creature
{
void Hit() override
{
_hp -= 10; // 부모 클래스 기능 수행
BleedingRedBlood(); // 자식 클래스 기능 수행
}
}
class Elf : Creature
{
void Hit() override
{
_hp -= 10; // 부모 클래스 기능 수행
BleedingGreenBlood(); // 자식 클래스 기능 수행
}
}
class NPC : Creature
{
void Hit() override; // NPC는 피격이 되지 않기 때문에 Creature의 기능을 수행할 수 없다
}
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
C++에서의 인터페이스는 추상 클래스이다.
class Creature abstract
{
virtual void Walk() abstract;
virtual void Fly() abstract;
}
class Knight : Creature
{
virtual void Walk() abstract;
virtual void Fly() abstract;
}
class Bird : Creature
{
virtual void Walk() abstract;
virtual void Fly() abstract;
}
class Creature abstract
{
virtual void Walk() abstract;
}
class FlyCreature abstract
{
virtual void Walk() abstract;
}
class Knight : Creature
{
virtual void Walk() abstract;
}
class Bird : FlyCreature
{
virtual void Fly() abstract;
}
추상화에 의존해야지 구체화에 의존하면 안된다
class Creature
{
virtual void Attack();
virtual void Defence();
}
class Knight : Creature
{
void Attack() override;
void Defence() override;
}
class Monster : Creature
{
void Attack() override;
void Defence() override;
}