객체 지향 프로그래밍(Object Oriented Programming). 학교 수업에서도 회사 면접에서도 중요하게 다루지만 객체 지향 프로그래밍이 뭔지 아직도 정확히 이해하지 못했다. OOP에 대해 한번 알아보자.
객체 지향 프로그래밍이란 인간 중심적 프로그래밍 패러다임이다. 현실 세계를 프로그래밍으로 가져와서 사용하는 것을 말한다. 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 어플리케이션에 특징들을 뽑아와 프로그래밍 하는 것이다. 이것을 추상화라고 한다.
OOP로 코드를 작성하면 재사용성이 높다. 로직을 라이브러리로 만들어 두면 계속해서 사용할 수 있고, 신뢰성을 확보할 수 있다. 또한 각각의 라이브러리의 예외상황을 잘 만들어 두면 버그 발생도 줄일 수 있고, 내부의 세밀한 동작을 몰라도 개발자가 기능을 사용할 수 있어서 생산성이 높아진다. 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수도 용이하다.
객체 지향적 설계 원칙
1. SRP(Single Responsibility Principle) : 단일 책임 원칙
클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유여야 한다. 변경에 있어 파급효과가 적어야 한다.
2. OCP(Open -Closed Principle) : 개방-폐쇄 원칙
확장에는 열려 있고, 변경에는 닫혀 있어야 한다. 다형성을 활용한다.
3. LSP(Loskov Substitution) : 리스코프 치환 원칙
상위의 객체를 하위의 객체로 치환해도 상위 객체를 사용하는 프로그램은 정상적으로 동작해야 한다. 인터페이스 규약을 지킨다(악셀을 밟으면 앞으로 가게 구현해야한다).
4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다. 인터페이스가 명확해지고, 대체 가능성이 높아진다.
5. DIP(Dependency Inversion Principle) : 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 한다.
다형성만으로는 OCP, DIP를 지킬 수 없다.
스프링은 DI, DI 컨테이너 제공을 통해 OCP, DIP를 지원한다.
의존하다≒안다
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다.
ex) 레고 블럭 조립하듯이, 부품을 갈아 끼우듯이
객체지향의 다형성
ex)배역이라는 역할은 인터페이스, 배우라는 구현은 객체(인터페이스를 구현한 클래스) -> 배우(객체)는 대체가 가능해야한다.
역할과 구현으로 구분
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
객체 설계시 역할을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체사이의 관계에서 시작해야함
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
인터페이스를 안정적으로 잘 설계하는 것이 중요!
참고
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Development_common_sense
'Computer Science > 개발상식' 카테고리의 다른 글
UX란 무엇인가? (0) | 2022.01.24 |
---|---|
NTP란 무엇인가? (0) | 2021.11.05 |
MVC패턴이란 무엇인가? (0) | 2021.09.29 |
TDD란 무엇인가? (0) | 2021.09.29 |
RESTful한 API란 무엇인가 (0) | 2021.09.28 |