Today I Learned

9TIL 항해99 13일차

냥냥's 2021. 9. 25. 23:42

자다 일어났더니 너무 어지러워 검색해보니 이석증 이란다. ㄷㄷ

다행히 자연적으로 치료되는 경우가 많다고 하니 경과를 지켜봐야겠다.

뇌쪽이 문제가 아니어야 할 텐데 ㅠㅠ

제발 건강 문제 때문에 혹은 체력 문제 때문에 막히고 싶지는 않다...

 

과제도 이미 끝내서 조금 여유롭게 공부를 했다.
책이 굉장히 제목에 맞게 교과서적인 느낌이었다. 친절하게 이해되기 쉽게 천천히 그리고 많은 예시를 들어 설명해 준다. 읽는 사람이 굉장히 초보라도 쉽게 읽히는 느낌이다. 

그리고
처음으로 E북으로 책을 사 봤는데 괜찮은거 같다.
공부하기에 오히려 더 만족감을 느꼈다. 예를들면 형광펜 기능이 있어서 책의 중요한 부분에 형광 표시를 하면 그 부분이 독서노트에 저렇게 담기고  메모로 내 마음대로 정리도 할 수 있다.
그리고 정말 좋은 것은! 저렇게 담긴 형광펜이나 메모를 더블클릭하면 해당 페이지로 바로 이동하기 때문에 아주 쉽게 찾아가서 상세한 것을 다시 볼 수도 있다.
당연히 하꼬인 나는 내돈내산 이라고 알고 계실 것이다. 마음에서 우러나오는 추천! 드린다. 개발 꿈나무 입장으로서 생각해도 편리하게 잘 만든 것 같다 ㅎㅎ;;


아쉬운건 그림이나 텍스트 복사가 안되어서 인용하기 쉽지 않다는 것이었다. ㅠ

 


Node의 기본 개념들을 배웠고 기본적인 함수 호출 원리를 배웠다.
완전 비전공자라서 스택이나 큐라는 단어도 생소해서 가져와 봤다.

큐와 스택

큐(QUEUE) : 주기억장치에서 연속적인 공간을 배정해 데이터를 Rear 포인터가 가르키는 방향에서 삽입해 Front 방향에서 삭제되는 알고리즘

- 큐의 사전적 의미는 줄을 서서 기다리는 것, 큐 자료 구조는 줄을 서서 기다리는 것처럼 먼저 온 사람 먼저 나간다.

- 먼저 온 사람이 먼저 나감을 선입선출의 FIFO(First in first out)로 표현한다.

- 아무것도 없는 큐에서 데이터를 삭제하면 Under Flow Error 발생 반대로 꽉 찬 큐에 삽입 시 Over Flow Error

큐 활용 예시 :

- 프린터 인쇄 대기열

- 은행 업무

- 콜센터 고객 대기시간

- 프로세스 관리

- 너비 우선 탐색

- 캐시

스택(Stack) : 주기억 장치에서 연속적인 공간을 배정해 1, 2, 3 같이 차례대로 삽입

- 사전적 의미는 쌓아 올리는 것. 스택 자료 구조는 책을 쌓는것처럼 차곡차곡 쌓아올린 형태의 자료구조다.

- 먼저 올린 책은 먼저 꺼낼 수 없다. 마지막에 올린 책부터 꺼내야 하며 아니면 무너질 것이다.

- 위를 마지막에 들어온게 먼저 나간다고 후입선출(LIFO, Last-in-First-Out) 구조라고 부른다.

- 아무것도 없는 스택에서 작업 수행 시 stack Under Flow Error 발생 꽉 찬 큐에 삽입 시 Stack Over Flow Error

스택 활용 예시 :

- 웹 브라우저 방문기록의 뒤로가기

- 역순 문자열

- 실행 취소

- 후위 표기법 계산

- 수식 괄호 검사 (연산자 우선순위 표현의 경우)

[출처] [Algorithm] 알고리즘 - 자료 구조, 선형 구조 (배열, 스택, 큐)|작성자 넬티아

프로세스와 스레드의 차이

프로세스 : 프로세스는 운영체제에서 할당하는 작업의 단위입니다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스입니다. 프로세스 간에는 메모리 등의 자원을 공유하지 않습니다.

스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있습니다. 스레드들은 부모 프로세스의 자원을 공유합니다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있습니다.

 


Node는 싱글스레드를 사용하고 있다.
언뜻 보면 여러 개의 일을 동시에 처리할 수 있으므로 멀티 스레드가 싱글 스레드보다 좋아 보이지만 꼭 그런 것은 아니다. 예시를 들어보겠다. 한 음식점에 점원이 한 명 있다. 손님은 여러명이다. 점원 한 명이 주문을 받아 주방에 넘기고, 주방에서 요리가 나오면 손님에게 서빙을 한다. 그 후 다음 손님의 주문을 받는다. 이런 구조라면 다음 손님은 이전 손님의 요리가 나올 때까지 아무것도 못 하고 기다려야 한다. 이것이 바로 싱글 스레드, 블로킹 모델이다. 매우 비효율적이다.
 이번에는 점원이 한 손님의 주문을 받고, 주방에 주문 내역을 넘긴 뒤 다음 손님의 주문을 받는다. 요리가 끝나기까지 기다리는 대신, 주문이 들어왔다는 사실만 주방에 계속 알려주는 것이다. 주방에서 요리가 완료되면 완료된 순서대로 손님에게 서빙한다. 요리의 특성에 따라 완료되는 순서가 다를 수 있으므로, 주문이 들어온 순서와 서빙하는 순서는 일치하지 않을 수도 있다. 이것이 바로 노드가 채택하고 있는 싱글 스레드, 논 블로킹 모델이다.
  멀티 스레드 방식에서는 손님 한 명이 올 때마다 점우너도 한 명씩 붙어 주문을 받고 서빙한다. 언뜻 보면 싱글 스레드보다 좋은 방법인 것 같지만, 장단점이 있다. 일단 손님 한 명당 점원도 한 명이면 서빙 자체는 걱정이 없다. 점우너 한 명에게 문제가 생겨도 다른 점원으로 대체하면 되기 때문이다. 하지만 손님의 수가 늘어날 수록 점원의 수도 늘어난다. 손님 수가 줄어들었을 대 일을 하지 않고 노는 점원이 있다는 것도 문제가 된다. 점원을 새로 고용하거나 기존 점원을 해고하는 데는 비용이 발생하기 때문이다. 

서버로 사용할때의 노드 특징 장 단점

특장점
노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데에 적합하다. 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문이다. 실시간 채팅 어플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용한다.

구현이 편리하다.  왜냐하면 노드는 내장된 웹 서버를 사용하여 사용하면 되므로 편리하다. 하지만 나중에 서버 규모가 커지면 결국 nginx 등의 웹 서버를 노드 서버와 연결해야한다.

자바스크립트를 사용하므로 비교적 쉬우면서 개발 생산성을 획기적으로 높일 수 있다.

요즘은 XML 대신 JSON을 사용해서 데이터를 주고 받는데, JSON이 자바스크립트 형식이므로 노드에서는 쉽게 처리할 수 있다.


단점
기본적으로 싱글 스레드라서 CPU코어를 하나만 사용한다.

CPU 작업이 많은 서버로는 부적합하다.

노드 12 버전에서 워커 스레드 기능의 안정화로 멀티 스레드 작업을 할 수 있게 되었지만, 멀티 스레드 프로그래밍을 하는 것은 싱글 스레드에 비해 어렵다. 그리고 멀티스레드 프로그래밍을 하더라도 C, C++, Rust, Go와 같은 언어에 비해 속도가 많이 느리다.

싱글 스레드 방식으로 서버를 운영하기 때문에 하나뿐인 스레드가 에러로 인해 멈추면 서버 전체가 멈출 수 있다.

 

안정성과 보안성 측면의 문제도 이미 충분히 검증되었다. 규모가 큰 곳을 꼽자면 미국항공우주국(NASA), 에어비앤비, 우버, 넷플릭스, 링크드인 등에서 노드를 사용하고 있습니다. 페이팔, 월마트, 이베이와 같이 결제 시스템을 사용하는 대기업들도 노드로 서비스를 운영한다. 국내에서도 네이버, 카카오, 위메프, 야놀자 같은 기업들이 노드를 사용하고 있다.

출처 Node.js 교과서 개정2판 
조현영 저

돌아온 알고리즘 시간!

N개의 문자열이 입력되면 그 중 가장 긴 문자열을 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 줄에 자연수 N이 주어진다.(3<=N<=30)
두 번째 줄부터 N개의 문자열이 주어진다. 문자열의 길이는 100을 넘지 않습니다.
각 문자열의 길이는 서로 다릅니다.
▣ 출력설명
첫 줄에 가장 긴 문자열을 출력한다.
▣ 입력예제 1
5
teacher
time
student
beautiful
good
▣ 출력예제 1
beautiful

풀이
for문 돌려서 하나하나 불러오면서 배열 길이값으로 최대값 찾기 하면 된다

function solution(s){
    let answer, max = Number.MIN_SAFE_INTEGER;
    for(let x of s) {
        if(x.length > max) {
            max = x.length;
            answer=x;
        }
    }
    return answer
    
}
let str=["teacher", "time", "student","beautiful","good"]
console.log(solution(str))

 

소문자로 된 단어(문자열)가 입력되면 그 단어의 가운데 문자를 출력하는 프로그램을 작성하세
요. 단 단어의 길이가 짝수일 경우 가운데 2개의 문자를 출력합니다.
▣ 입력설명
첫 줄에 문자열이 입력된다. 문자열의 길이는 100을 넘지 않습니다.
▣ 출력설명
첫 줄에 가운데 문자를 출력합니다.
▣ 입력예제 1
study
▣ 출력예제 1
u
▣ 입력예제 2
good
▣ 출력예제 2
oo

 

풀이 이것도 그냥 하라는대로 하면 된다.
문자열 길이를 이용해서 짝수 홀수 판별하고 함수를 이용하면 편하다.

Math.floor(x)인수보다 작거나 같은 수 중에서 가장 큰 정수를 반환합니다.(내림)

Math.round(x)숫자에서 가장 가까운 정수를 반환합니다.(반올림)

Math.ceil(x)인수보다 크거나 같은 수 중에서 가장 작은 정수를 반환합니다.(올림)


substr(시작 index, 가져올 문자열 갯수)

substring(시작 index, 끝 idex +1)

[출처] [자바스크립트, JavaScript] 형변환(1) - Number(),parseInt(),parseFloat() + 슬라이싱(substr(), substring())|작성자 nyjchoi

function solution(s){
    let answer;
    let mid=Math.floor(s.length/2)
    if(s.length%2 ==1 ) {
        answer = s.substr(mid,1)
    }else {
        answer = s.substr(mid-1,2)
    }
    return answer
}
console.log(solution("length"))