OOP(Object Oriented Programming)란?
현실 세계의 사물및 개념들을 객체로 보고, 그 객체들을 조립하여 프로그래밍 하는 기법
절차지향적 프로그래밍에서 있었던 코드의 재사용성과 중복제거가 가장 큰 목적으로 만들어진 기법
객체지향의 4가지 특성
1. 추상화
- 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법
- 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것
(ex: 남자 와 여자의 추상적 객체 = 사람)
2. 캡슐화
- 외부로부터 데이터 보호, 은닉 / 유지보수의 용이성 증가시킨다.
- 캡슐화란 클래스 내의 연관된 속성(property)이나 함수(method)를 하나의 캡슐로 묶어 외부로부터 클래스로의 접근을 최소화하는 것을 의미한다.
- 클래스의 캡슐화는 public, static, private, protected와 같은 접근제한자를 통해 구현할 수 있다.
3. 상속화
- 대상을 객체로 추상화/구현할 때, 기존에 구현한 클래스를 재활용하여 구현할 수 있는 것을 의미한다.
- 재활용한 클래스:상위 클래스 / 기존 클래스를 재활용하여 구현한 클래스: 하위 클래스
- 이러한 상속을 통해 코드 재사용성을 높일 수 있다.
4. 다형화
- 같은 형태이지만 다른 기능을 하는 것
- 어떤 객체의 속성이나 기능이 상황에 따라 여러 형태로 변할 수 있다는 것을 의미
- 다형성을 구현하는 예시로는 상속/구현 상황에서 메서드 오버라이딩/오버로딩이 있다.
OOP의 5가지 설계원칙(SOLID)
1. SRP( Single Responsibility Principle, 단일 책임 원칙)
- 클래스는 하나의 책임만 가져야 한다.
- 단일 책임 원칙을 제대로 지키면 변경이 필요할 때 수정할 대상이 명확해진다.
2. OCP(Open-Closed Principle, 개방-폐쇄 원칙)
- 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다.
확장에 대해 열려 있다: 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다.
수정에 대해 닫혀 있다: 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.
3. LSP(Liskov Substitution Principle, 리스코프 치환 원칙)
- 하위 타입은 상위 타입을 대체할 수 있어야 한다
- 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다
4. ISP(Interface segregation principle, 인터페이스 분리 원칙)
- 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것
5. DIP(Dependency Inversion Principle, 의존 역전 원칙)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에 의존해야 한다
고수준 모듈: 입력과 출력으로부터 먼(비즈니스와 관련된) 추상화된 모듈
저수준 모듈: 입력과 출력으로부터 가까운(HTTP, 데이터베이스, 캐시 등과 관련된) 구현 모듈
- 비즈니스와 관련된 부분이 세부 사항에는 의존하지 않는 설계 원칙
- 의존 역전 원칙은 개방 폐쇄 원칙과 밀접한 관련이 있으며, 의존 역전 원칙이 위배되면 개방 폐쇄 원칙 역시 위배될 가능성이 높다.
참고: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]