일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 라우터미들웨어 분리
- express router
- next 매개변수
- ws 라이브러리
- 라우터와 미들웨어
- 라우터 분리
- 세션으로 로그인 구현
- javascript기초
- 라우트 매개변수
- express session
- 비동기파일업로드
- JWT 하드코딩
- OAuth 카카오
- cookie-parser 만들어보기
- 시퀄라이즈 기본설정
- 블록 만들기
- mysql wsl
- FormData()
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- nodejs파일업로드
- useEffect clean up
- express.static
- express실행
- JWT 만들어보기
- JWT 로그인 기능 구현
- 아이디 중복체크기능
- useContext
- buffer.from
- css기초
- node.js path
- Today
- Total
즐코
웹브라우저의 동작 원리 / 스택, 큐 구조 / 재귀함수 본문
웹브라우저의 동작 원리 공부
1/ 자바스크립트 코드 처리 방식
2/ 동기 비동기
3/ 스택과 큐
4/ 재귀함수 (ft.피보나치수열)
자바스크립트의 코드 처리 방식에 대해서 우선은 간단하게 원리만 이해했다.
1/ JavaScript = single threaded language?!
메모리 상에서 코드를 실행하고 처리하는 곳을 콜스택이라고 하는데,
이 콜스택은 한번에 하나씩만 처리할 수 있으면 쌓이는 일이 없이 그때그때 코드가 실행되는 곳이다.
=> 자바스크립트를 single threaded language 라고 한다
(하나의 프로세스에 하나의 스레드 / 멈추지 않는다)
=> 원래 Javascript는 hoisting (변수,함수 선언) 이후 시간순대로 코드가 실행되는데, 예외적으로 비동기 처리 방식을 보일 때도 있다.
예외로 시간이 걸리는 함수들의 경우,
#1 콜스택에선 우선 급한 애들만 처리한다면서 이런 애들을 일종의 대기실같은데로 보내버린다고 한다.
#2 그동안 다른 출력물을 먼저 뽑아내고, 대기실로 간 코드들은 큐에서 대기를 탄다.
#3 스택이 완전히 비었을 때 큐에서 기다리고 있던 코드들이 콜스택으로 이동하고 드디어 출력!
2/ 동기 vs. 비동기
동기
: A->B->C 순으로 간결하고 직관적인 프로세스지만 B에서 오류, 시간지연의 문제가 생기면 C의 출력도 미뤄짐
비동기
: 하나의 프로세스에 살짝 복잡하지만 융통성 있는 카페 같은 느낌..
카페에서 단체 손님이 10잔을 시켰는데 그 바로 다음 손님이 아메리카노 한잔만 시킨다면,
한 사람이 10잔을 만들고 있는 동안 다른 한 사람은 아메리카노 1잔을 만들어서 기다리지 않게끔 해주는 구조!
=> 대량의 I/O 처리 능력이 뛰어나다 => INPUT/OUTPUT이 많은 웹사이트에 JS가 많이 쓰이는 이유
3/ 스택과 큐
stack
- LIFO (Later In First Out)
- 후입선출 구조 : 나중에 넣은 것을 먼저 꺼내는 구조
- ex) 뒤로가기 버튼 (사용자가 했던 행동들을 쌓아놨다가 뒤에서부터 하나씩 out)
아래 코드의 경우, 단순하게 생각하면, 3rd가 먼저 화면상에 출력되고, 2nd, 1st 순으로해서 thirdIn() = 3rd2nd1st가 나올 것 같지만, 틀렸다. 대기실에 쌓였다가 먼저 출력될 수 있는 애들이 나가는 걸로 상상하면 간단하다.
thirdIn 에서 secondIn이라는 함수가 계산될 동안 3rd는 쌓여있다.
secondIn도 firstIn 함수가 계산되기 전에 2nd도 쌓여 있다가 firstIn이 출력되자마자, 마지막으로 쌓인 2nd가 나가고, 그 다음에 3rd가 나가게 되어 1st2nd3rd가 출력!
좀 더 복잡하게 연습
Queue 구조
- FIFO (First In First Out)
- 선입선출 구조 : 먼저 넣은 것을 먼저 꺼내는 구조
- ex) 푸쉬 알림 기능, 쇼핑몰 주문 처리방식
4. 재귀함수
자기 자신을 호출하는 함수
종료 조건이 충족할 때까지 반복적으로 스스로를 불러내면서 주어진 작업을 수행하는 거!
대표적인 예시 : 피보나치 수열
1 1 2 3 5 8 13 21 34 55 89 ...
function fibo(n){
if(n==1 || n==2){
return 1
}
return fibo(n-1) + fibo(n-2)
}
console.log(fibo(10))
포인트:
공통적인 부분을 찾아서 프로그래밍적인 걸로 바꿔야하는게 포인트!!
공통적인 부분 : n번째 값 = (n-1)번째 값 + (n-2)번째 값
작은 문제를 해결하고 큰 범위로 넓혀서 해결하는 걸 DP = Dynamic Programming 이라고 한다.
=> 다만, 위의 식 같은 경우 시간 복잡도가 올라간다.
=> 메모이제이션 기법을 활용한다.
(한번 계산한 값은 저장했다가 다시 가져오는 형태)
시간 복잡도란!?
알고리즘은 빠르다 느리다 로 표현하지 않음
같은 알고리즘이여도 컴퓨터 하드웨어의 능력치에 따라 같은 작업이여도 컴퓨터마다 다 다른 속도를 보이기 때문!
=> 완료까지 걸리는 절차의 수로 결정한다!
N개의 데이터 처리 = step N번을 거친다 => On 이라고 부른다
Big O
1. 시간복잡도 O(n)
ex) 선형 검색의 경우 한개씩 일렬로 찾아야하므로, input size = n개 => 시간복잡도 O(n)
각 아이템을 출력하는 for문의 경우도 이에 해당
2. 시간복잡도 O(1)
input이 몇 개던 상관 없이 constant time (상수 시간)
=> O는 중요한 항목 이외는 무시한다는 의미를 가진 기호라고 한다.
=> 즉, 함수의 디테일엔 관심이 없다. 정말 의미있는, 이 함수의 작동 단위 / 계산의 기본 단위만을 따짐
함수 내에서 console.log 출력을 2번하건 3번하건 O(2), O(3)이 아니라
그냥 '출력'이라는 기본단위만을 따지기 때문에 O(1)로 따짐
3. 시간복잡도 O(n^2)
ex) 중첩 for문
4. 시간복잡도 O(log n)
ex) 이진검색
다시 본론으로 돌어와서
메모이제이션 기법을 간단히 알아보자..
처음 쓴 코드는 중복되는 계산식이 존재해서 n^2 로 점점 계산해야할 것들이 늘어나서.. 스택이 터지는데,
아래 메모이제이션 코드는 계산이 반타작 날라가는 형태라 더 빠르다고 한다.
근데 알듯말듯하다가도 아예 모르겠음ㅠ 리액트 배울 때 다시 나온다고 하니 그때 다시 보자..
let number = [];
function fibo2(n){
if (number[n]>0){
return numbers[n]
} else if (n == 1 || n == 2){
return numbers[n] = 1;
} else {
return numbers[n] = fibo2(n-1) + fibo2(n-2)
}
}
console.log(fibo2(10))
아, 참고로
javascript에서 코드 처리 시간 계산은
계산할 코드 앞에 console.time() / 마지막에 console.timeEnd() 넣으면 콘솔창에 시간이 찍힌다.
'CS' 카테고리의 다른 글
bit 와 byte / ASCII, Unicode / Text encording ?! (0) | 2021.12.31 |
---|---|
컴퓨터=하드웨어+소프트웨어+펌웨어 (0) | 2021.12.30 |