한 클래스는 하나의 책임만 가져야 한다는 원칙이다객체지향의 세계에서의
책임이란 어떤 객체가 어떤 요청에 대해 대답해줄 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체가책임을 가진다고 말한다. 즉, 어떤 기능을 담당한다고 생각하면 된다.
프로그램 유지보수를 용이하게 하기 위함이다.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;
}