📌 OOP(Object Oriented Programming)
- Class와 Object에 기반한 디자인 패턴이다.
- 연관된 데이터들끼리 Class로 묶어주고 그 안에서 Object instance를 만들어 프로그래밍해준다.
장점
- 코드의 재사용률을 높이고 코드를 간결하게 함으로써 유지보수가 쉽다.
- 데이터의 캡슐화 혹은 추상화를 통하여 안전하게 보존시킬 수 있다.
대표적인 언어
- C++, Java, Javascript, Python 등의 객체제향적인 언어들
캡슐화(Encapsulation)
- Class의 내부 변수와 메소드를 하나로 패키징한다고 보면 된다.
- 객체의 내부 로직을 감추고 외부에는 상대적으로 안정적인 부분만을 공개하여 데이터를 안전하게 보존한다.
- 외부에서 접근할 때에는 반드시 정해진 메소드를 통해 상호작용할 수 있도록 한다.
- 마치 우리가 종종 섭취하게 되는 알약과 같이 필요한 데이터 혹은 밀접한 데이터들을 한 알약 속에 가둔다고 볼 수 있다.
추상화(Abstraction)
- 공통점을 찾아 Class로 묶어주고 복잡한 디테일을 제거함으로써 단순하게 만든다.
- 즉, 불필요한 코드를 제거하고 중요한 부분을 살린다.
- 위의 예시를 보면, 우리는 아우디, 벤츠, 현대 등 다양한 차들을 볼 수 있다. 그런데 이 차들은 모두 '자동차'라는 하나의 객체에서부터 파생되었다. 이 때의 '자동차'라는 객체를 추상화된 객체라고 보면 된다.
📌 Functional Programming
- Functional Programming은 부작용이 없는 순수한 함수를 구현하는 디자인 패턴이다. 여러 개의 작은 함수들을 엮어 큰 함수를 구현하고 불변성을 지키게 된다.
장점
- 높은 수준의 추상화를 제공한다.
- 함수 단위의 코드 재사용성이 증가한다.
- 디버깅이 쉽다.
- 불변성을 지향하여 프로그램의 동작을 예측하기 쉽다.
대표적인 언어
- Clojure, Swift, Haskell, Scala 등
위 언어들을 사용해본 경험이 없어 다소 이해도가 낮다.
고차함수
- FP와 같은 함수형 프로그래밍에서는 여러 작은 순수 함수들을 연쇄적 혹은 병렬적으로 호출해 더 큰 함수를 만들어간다.
- 함수의 파라미터로 함수를 전달할 수 있고, 함수의 반환값으로 함수를 사용할 수 있다.
(이전에 swift를 잠깐 공부했었는데, 파라미터로 함수를 전달하고 반환값으로 함수를 받는 코드를 보고 굉장히 놀란 적이 있다!!🫢)
불변성
- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 복사본을 만들어 일부만 변경 후 복사본을 사용해 작업한다.
순수함수
- 동일한 Input에는 항상 같은 값의 Output을 반환해야한다.
- 부작용 즉, side effect가 없어야한다.