Programming을 하거나 면접을 준비하면서 OOP에 대해서 들어봤던 적이 있을 것이다. OOP에 대해서 객체 지향 프로그래밍이라는 말은 하지만 그게 무엇인가? 막연하다. 이러한 막연함을 아는 내용으로 바꾸기 위해서 posting을 통해 정리해 보려한다.
Object-Oriented Programming의 약자로 객체 지향 programming이라 한다.
풀어서 설명하면, programming에서 필요한 data를 추상화 시켜 상태와 행위를 가진 object(객체)로 만들어 그 object(객체)간 유기적인 상호작용을 통해 logic을 구성하는 것을 의미한다.
객체가 커지면 용량이 커질 수 있다.
객체로 이루어 지기에 객체가 커질 경우 memory의 용량을 많이 차지할 수 있다.
설계시 많은 시간과 노력이 필요하다.
class에서 만들어진 객체들간의 상호작용이 있어야 되기에 서로 유기적으로 연결이 될 수 있도록 설계되어야 한다. 그렇기 때문에 시간과 노력이 필요하다.
OOP에는 SOLID 5원칙이라는 것이 있다. 이 SOLID 5원칙은 객체 지향 programming을 하면서 지켜야하는 원칙이다. SRP, OCP, LSP, ISP, DIP의 initial을 따서 SOLID 원칙이라고 한다.
그럼 하나씩 어떤 것인지 살펴 보자.
SRP(Single Responsibility Principle : 단일 책임의 원칙)
작성된 class는 하나의 기능을 가져야 한다. 하나의 기능을 가지기 때문에 변경을 할 때도 한가지 이유만 있어야 한다는 것이다.
즉, class 설계 시 하나의 기능을 갖도록 설계해야 하며, 그 기능에 집중해야 한다는 것을 의미한다.
만약 이 원칙이 지켜지지 않는다면, 한 책임의 변경에 의해 다른 책임과 관련된 code에 영향을 미칠 수 있다. 그러면 유지보수 시 매우 비효율적이게 된다.
OCP(Open Close Principle : 개방 폐쇄의 원칙)
확장에는 열려있고 변경에는 닫혀 있어야 한다. 즉, 기존 code를 변경하지 않고, 기능을 수정하거나 추가할 수 있도록 설계해야 한다는 의미이다. 이 원칙을 지킴으로써 code 재사용 및 확장의 유연성을 높일 수 있다.
LSP(Liskov Substitution Principle : 리스코브 치환 원칙)
자식 객체는 부모 객체에서 가능한 행위를 수행할 수 있어야 한다. 즉, 부모 객체와 자식 객체 사이의 기능이 일관성이 있어서 부모 객체를 자식 객체로 치환해도 정상적으로 동작해야 하는 것을 의미한다.
이 원칙은 OCP(개방 폐쇄 원칙)과도 연관이 있다. 이 원칙을 지키지 않는다면, 기능 확장 시 여러 번의 code 수정이 필요할 것이다.
ISP(Interface Segregation Principle : 인터페이스 분리 원칙)
Class는 자신이 사용하지 않을 interface를 만들지 않아야 하며 의존하지 않아야 한다. 또한 class가 다른 class에 종속적일 때는 최소한의 interface만 사용하여야 한다.
그래서 큰 단위의 interface는 구체적이면서 작은 interface로 분리해서 class에서 필요한 method만 사용할 수 있도록 해야 한다.
즉, 핵심은 client가 필요로 하는 interface들을 분리함으로써, client가 사용하지 않는 interface에 변경이 일어나도 영향을 받지 않는 것이다.
DIP(Dependency Inversion Principle : 의존 역전 원칙)
관계를 맺을 때 변하기 쉬운 것(구체적인 것)에 의존하기 보다는 변하기 어려운 것(추상적인 것)에 의존을 해야한다. 즉, 구체화 된 class에 의존하기 보다는 추상적인 class에 의존해야 한다는 의미이다.
따라서, 상위 level에서 정의한 추상적인 구현을 하위 level에서 구현하는 것을 말한다.
이렇게 이번 posting에서는 OOP의 정의와 특징, 그리고 SOLID 5원칙에 대해서 정리해 보았다. 객체 지향 programming은 확장 및 독립성을 특징으로 가지는 것으로 보인다.
지금껏 Programming을 하면서 객체 지향 언어인 Python의 특성을 살려 programming을 하고 있는 지 스스로 한번 되돌아보았다. 앞으로는 이 특징 들을 잘 살려서 programming을 할 수 있도록 해야겠다.