객체지향이란?
객체(Object), 클래스(Class), 인스턴스(Instance)
객체
클래스
인스턴스
- 메모리에 할당되어 있는 클래스
- 클래스를 이용해 실제로 메모리에 생성(표현)된 객체
객체지향 프로그래밍(Object Oriented Programming, OOP)의 4가지 특징
캡슐화 (Encapsulation)
- 객체를 설명하거나 표현할 수 있는 변수와 메서드를 하나의 단위(클래스)로 묶는 것
- 정보를 은닉하고, 외부로부터의 직접적인 접근을 제한
추상화 (Abstraction)
- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 공통된 부분을 클래스로 모델링
- 불필요한 세부적인 구현을 생략하고 객체의 중요한 부분에 집중하여 핵심적인 역할만 수행
상속 (Inheritance)
- 기존의 클래스를 활용하여 새로운 클래스를 만드는 메커니즘
- 부모 클래스(상위 클래스, 슈퍼 클래스)의 상태와 동작을 자식 클래스(하위 클래스, 서브 클래스)가 이어 받아 재사용
- 클래스 간 계층 구조를 구성하여 코드를 구조화
다형성 (Polymorphism)
- 어떤 객체의 속성이나 기능이 상황에 따라 다른 역할을 수행할 수 있도록 다양한 방식으로 구현하거나 사용할 수 있는 능력
- 동일한 이름을 가진 메서드가 여러 객체에서 다르게 동작할 수 있도록 하는 것
- 오버로딩과 오버라이딩을 통해 구현
OOP의 5가지 원칙 (SOLID 원칙)
객체지향 설계의 핵심은 낮은 결합도와 높은 응집도
결합이 강해지면 하나를 변경할 때 연결된 다른 부분도 변경할 가능성이 높아진다.
단일 책임 원칙 (SRP : Single Responsibility Principle)
- 하나의 클래스 - 하나의 책임
- 하나의 클래스는 최소한의 기능(하나의 기능)만을 가져야 한다.
- 만약 클래스가 수행하는 기능이 여러 개라면 메서드 간, 클래스 간의 강한 결합을 가질 가능성이 높아진다.
개방 폐쇄 원칙 (OCP : Open/Closed Principle)
- 확장에는 개방(Open), 변경(수정)에는 폐쇄(Closed)
- 확장(추가)할 때 기존의 코드를 변경하지 않아도 되게 끔 프로그램을 작성해야 한다.
- 상속이나 인터페이스 활용
리스코프 치환 원칙 (LSP : Liskov’s Substitution Principle)
- 자식 타입 객체는 부모 타입 객체에서 가능한 행위를 수행할 수 있어야 한다.
- 자식 타입 객체는 부모 타입 객체로 언제든 대체할 수 있어야 한다.
- 업캐스팅된 상태(부모 타입으로 선언 - 자식 타입의 인스턴스를 받음)에서 부모의 메서드를 수행할 수 있어야 한다.
- 결국 Override를 잘 활용해야 한다.
인터페이스 분리 원칙 (ISP : Interface Segregation Principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 인터페이스에 변경이 발생해도 다른 인터페이스는 영향을 받지 않도록 세부적인 인터페이스로 나눈다.
- 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공
의존관계 역전 원칙 (DIP : Dependency Inversion Principle)
- 구체화(자주 변하는 것)에 의존하면 안 된다. 추상화(변하기 어려운 것)에 의존해라.
- 구현 클래스에 의존하지 말고, 추상클래스나 인터페이스에 의존
- 어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조
[참고자료] https://inpa.tistory.com/entry/OOP-💠-객체-지향-설계의-5가지-원칙-SOLID [Inpa Dev 👨💻:티스토리]