OOP
Object Oriented Programming의 약자로써 class와 object에 기반한 프로그래밍 패러다임(디자인 패턴) 이다. 관련된 데이터끼리 묶어서 class를 형성하고 그 안에서 object instance를 만듬으로써 프로그램을 디자인한다.
- Imperative (명령형): how to solve
장점
- 코드의 재사용률을 높이고 코드를 간결하게 함으로써 유지보수가 쉽다.(DRY principle)
- 데이터를 안전하게 보존할 수 있다.(encapsulation와 abstraction등)
대표적인 언어
- C++, Java, Python, Javascript
✨ Features
Encapsulation(캡슐화)
객체의 내부 로직을 감추고 외부에는 상대적으로 안정적인 부분만을 공개함으로써 데이터를 안전하게 보존하는 기법이다. 캡슐화는 외부에 영향을 주지 않고 객체 내부의 구현을 변경할 수 있기 때문에 내부 로직에 대한 유연함을 제공한다.
- Implementation: 숨길 부분
- Interface: 공개할 부분
- 캡슐화는 객체의 "동작 구현"에 중점을 둠
장점
- 데이터를 안전하게 보존할 수 있음
- 개발자의 협업을 수월하게 함
- 유지보수가 쉬움
- 가독성의 증가
예시
- Closure
- 함수 구현
- Module pattern
Abstraction(추상화)
공통점을 찾아서 Class로 묶고 복잡한 디테일을 숨기고 핵심만 추출해내는 형태이다. 구현 세부사항 대신 큰 범위의 공통된 기능 측면에서 클래스를 개발하는 것이다.
예를들면, 페이 기능을 구현한다고 했을 때, 네이버페이, 카카오페이등은 모두 작동하는 방식은 다르지만 결제를 한다는 공통된 기능을 가지고 있다. 이 때 "공통된 기능"으로 하나로 묶는 방법이라고 할 수 있다. (공통된 클래스로부터 상속)
추상화는 "모델링"이며 구체적인 것을 상세히 하지 않고 필요성에 의한 특성만을 가지고 구성하는 것을 말합니다. 코드상에서는 동작의 구현을 제외한 선언하는 부분에 해당하며 "설계"하는 부분을 말합니다.
- 추상화는 객체의 "동작, 기능" 자체에 중점을 둠
- 캡슐화와 추상화는 상호 보완적임
장점
Inheritance(상속)
프로토타입을 기반으로 부모 클래스로부터 하위 클래스는 상속을 받을 수 있다.
장점
Polymorphism(다형성)
같은 이름을 가진 메소드라도 각 하위클래스의 상황에 맞게 다르게 구현될 수 있게 하는 것을 말한다. 즉 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다.
Method overriding
- 상위클래스의 매서드와 같은 이름, 매개변수를 재정의 하는것이다. 상위클래스에서 만들어진 메서드는 하위 클래스의 상황에 따라서 다시 재창조해서 사용하는 것을 말한다.
- Runtime에 이루어짐
Method overloading
- 같은 이름의 함수를 여러개 정의하고, 파라미터의 타입과 개수를 다르게 하여 파라미터에 따라 다르게 호출할 수 있게하는 것이다.
- 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지 않는다.
- Compile time에 이루어짐
Functional Programming
side effect가 없는 pure function을 구현함으로써 프로그램을 디자인한다. 여러개의 작은 function을 엮으며 하나의 큰 function을 구현하고 불변성을 지키게 됨.
- declarative(선언형): what to solve
장점
- 높은 수준의 추상화를 제공한다.
- 함수 단위의 코드 재사용이 증가한다.
- 디버깅이 쉽다.
- 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬움
대표적인 언어
- Clojure, Swift, Haskell, Scala
✨ Features
1급 객체 (First Object, 또는 1급 시민)
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값(return value)으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
고차 함수 (Higher Order Function)
함수형 프로그래밍에서는 여러 작은 순수 함수들을 연쇄적 혹은 병렬적으로 호출해서 더 큰 함수를 만들어나간다. 함수를 엮기위해서 HOC를 활용해야 한다.
- 함수의 파라미터로 함수를 전달할 수 있다.
- 함수의 반환값으로 함수를 사용할 수 있다.
불변성(Immutablility)
데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터를 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
순수함수(Pure function)
- 동일한 인풋에는 항상 같은 값의 아웃풋을 반환해야 한다.
- 사이드 이펙트가 없어야한다.