OOP vs FP

양세희·2022년 5월 27일
0
post-thumbnail

OOP

Object Oriented Programming의 약자로 class와 object에 기반한 프로그래밍 패러다임(디자인 패턴)이다.

OOP는 관련된 데이터끼리 묶어 class를 형성하고 그 안에서 object instance를 만듬으로써 프로그램을 디자인 해준다.

[OOP의 장점]

  • OOP는 코드의 재사용률을 높이고 코드를 간결하게 함으로써 유지보수가 쉽다는 장점이 있다. (DRY pinciple)
  • 데이터를 안전하게 보존시킬 수 있다.
    (encapsolution(캡슐화)과 abstraction(추출화) 등)

[대표적인 언어]

  • C++, Java, Python, JavaScript 등

[특징]

1. Encapsulation (캡슐화)

캡술화는 객체의 내부 로직은 감추고 외부에는 상대적으로 안정적인 부분만을 공개함으로써 데이터를 안전하게 보존하는 기법이다. 캡슐화는 외부에 영향을 주지 않고 객체 내부의 구현을 변경할 수 있기 때문에 내부 로직에 대한 유연함을 제공한다.

  • Implementation: 숨길 부분
  • Interface: 공개할 부분
  • 캡슐화는 객체의 "동작 구현"에 중점을 둔다.

[장점]

  • 데이터를 안전하게 보존할 수 있다.
  • 개발자의 협업을 수월하게 한다.
  • 유지보수가 쉽다.
  • 가독성이 증가한다.

[예시]

  • Closure
  • 함수 구현
  • Module pattern

2.Abstraction (추상화)

추상화는 공통점을 찾아 Class로 한번에 묶고 복잡한 디테일을 숨기고 핵심만 추출해나가는 형태이다. 구현 세부사항 대시 큰 범위의 공통된 기능 측면에서 클래스를 개발하는 것이다.

예를 들어, 결제 페이 기능을 구현한다고 할때, 네이버 페이, 카카오 페이등은 모두 작동하는 방식은 달라도 결제를 한다는 공통된 기능을 가지고 있다.
이때 "공통된 기능"을 하나로 묶는 방법이라고 할 수 있다.
(공통된 클래스로부터 상속)

다시 말해, 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악해 필요없는 특성들을 제거해나가는 작업을 말한다.

  • 추상화는 객체의 "동작, 기능" 자체에만 중점을 둔다.
  • 캡슐화와 추상화는 상호 보완적이다.

[장점]

  • 유지보수가 낮다.
  • 가독성이 증가한다.

3. Inheritence (상속)

상속은 프로토타입을 기반으로 부모 클래스부터 하위 클래스는 상속을 받을 수 있다.
상위 클래스의 모든 것을 하위 클래스가 모두 이어받는 것이다. 즉, 부모가 자식에게 유전자를 물려주듯 부모의 특징을 자식에게 모두 물려주는 행위이다.

[장점]

  • 코드의 재사용성이 증가한다.
  • 기존에 작성된 클래스를 재사용할 수 있다.
  • 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면,
    자식 클래스에서 해당 멤버를 작성하지 않아도 된다.
  • 프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에
    유지보수가 쉬워 매우 경제적이다.

4. Polymorphism (다형성)

같은 이름을 가진 메소드라도 하위클래스의 상황에 맞게 다르게 구현될 수 있게 하는 것을 말한다. 즉, 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다.

[Method overriding]

  • 상위 클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것이다.
    상위클래스에서 만들어진 메서드는 하위 클래스의 상황에 따라
    다시 재창조해 사용하는 것을 말한다.

  • Runtime에 이루어진다.

[Method overloading]

  • 같은 이름의 함수를 여러개 정의하고, 파라미터의 타입과 개수를 다르게 해서 파라미터에 따라 다르게 호출할 수 있게 하는 것을 말한다.

  • 메서드끼리 이름은 가지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용돼서 메서드 이름이 같아도 문법 에러가 나지 않는다.

  • Compile time(컴파일 타임)에 이루어진다.

[단점]

  • 객체가 처리하려는 것에 대한 정확한 이해가 필요해
    설계 단계부터는 많은 시간이 소모될 우려가 있다.

  • 객체지향언어는 대체적으로 실행속도가 느린 편이다.

  • 다중 상속이 지원되는 C++ 같은 경우에 너무 복잡해져
    코딩의 난이도가 상승할 수 있다.

Funtional Programming

FP(Functional Programming)은 Side effect(부작용)이 없는 Pure function(순수 함수)를 구현함으로써 프로그램을 디자인 한다. 여러개의 작은 function을 엮어 하나의 큰 function을 구현하고 불변성을 지키게 된다.

[장점]

  • 높은 수준의 추상화를 제공한다.
  • 함수 단위의 코드 재사용성이 증가한다.
  • 디버깅이 쉽다.
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉽다.

[대표적인 언어]

  • Clojure, Swift, Haskell, Scala

1. 1급 객체 (First Object)

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

2. 고차함수 (Higher Order Function)

함수형 프로그래밍에서는 여러 작은 순수 함수들을 연쇄적 혹은 병렬적으로 호출해 더 큰 함수를 만들어 간다. 함수를 엮기 위해 HOC(고차 컴포넌트)를 잘 활용해야 한다.

  • 함수의 파라마터로 함수를 전달할 수 있다.
  • 함수의 반환값으로 함수를 사용할 수 있다.

3. 불변성 (Immutablility)

데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고도 그 데이터를 복사본을 만들어 그 일부만 변경하고, 변경한 복사본을 사용해 작업을 진행한다.

4. 순수함수 (Pure function)

  • 동일한 인풋에는 항상 같은 값의 아웃풋을 반환해야 한다.
  • 사이드 이펙트가 없어야 한다.

0개의 댓글