비동기 프로그래밍 ( Asynchronous ) ?

JavaScript 는 단일 스레드에서 동작합니다. => 한번에 한가지 일만 할 수 있습니다. ‘그럼 안 좋은거 아니야?’라고 생각할 수 있지만 싱글 스레드는 멀티 스레드가 겪어야 하는 골치 아픈 문제들을 신경 쓰지 않아도 된다는 장점이 있다.

싱글스레드만으로 멀티스레드 부럽지 않은 부드러운 소프트웨어를 만들기 위해서는 대가를 치뤄야 한다. 그 대가가 바로 비동기적(asynchronous) 프로그래밍이다.

- 하나의 요청 처리가 완료되기 전에 제어권을 다음 요청으로 넘겨 Blocking 되지 않으며 다음 요청을 처리 하는 방식. (ex. nodejs)

출처: https://jinn-blog.tistory.com/87

방식

콜백 방식

  • 자바 스크립트에서 함수는 일급 객체이므로 파라미터로 넘길 수 있음.
    • 일급 객체란?
      • 변수나 데이터에 할당 가능.
      • 객체의 인자로 넘길수 있음.
      • 리턴값으로 사용 가능.
  • 실행 결과를 보면 비동기로 수행되는것을 알수 있음.
  • 위의 전달된 콜백 함수는 디렉토리를 모두 읽은 후 호출됨으로써 비동기 프로그래밍이 가능해짐.
let fs = require('fs');
 
console.log('start');
 
fs.readdir('.', (err, filenames) => {
  if (err) {
    console.error(err);
    return;
  }
  
  for (let i = 0; i < filenames.length; i++) {
    console.log(filenames[i]);
  }
});

console.log('end');
 
 
// 실행 결과: start -> end -> filenames

Promise 방식

  • 복잡한 처리에서는 위의 콜백 방식을 사용할 경우 콜백 헬 발생
  • 비동기 작업을 콜백에 비해 쉽게 컨트롤 가능, 비교적 가독성이 좋음.
  • 오류 처리를 가시적으로 대응할 수 있음.
const fs = require('fs');

function readDirPromise() {
  return new Promise((resolve, reject) => {
    fs.readdir('.', function (err, filenames) {
      err ? reject(err) : resolve(filenames);
    });
  });
}

readDirPromise()
  .then(function (filenames) {
    console.log('filenames - ', filenames);
  })
  .catch(function (error) {
    console.log('error - ', error);
  });

Generator 방식

const fetch = require('node-fetch');

// 외부 api를 사용한다.
function getUser(generatorObject, username) {
  fetch(`https://api.github.com/users/${username}`)
    .then(res => res.json())
    .then(user => {
      // user 이름을 줄테니까 다음을 실행시켜!
      generatorObject.next(user.name)
    });
}

let main;

// 비동기 함수가 포함되어있는 메인함수
function* mainFunction() {
  let user;

  // getUser를 실행하고 멈춰있어!
  user = yield getUser(main, 'jessie');
  console.log('1user - ', user);
  user = yield getUser(main, 'kevin');
  console.log('2user - ', user);
  user = yield getUser(main, 'albert');
  console.log('3user - ', user);
}

// iterator 함수 반환
main = mainFunction();
// main 함수 실행
main.next();

async/await 방식 ( 필자가 가장 많이 쓰는 방식 )

  • async, await 는 ES8(ECMAScript2017)의 공식 스펙(링크)
  • promise, generator보다 더욱 절차적(동기적)인 프로그래밍 방식으로 개발가능
(async () => {
    try {
        const filenames = await fs.readdir('.');
        for (let i = 0; i < filenames.length; i++) {
            console.log(filenames[i]);
        }
    } catch (e) { console.error(e); }
})();

이벤트 루프

https://namjackson.tistory.com/30

 

[NodeJS ]1. Nodejs 동작원리 및 이벤트 루프, 논블로킹I/O (Event Loop , Non-Blocking)

NodeJS란 ? 비동기 이벤트 기반 주도 , JavaScript 런타임으로써, Nodejs는 확장성 있는 네트워크 애플리케을 만들수 있는 언어. Chrome V8엔진 기반의 이벤트 기반( Event-driven ) , 논-블로킹 I/O ( Non-Bloc..

namjackson.tistory.com

jinn-blog.tistory.com/87

 

비동기 프로그래밍

동기(synchronous) 및 비동기(asynchronous) 동기 방식 - 하나의 요청이 처리되는 동안 다른 요청이 처리되지 못하며 요청이 완료되어야만 다음 처리가 가능한 방식. (ex. java) 비동기 방식 - 하나의 요청

jinn-blog.tistory.com

 

function yyyymmdd(timestamp) {
                var d = new Date(timestamp * 1000), // Convert the passed timestamp to milliseconds
                yyyy = d.getFullYear(),
                mm = ('0' + (d.getMonth() + 1)).slice(-2),  // Months are zero based. Add leading 0.
                dd = ('0' + d.getDate()).slice(-2),         // Add leading 0.
                hh = d.getHours(),
                h = hh,
                min = ('0' + d.getMinutes()).slice(-2),     // Add leading 0.
                ampm = 'AM',
                time;
                /*
                if (hh > 12) {
                    h = hh - 12;
                    ampm = 'PM';
                } else if (hh === 12) {
                    h = 12;
                    ampm = 'PM';
                } else if (hh == 0) {
                    h = 12;
                }
                */ // 이부분은 AM, PM으로 나누고싶을 때 추가하면된다.
                
               time = yyyy + '.' +  + mm + '.' + dd + ' ' + h + ':' + min 
                    
                return time;
            }

 

yyyymmdd함수에 timestamp값을 넣어주면 날짜로 retrun 된다.

 

 

결과값

이런식으로 나온다.

https://medium.com/@douglasbellonrocha/functional-object-oriented-programming-with-message-passing-71979ca9d097

 

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

 

객체지향 프로그래밍과 함수형의 차이는 데이터(상태)를 다루는 개념과, ‘간결한 코드 작성에 대한 관점차이가 있다.

객체지향이 함수의 동작부를 캡슐화해서 코드를 이해할 수 있게 한다면, 

함수형 프로그래밍은 동작부를 최소화해서 코드 이해를 돕는다.

 

객체지향 프로그래밍의 경우, 클래스 디자인과 객체들의 관계를 중심으로 코드 작성이 이루어진다. 따러서 상태, 멤버변수, 메서드 등이 긴밀한 관계를 가지고 있다. 특히 멤버변수가 어떤 상태를 가지고있는가에 따라 결과가 달라진다.

 

함수형 프로그래밍의 경우, 값의 연산 및 결과 도출 중심으로 코드작성이 이루어진다. 함수 내부에서 인자로 받은 값을 별도로 저장하거나 하지 않고, 간결한 과정으로 처리하고 매핑하는데에 주 목적을 둔다. 

 

함수형 언어에서는 함수(Function) 자체가 일급 객체가 되겠지만,

객체지향 언어에서는 클래스(또는 객체, Object)가 일급 객체가 됩니다.

 

일급객체는

99geo.tistory.com/61

 

함수형 프로그래밍이란 ? functional programming?

함수형 프로그래밍 프로그래밍의 여러 종류 중 하나이며, 함수(function)을 이용해 프로그래밍을 하는 것 입니다. => 함수로만 이수어진 프로그램이라고 생각하면 편할 것 같습니다. 함수형 프로그

99geo.tistory.com

 

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 합니다!

 

참고로 자바스크립트와 파이썬의 함수는 일급함수이다. 

 

함수형 프로그래밍은 함수가 일급 객체가 됩니다 

const test = function() { 
  console.log("일급함수입니다.")
}

test(); // call

 객체지향 프로그래밍 (OOP)는 대표적으로 java가 있는데 함수를 일급객체로 취급하지 않습니다.

 

제 생각에는 이부분이 제일 큰 것 같습니다. 함수를 일급객체로 취급하느냐 않하느냐가 제일 이해하기 쉽지 않나 생각합니다!

 

오류나 이슈부분이 있으면 댓글이나 쪽지로 피드벡 주시면 감사하겠습니다.

 

 

출처 : suminpixel.tistory.com/m/20

함수형 프로그램의 대표 사진

함수형 프로그래밍

프로그래밍의 여러 종류 중 하나이며, 함수(function)을 이용해 프로그래밍을 하는 것 입니다.

=> 함수로만 이수어진 프로그램이라고 생각하면 편할 것 같습니다.

 

함수형 프로그래밍의 특징

함수형 프로그램은 다음과 같은 특징을 가지고 있습니다.

  • 불변 데이터(Immutable Data)
  • 1급 함수(First-Class Function)
  • 순수 함수(Pure Function)

불변 데이터(Immutable Data)

함수형 프로그래밍을 가능하게 하는 요소 중 하나가 바로 Immutable Data입니다.
한번 정해진 값은 바뀌지 않습니다.
List를 하나 만들어 항목을 추가/삭제 할때 추가가 필요하면 추가항목이 입력 된 List를 만들고 삭제가 필요하면 삭제항목이 제거 된 List를 만드는 식입니다.
이러한 자료구조를 Persistent Data Structure라고 부릅니다.

1급 함수(First-Class Function)

  • 컴퓨터 과학자 Christopher Strachey가 만든 조어
  • 함수가 런타임에도 생성
  • 함수의 인자로 전달되고 함수의 결과로서 리턴되며, 변수에 할당
  • 함수도 데이터처럼 구성이 가능해짐(Composability)

자바에서는 메서드가 1급으로 처리되지 않기에, 메서드만 따로 생성하거나, 메서드 자체를 생성자나 변수나 파라미터등에 전달 할 수 없습니다.
반면 자바스크립트에서는 아래와 같은 코드가 가능합니다.

function someFunc(){ ... } otherFunc(someFunc) //함수 자체를 파라미터로 전달 가능 var a = someFunc; // 함수를 변수에 할당 가능

즉 자바스크립트에서는 함수를 1급으로 처리하고 있습니다

순수함수(Pure Function)

주어진 입력으로 계산하는 것 이외의 프로그램의 실행에 영향을 미치는 부수 효과(Side Effect)가 없는 함수를 순수 함수라고 합니다.
예를들면 count, length 함수는 임의 문자열이나 배열에 대해서 길이를 반환하며, 그 외의 일은 일어나지 않습니다.

Side Effect (부수효과)

입력받은 값의 결과를 돌려주는 것 이외의 다른 어떤 일을 수행하는것

- 변수를 수정 - 자료 구조를 제자리에서 수정 - 객체의 필드를 설정 - 예외(Exception)를 던지거나 오류를 내면서 실행 중단 - 콘솔에 출력하거나 사용자의 입력을 읽어들임 - 파일에 기록하거나 파일에서 읽어들임 - 화면에 출력

함수형 프로그래밍의 장점

  • 순수 함수들로 작성하면 모듈성이 증가
  • 모듈성으로 인해 생기는 장점
    • 검사(Test)가 쉬워짐
    • 재사용
    • 병렬화
    • 일반화
    • 분석이 쉬워짐
  • 버그가 생길 여지가 적다
  • 가독성과 유지 관리 편의성이 향상
  • 함수를 사용하기 때문에 반복되는 개발이 쉬워진다

왜 함수형 프로그래밍인가?

  • 멀티 코어가 기본이 되면서 ‘동시성’ 처리에 함수형 프로그래밍이 강점을 보임
  • 불변값을 주로 다루기 때문에 Side Effect가 적어 동시성 처리가 쉬워짐
  • 코드 이해하기 쉬움
  • 유지보수 쉬움

역시 글보다는 코딩하면서 배우는게 최고인 것 같습니다 :)

 

 

출처: https://blog.sonim1.com/113

 

+ Recent posts