본문 바로가기

분류 전체보기

(20)
Node.js의 동작 원리를 알아보자 (+ 이벤트 루프, libuv, 스레드 풀) 앞서 "왜 자바스크립트가 싱글 스레드이고, 어떻게 논블로킹 I/O를 지원하는지" 알아 보았습니다. 오래 걸리는 작업은 웹 브라우저에 위임하는게 핵심 이었는데요, 과연 서버용 JS 환경인 node.js에서는 어떻게 동작할까요? 이번 포스팅에서 좀더 자세하게 알아보도록 하겠습니다. 이벤트 루프(Event Loop)란? 간단하게 이벤트 루프에 대해서 알아보겠습니다. 자바스크립트는 여러 이유 때문에 싱글 스레드 언어로 기획되었습니다. 그래서 하나의 콜 스택만 가지고, 한번에 하나의 작업 밖에 수행하지 못합니다. 그래서 자바스크립트는 웹 브라우저에 긴 I/O 작업(네트워크, 타이머 등)을 위임합니다. 웹 브라우저가 백그라운드에서 작업을 수행하고, 다시 콜 스택에 불러오는 것이죠. 자바스크립트는 이벤트 루프(Eve..
함수형 프로그래밍이란? (Functional Programing) 함수형 프로그래밍은 저번 포스팅에서 설명했던 선언형 프로그래밍에 속하며, 말 그대로 순수 함수를 조합해 프로그램을 만듭니다. 함수형 프로그래밍의 특징을 요약하자면 다음과 같습니다. 부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다. 과연 이게 어떤 뜻일까요? 모르는 개념들을 하나씩 짚어 보면서 설명해 보겠습니다. 부수 효과(Side Effect)가 없는 순수 함수(Pure Function)란? 부수 효과를 발생하는 함수 부수 효과의 영단어인 Side Effect의 뜻은 "부작용"입니다. 즉, 부수 효과가 있는 함수는 프로그램에 "부작용"을 일으켜 원래의 목적과 다른 결과를 만듭니다. 간단한 예시를 들어 보겠습니다. let numbe..
명령형 vs 선언형 프로그래밍 학습 도중 "선언형 프로그래밍은 이해하기 쉬운 코드"를 만들어 준다는 이야기를 많이 들었습니다. 객체 지향 프로그래밍(OOP)은 들어본 적 있는데, 대체 어떤 프로그래밍 기법이기에? 라는 관심이 들어 한번 정리해보고자 합니다. 명령형 프로그래밍(Imparative Programming) 명령형 프로그래밍이란? 프로그래머가 무엇을(What)할지 보다, "어떻게(How) 할 것인지를 표현"하는 프로그래밍 패러다임입니다. 개념만 봐서는 그리 와닿지 않지만, 사실 우리가 지금까지 알던 방식이 이 명령형 프로그래밍과 유사합니다. 소위 절차 지향, 객체 지향 기법이 명령형 프로그래밍 패러다임에 속합니다. 절차 지향(PP) 프로그래밍: 수행해야할 작업을 "순차적"으로 작성하는 프로그래밍 패러다임입니다. (C언어 등)..
자바스크립트는 왜 싱글 스레드이고, 어떻게 비동기 처리가 가능할까? (+ Event Loop에 대하여) 이전 글에서 간단하게 I/O 블로킹과 동기, 비동기 개념에 대해 알아 봤습니다. 저번 포스팅을 보고 온 사람은 "비동기와 논블로킹 I/O을 위해서는 당연히 멀티 스레드를 사용해야 하는 것 아니야?" 라는 의문이 들 것입니다. 하지만 자바스크립트는 싱글 스레드 논블로킹 I/O 기반 언어입니다. 오늘은 왜 자바스크립트는 싱글 스레드로 동작하고, 어떻게 논블로킹 I/O를 만족하는지 알아 보겠습니다. 멀티스레드 프로그래밍의 문제 동시성이란? 동시성이란 여러 작업이 동시에 실행되는 것 같이 보이는 것을 말합니다. (동시성 vs 병렬성 참고) 동시성 덕분에 우리가 웹 브라우저에 유튜브를 보면서, 댓글을 달거나 추천 영상을 찾아볼 수 있는 것이죠. 멀티스레드 프로그래밍의 동시성 문제 동시성 방식은 여러 스레드가 각..
유지 보수와 Type-Safe한 쉬운 파이썬 코드 만들기 - 주석과 타입 힌트에 대하여 프로그래밍을 할 때, 기능을 추가하거나 고칠 때마다 필연적으로 코드 변경이 일어나기 마련이다. 이럴 때, 팀원이 코드를 이해해야 변경도 가능하므로 코드를 가독성 있게 유지하는 것이 중요하다. 또한 직접 작성한 코드도 시간이 지나면 잊어버리기 마련이다. 이 때, 주석은 프로그래머가 코드를 떠올리게 도와주고, 로직에 대한 메모나 경고 역할을 해준다. 오늘은 이처럼 프로그래밍 분야에서 중요한 '주석', '독스트링', '타입 힌트'에 대해 알아보겠다. ## 주석 ```python # 이것은 단일행 주석이다! 기호 '#'으로 사용한다. """이것은 다중행 문자열로 구성되어 다중행 주석으로 사용한다.""" ``` 파이썬은 단일행, 다중행 주석 모두 지원한다. 전문적이고 가독성 높은 코드를 작성하고 싶으면 주석은 필..
파이썬 고차 함수, 함수형 프로그래밍에 대해 앞선 포스팅에서, 함수(funtion) 사용으로 코드의 중복을 막는 예를 보면서, 함수의 중요성을 살펴보았다. 이처럼 함수는 우리가 코드를 더 작은 조각으로 나누도록 도와주는 "프로그램 속 프로그램" 이라고 할 수 있다. 그렇다면 "좋은 함수"란 무엇일까? 일반적으로 "좋은 함수"란 함수의 이름, 크기, 파라미터, 복잡도가 잘 조화된 함수를 말하는데, 사실 이런 함수를 만드는 것은 쉽지 않다. 예를 들어, 함수의 이름은 너무 길지도, 짧지도 않아야 하는데 이 기준이 대체 뭘까? 오늘 포스팅에서, 각각의 요소에 대해 Trade-Off를 제시함으로써, 이러한 결정을 도와주고자 한다. 함수 이름 함수 이름에 수행 작업과 행위 대상을 명확하게 담자 함수는 동작을 수행하는 존재이기 때문에, 이름으로 동사를 사용한..
파이썬 기초 용어/개념 정리하기 파이썬은 매우 간결하면서도 강력한 언어이다. 하지만 문법이 간결한 특징 때문에, 많은 프로그래머들이 용어와 개념을 제대로 배우지 않는 경향이 있다. 이를 간과한다면, 파이썬의 고유한 특성 때문에 함정에 빠지기 쉽다. 오늘은 파이썬의 용어를 기반으로, 파이썬만의 개념에 대해 알아보도록 하겠다. 본 포스팅은 Al Sweigart의 저서인 『클린 코드, 이제는 파이썬이다』의 일부를 기반으로 작성되었습니다. 가비지 컬렉션 파이썬에는 메모리 할당과 해제를 해야 하는 시점을 추척해 부담을 덜어주는 가비지 컬렉션(garbage Collection)이 존재한다. 가비지 컬렉션이 없으면, 메모리 누수와 이중 할당 해제 버그가 발생할 수 있다. 메모리 누수(memory leak) : 메모리 할당 해제를 잊어버리는 문제 이..
파이썬다운 코드를 작성하는 법 - 파이써닉(Pythonic) 가이드 range()보다는 enumerate() # 나쁜 예 animals = ['cat', 'dog', 'mouse'] for i in range(len(animals)): print(i, animals[i]) # 좋은 예 animals = ['cat', 'dog', 'mouse'] for index, animal in enumerate(animals): print(index, animal) 당신은 파이썬 리스트를 반복할 때 어떻게 사용하는가? 대부분 range()와 len() 함수를 사용해 반복하지만, 이는 읽기 어려우니 지양해야 한다. enumerate() 함수를 사용하면 인덱스와, 리스트의 값을 같이 불러올 수 있다. ..