1. 객체지향 프로그래밍(OOP)
객체지향 프로그래밍(OOP)은 객체 및 이들간의 관계, 상호작용 등을 기반으로 프로그램을 설계하는 방법론 및 프로그래밍 패러다임
데이터를 중심으로, 해당 데이터를 처리하는 기능(메서드)를 하나의 단위(클래스)로 묶어 코드의 재사용성, 유지보수성, 확장성을 높이는 데에 목적이 있다.
2. 객체지향 프로그래밍(OOP)의 핵심 개념 4가지
1. 추상화 (Abstraction)
불필요한 세부사항은 숨기고, 핵심 개념만 모델링하는 것.
메서드들이 어떻게 작동하는지 같은 디테일은 생략, 그 본질을 들여다보는 것.
ex) 자동차 - start(), drive() 어떻게 drive가 이뤄지는지는 중요하지않음
2. 캡슐화 (Encapsulation)
데이터와 데이터를 다루는 메서드를 하나의 클래스 안에 감추고 보호하는 것.
프로퍼티, 메서드들을 묶는 것인데, 외부에서 이렇게 묶은 내용들의 내부를 들여다보지 못하게 해야 한다.
이를 위해 접근 제어자 등의 수단을 통해 외부로부터의 접근을 막는 것을 정보 은닉이라고 한다. 따라서, 캡슐화와 정보 은닉은 다른 개념.
결국, 캡슐화를 먼저 하고 나서 "어떤 정보는 보여주고 어떤 정보는 숨길 것인가?"를 결정하면서 정보 은닉이 이뤄지고 이는 캡슐화의 목적 중 하나가 된다.
접근 제어자 - private, fileprivate, internal, public, open
3. 다형성 (Polymorphism)
동일한 이름의 메서드가 다양한 방식으로 동작하는 것.
어느 메서드가 어느 맥락에 있는 지에 따라 어떻게 동작하고 어떤 의미를 가지는 지 .. 다르게 해석될 수 있음을 말한다.
짧게 예를 들자면 Vehicle 클래스를 상속받는 Car, Bicycle 두 클래스가 경적을 울리는 동일한 메서드를 쓴다고 해도 각자 탈 것에 맞는 소리를 내도록 구현이 될 것. 같은 메서드명이라도 다르게 실행되는 개념으로 객체 지향 프로그래밍의 핵심이라고 할 수 있다.
오버로드, 오버라이딩 등의 개념이 있다.
4. 상속 (Inheritance)
기존 클래스의 특성과 기능을 자식 클래스가 물려받아 재사용하는 것.
코드 중복을 줄이고, 계층 구조를 만들 수 있다.
3. 객체지향 프로그래밍의 장점
- 코드 재사용성: 클래스 상속과 조합으로 기존 코드 재활용 가능
- 유지보수 용이: 객체 단위로 나눠져 있어 수정 시 영향 범위 최소화
- 확장성: 새로운 기능을 기존 구조에 맞춰 손쉽게 추가
- 가독성 향상: 역할별로 객체가 나뉘어 있어 코드 구조가 명확
장점들을 보니 아키텍처를 쓰면서 유지보수적으로 느꼈던 좋은 점들을 떠올릴 수 있었음.
이번 MOUP에서 쓰던 클린 아키텍처의 경우 usecase의 재사용이 많았고, 객체 단위로 쪼갰기에 특정 코드에 문제가 있는지 등을 좀 더 수월하게 찾을 수 있었는데 이 모든게 결국 OOP 기반으로 만들어져있었기에 나올 수 있는 것.