객체지향 프로그래밍과 함수형 프로그래밍

unow30·2021년 4월 15일
0

computer_science

목록 보기
1/9

1. 객체지향 프로그래밍

  • 객체지향 프로그래밍이란 인간 중심적 프로그래밍 패러디임이라고 할 수 있다. 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말한다.
  • 클래스는 '설계도'.
    객체는 '설계도로 구현한 대상', '클래스의 인스턴스'라고도 불림
    인스턴스는 클래스를 바탕으로 소프트웨어에 구현된 실체(메모리에 할당됨)를 말한다.

객체지향 프로그래밍의 특징

추상화

현실세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 앱에 필요한 특징들을 가져와 프로그래밍 하는 것이다. 클래스의 사용이 추상화의 예로 볼 수 있다.

캡슐화

객체의 세부 내용을 외부에 은폐하여 객체간 결합도가 낮다. 외부객체의 직접 개입이 불가능하여 유지보수와 소프트웨어 확장에 용이하다.

다형성

하나의 객체가 작업을 할 때 속성(변수)에 따라 여러가지 형태를 가질 수 있는 능력을 말한다.

상속성

정의된 상위 클래스의 모든 속성과 메소드를 하위 클래스가 물려받는 것을 말한다. 하위 클래스에서 다시 재정의할 필요 없이 사용할 수 있다. 재사용성을 증대시킨다.

객체 지향적 설계 원칙

SRP(Single Responsibility Principle) : 단일 책임 원칙

클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.

OCP(Open-Closed Principle) : 개방-폐쇄 원칙

확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.

LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

ISP(Interface Segregation Principle) : 인터페이스 분리 원칙

인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.

DIP(Dependency Inversion Principle) : 의존 역전 원칙

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.

2. 함수형 프로그래밍

  • 함수로 프로그래밍하는 사고를 배우는 것을 함수형 프로그래밍이라고 한다.
  • 계산을 수학적 함수의 조합으로 생각하여 상태변화를 멀리하는 프로그래밍 페러다임의 하나이다.
  • 일반적인 프로그래밍 언어에서 함수가 특정 동작을 수행하는 역할을 담당하는 것과는 반대되는 개념으로, 함수를 수행해도 함수 외부의 값이 변경될 수 없다.
  • 순수함수들을 조합하여 프로그래밍하는 방법이다.

함수형 프로그래밍의 원칙

순수함수

  • 동일한 입력에는 항상 같은 값을 반환해야 한다.
  • 함수의 출력은 오직 그 함수에 입력된 값에만 의존한다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 말아야 한다.(side effect가 없어야 한다.)
// 순수하지 않습니다 (반환값 없이 부가 효과를 이용하고 있습니다)
function addTaco(array) {
   array.push("taco");
}

// 순수하지 않습니다 (인자 대신 공유 변수를 이용하고 있습니다)
function addTaco() {
   return [...globalArray, "taco"];
}

// 순수합니다
function addTaco(array) {
   return [...array, "taco"];
}

불변성

javaScript에서 모든 원시 자료형(string, boolean)은 불변하다. 객체나 배열 등은 불변하진 않지만, 마치 그런 것처럼 다룰 수 있다.
객체나 배열이 만들어진 후에 수정하지 않아야 하며, 이런 불변 데이터는 스레드로부터 안전하고 오류에 대해 국소적이다.

const array = [1,2,3]
array.push(4) // 가변성

const array = [1,2,3]
const newArray = [...array, 4]//불변성

선언적 패턴

  • 선언적declarative 프로그래밍은 우리가 이루고자 하는 것을 설명한다.
  • 명령형imperative 프로그래밍은 우리가 그것을 이루는 방법을 설명한다.
  • javaScript의 고차함수, map, filter, reduce 등의 함수들은 선언현 패턴에 자주 쓰인다.
  • 함수에 함수를 인자로 전달하기, 반환값으로 함수를 전달하기, 모두 선언형 패턴에서 쓰일 수 있다.
명령형 패턴: 구현 방법이나 과정을 중시한다.(외부효과도 일어나고 있다.)
let array = [1,2,3]
for(let i = 0; i < array.length; i++){
  array[i] *= 2
}

선언형 패턴: 일련의 선언으로 구성된다.(외부효과도 없다.)
let array = [1,2,3]
let newArray = array.map(num=> num*2)

1급 객체

  • 1급 객체란 다음과 같은 조건을 만족하는 객체이다.
    • 객체를 변수나 데이터 구조안에 담을 수 있다.
    • 객체를 파라미터로 전달할 수 있다.
    • 객체를 반환값으로 사용할 수 있다.
    • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
    • 동적으로 프로퍼티 할당이 가능하다.
  • javaScript의 함수는 객체이므로 1급 함수라고 쓰인다.
  • 고차함수는 1급 함수의 부분집합이다.

커링

여러 인자를 받는 함수에 일부 인자만 넣어서 나머지 인자를 받는 다른 함수를 만들어낼 수 있는 방법
커링은 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 하는 것이다. 부분적으로 적용된 함수를 체인으로 계속 생성해 결과적으로 값을 처리하도록 하는 것이 그 본질이다.

function greet(greeting){
    return function(name){
        console.log(greeting + , ", " + name);
    }
}

const calcWith2 = (op)=>(num)=>op(2,num)
const add = (num1, num2) => num1+num2
const multiply = (num1, num2) => num1 * num2

const add2 = calcWith2(add)
const multiply2 = calcWith2(multiply)

add2(3)// 5
//add2(3)은 다음과 같이 함수의 선언으로 이루어저 있다.
calcWith2(add)
(add)=>(3)=>add(2,3)
(add)=>(3)=>(2,3)=> 2+3
5

multiply2(3)// 6
//multiply2(3)은 다음과 같이 함수의 선언으로 이루어저 있다.
calcWith2(multiply)
(multiply)=>(3)=>multiply(2,3)
(multiply)=>(3)=>(2,3)=> 2*3
6

0개의 댓글