[TIL] 220630

슬지로운 개발생활·2022년 6월 30일
0

TIL

목록 보기
70/73

programming paradigm

  • 절차지향 프로그래밍
  • 객체지향 프로그래밍
  • 함수형 프로그래밍
  • 함수형 반응형 프로그래밍

Functional Programming

방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되면서 함수형 프로그래밍 언어가 부각되기 시작됐다.

1. Pure Functions(순수함수)

  • 외부에 전혀 영향을 받지 않도록 작성해야한다.
  • 함수 안에서 외부 상태값을 변경한다면 절차지향적 프로그래밍일 확률이 높다.
// x
let num = 1;
function add(a) {
  return a + num;
}

// pure functions
function add(a, b) {
  return a + b;
}
const result = add (2, 3);

2. Stateless, Immutability(비상태, 불변성)

  • 함수형 프로그래밍은 전달된 데이터를 변경하는 것이 아니라 새로운 버전을 결과값으로 전달해야한다.
    • 불변성: 함수의 인자로 전달된 데이터의 상태를 변경하지 않으므로써 side effect(부작용)을 만들지 않는다.
      • sideEffect(부작용): 함수를 호출하면 외부의 상태가 변경되거나, 예상치 못한 에러가 발생하는 등의 부작용이 생긴다.
  • JS는 불변성의 데이터 타입이라는 것이 따로 없다
    • Object.freeze라는 함수를 이용해 오브젝트를 불변성으로 만들어줄 수 있다.
// x
let person = { name: 'hannah', age: 20 };
function increaseAge(person) {
  person.age = person.age + 1;
  return person;
}

// Stateless, Immutability
const person = { name: 'hannah', age: 20 };
function increaseAge(person) {
  return { ...person, age: person.age + 1 };
}

3. Expressions Only!(Not Statements like if, switch, for...)

// x statements
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
  for (let i = 0; i < numbers.length; i++) {
    numbers[i] = numbers[i] * multiplier;
  }
}

// Expressions
function multiply(numbers, multiplier) {
  return numbers.map(num => num * multiplier);
}

4. First-class and higher-order functions

  • first-class: 함수를 변수에 할당 혹은 함수에 인자로 전달하거나 리턴하는 등의 일을 할 수 있다.
  • higher-order: 함수 자체를 인자로 전달하거나 함수에서 또다른 함수를 리턴한다.
    // first-class
    const addTwo = a => a + 2;
    const multiplyTwo = a => a * 2;
    const transform = numbers => numbers.map(addTwo).map(multiplyTwo);
    
    console.log(transform([1,2,3,4])); // [6,8,10,12]
    
    // higher-order functions
    const addToppings = topping => food => food + topping;
    const egg = addTopping('🍳');
    const bacon = addTopping('🥓');
    
    console.log(egg('🥘')) //🥘🍳
    console.log(bacon('🥪')) //🥪🥓

객체지향 프로그램이 비슷한 로직을 클래스로 묶어 나가는 것이 아닌 추상화, 캡슐화, 다형성 그리고 다양한 디자인패턴에 대해 공부하듯이 함수형 프로그래밍을 제대로 이해하기 위해서는 Monad, Semigroup, Applicative, Monaid, Functor, Disjunction등 다양한 컨셉들에 대해 잘 이해해야 진정한 함수 프로그래밍을 구현할 수 있다.

두가지를 비교하는것은 아파트 vs 하우스, 배 vs 비행기 정도의 차이처럼 가고자 하는 목적지 / 목표에 따라서 적절한 것을 고르거나 여러가지를 병합해서 사용하면 된다.
ex) UI어플리케이션 특성상 많은 상태변화가 일어나기 때문에 순수 함수형 프로그래밍으로는 힘들수가 있다.
→ 함수형과 반응형이 결합된 함수형 반응형 프로그래밍을 이용하거나 객체지향 프로그래밍에 함수형 프로그래밍을 더해 좀더 안정적인 프로그래밍을 할 수 있다.

프로그래밍 패러다임은 어느 하나가 다른 하나를 대체하는게 아니라 원하는 목표에 따라 적절한 걸 골라 사용한다.

참조: [드림코딩] 함수형프로그래밍이 대세다?! (함수형 vs 객체지향)


blockchain

  • block + chain
    • Append: block을 더하기만 가능한 데이터베이스라고 생각하면 된다.(삭제, 편집 불가능)
    • Decentralization: 탈중앙화(특정 개인이 DB를 관리할 수 없다.)
      • 모두가 DB 복제본을 가지고 있다.
      • 분산된 DB이기도 하다. → 이 이유로 인해 크립토*를 감시하거나 통제하기 힘듦
        • 컴퓨터를 몽땅 꺼야 비트코인이 죽지만 그럴일이 없으닌깐, 크립토커런시(암호화폐)가 정부의 감시나 통제에 대응 가능
  • BlockChain = Data = DB
    • block
      • block hash (내 데이터 + 이전 블록의 해시 = 나만의 해시)
      • previous block hash (이전의 블록 해시)
      • block data : 어떠한 데이터
        • ex) 비트코인의 경우 데이터는 ‘트랜젝션(거래내역)’이다.
      • 위의 세가지들을 모아 만들면 블록체인에 블록을추가 할 수 있다.
    • hash
      • 일방향 함수 + 결정론적
        • 결정론적(deterministic): 정해져 있는 아웃풋
        • 일방향 함수: 아웃풋으로 인풋을 얻을 수 없다.

참조: [노마드 코더] 블록체인. 개발자가 쉽게 설명해드림. 10분컷.

0개의 댓글