객체 지향 프로그래밍은 프로그램을 어떻게 설계할지에 대한 일종의 개념이자 방법론이다. 이는 우리가 실생활에서 사용되는 모든 것들을 객체라고 하며, 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 구성하는 것을 말한다.
협력 : 객체들 간의 상호작용
책임 : 객체가 할 수 있는 행동이다. 즉, 알고 있는 것과 할 수 있는 것으로 구분될 것이다.
하나의 클래스는 하나의 책임만 가져야 한다. 우리는 하나의 클래스가 어떤 일을 수행할 것인지에 대해서 결정을 하고, 이에 맞는 일을 수행하고, 이와 관련된 정보만 가지고 있을 수 있도록 해야 한다는 것이다.
확장에는 열려있으나 변경에는 닫혀 있어야 한다. 우리는 클래스 내의 많은 메서드를 가지고 있을 것이다. 이 메서드 내부에서 어떠한 변경이 있을 때, 사용된 모든 곳에서 변경을 해야 한다면, OCP를 잘 지키 못한 것이다.
서브 타입은 기본 타입으로 대체 가능해야 한다. 즉, 자식 클래스는 부모 클래스로 대체 될 수 있어야 한다는 것이다. 서브 클래스는 부모 클래스를 상속하고 역할을 모두 수행하면서 추가적인 기능을 수행을 하게 될 텐데, 부모 클래스를 대신 사용하여도 프로그래밍의 잘못된 동작이 없어야 한다.
클래스 내에서 사용하지 않는 인터페이스는 구현하지 말아야 한다. 클라이언트 객체는 사용하지 않는 메서드에 의존해서는 안된다. 즉, 클래스가 가지는 역할보다 큰 Interface를 구현하지 말자는 의미이다. 즉, 사용되지 않는 메서드를 가지고 있는 인터페이스를 사용하는 것은 자신이 가지고 있는 역할보다 큰 책임을 가지게 되기 때문이다.
상위 모듈은 하위 모듈에 의존해서는 안된다. 두 모듈은 추상화된 인터페이스에 의존해야 한다. 우리는 기본적으로 클래스를 생성하고, 이 클래스를 직접적으로 타입으로 선언을 하게 되는 데, 이는 상위 모듈이 하위 모듈을 직접적으로 의존하게 되는 부분이 될 수도 있다. 그렇기 때문에 추상화된 인터페이스를 통해서 서로가 인터페이스를 의존할 수 있도록 구현하여야 한다.
참고한 자료
https://medium.com/@jgj455/오늘의-swift-상식-객체와-solid-원칙-270415c64b64
http://www.incodom.kr/객체_지향
https://brownbears.tistory.com/407
https://inuplace.tistory.com/946