221110_TIL

·2022년 11월 11일
0

Javascript

  • 템플릿 리터럴
    백틱으로 '{변수}를 사용하면 + 기호를 붙히지 않고 간결하게 문자열 이어말하기 가능.'
console.log(`count: ${count}, preIncrement: ${preIncrement}`) // count: 2, preIncrement: 2
  • 연산자
    Count++ 처럼 증감 연사자를 뒤에 놓는 경우는? (후위 증감)
    - side Effect, for문에서 i++하는 경우가 대표적. 하지만 현업에서는 버그 발생 가능성 때문에 잘 안 씀. 개념은 꼭 알고가야한다.
    • => for문도 현업에서는 map,forEach,filter 메소드로 대체하여 쓴다.
    • for문은 break, continue로 코드를 중간에 멈추거나, 계속 구동하도록 할 수 있음. 반면 map,forEach,filter 메소드는 무조건 배열을 한 번 돌게 되어있다.

Side Effect란?

  • '의도하지 않은 결과'를 의미함
  • 함수를 입력값에 대해 일정한 출력을 하는 것으로 가정할 때, 출력값에 영향을 미치지 않는 모든 작업들을 side effect 라고 부른다는 겁니다.
  • 예시

    두 개의 정수를 받아서 곱한 결과값을 리턴하는 multiplier(a:Int, b:Int) -> Int 라는 함수가 있는데, 이 함수 내부에서 계산 기록을 로그로 남긴다거나, 네트워크에 전송한다면 이런 작업들은 side effect 인 거죠.


    출처:https://www.inflearn.com/questions/12660


Python

학습 내용

  • 시간 복잡도
  • 공간 복잡도
  • 점근 표기법
  • 표기법 종류
  • Linked List( == List)
  • Array ( == 베열)

시간 복잡도 (연산)

  • 입력값과 문제를 해결하는 데 걸리는 시간과의 상관관계
max_num = 0
for num in array: // array의 길이만큼 아래 연산 실행 (반복문 = for)
	for compare_nuim in array: // array의 길이만큼 아래 연산 실행
    		if num < compare_num: // 비교 연산(if) 1회 실행 
            	break
             else:
             	return max_num

공간 복잡도 (메모리)

  • 입력값과 문제를 해결하는 데 걸리는 공간과의 상관관계 (메모리 스택)
  • 알고리즘의 성능은 공간에 의해서 결정되진 않는다.
  • ⭐️공간 복잡도보다 시간 복잡도를 신경써야한다.
    ㄴ 공간을 희생해서라도 시간 복잡도를 최대한 좋게 만들어야 함.

점근 표기법

  • 알고리즘의 성능을 수학적으로 표기하는 방법. 즉, 알고리즘 "효율성"을 평가할 수 있는 방법.

표기법 종류

  • Big-O : 빅오 표기법, 최악의 성능이 나올 때 어느정도의 연산량이 걸릴 것인지

    O(1)_상수만큼의 시간
    O(N)_N만큼의 시간
    O(N^2)_N^2만큼의 시간

  • Big-Ω : 빅 오메가 표기법, 최선의 성능이 나올 때 어느정도의 연산량이 걸릴 것인지

    Ω(1)_상수만큼의 시간
    Ω(N)_N만큼의 시간
    Ω(N^2)_N^2만큼의 시간

꼭 기억해야 할 것
1. 입력값에 비례해서 얼마나 늘어날지 파악하기. (1? N? N^2?)
2. 공간 복잡도 보단 시간 복잡도를 더 줄이기 위해 노력하기
3. 최악의 경우에 시간이 얼마나 소요될지(빅오 표기법)에 대해 고민하기.
ㄴ 앞으로 알고리즘의 시간 복잡도는 전부 빅오 표기법. Y = wx+b << 상수 계수는 의미가 없다.

Array, Linked List

학습 내용

  • Array
  • Linked List
  • Array vs Linked List (차이점)
  • index(색인) 정의
  • 시퀸스 정의

Array (배열)

  • Array는 크기가 정해진 데이터 공간이다. 한 번 정해지면 바꿀 수 없음
  • Arrat는 각각 원소에 즉시 접근할 수 있다.
    ㄴ> == 상수 시간내에 접근할 수 있음을 의미. == O(1)내에 접근할 수 있음.

    alphabet[1] ==> 'b' 처럼 곧 바로 원소에 즉시 접근 가능.

  • Array은 원소를 중간에 삽입 or 삭제하려면 모든 원소를 다 옮겨야 한다. 따라서, 최악의 경우에는 O(N)만큼의 시간 복잡도를 가진다.
  • Array는 원소를 새로 추가하려면, 새로운 공간을 할당해야 하므로, 매우 비효율적인 자료구조다.

Linked List (리스트)

  • List는 크기가 정해지지 않은 데이터의 공간. 연결고리(== 포인터)로 노드를 이어주기만 하면, 자유자재로 늘어나거나 줄어들 수 있다.
  • List는 특정 원소에 접근하려면 연결고리(== 포인터)를 따라 탐색해야 한다. 따라서, 최악의 경우에는 모든 노드를 탐색해야 하므로 O(N)의 시간 복잡도를 가진다.

    연결고리 == 포인터, 각 데이터의 칸 == 노드

  • List는 원소를 중간에 삽입∙삭제하기 위해서는 앞,뒤 연결고리(== 포인터)만 변경하면 된다. 따라서 원소 삽입∙삭제를 O(1)의 시간 복잡도(== 상수 시간 내에) 안에 할 수 있다.

Array vs Linked List (차이점)

index (색인)

alphabet[1] ==> 'b' 처럼 곧 바로 원소에 즉시 접근 가능.
이처럼 원소의 순서는 0부터 시작하고, 이를 인덱스라고 부른다.

  • 위치값을 뜻한다.
  • 시퀸스객체 인덱스는 항상 0으로 부터 시작된다.

시퀸스

  • 데이터를 하나씩 순서대로 나열한 것
  • 한 위치를 가리켜 데이터를 집어내는 것도 가능

특징

  • 데이터를 순서대로 하나씩 나열하여 나타낸 데이터구조.
  • 특정 위치(N번째)의 데이터를 가리킬 수 있다.

알고가기

A. Python의 배열은 List인가요, Array인가요?
Q. Python의 List는 Array로 구현되어 있다.

Array가 List를 포함하고 있음

A. .append() 메소드를 쓰면, 새로운 배열(Araay)을 생성해서 안 좋은 것 아닌가요?
Q. 내부적으로 동적 배열이라는 것을 사용해서, 배열의 길이가 늘어나도 O(1)의 시간 복잡도가 걸린다.

*Python의 배열(Array)는 List로도 쓸 수 있고, 배열 그 자체(Array)로도 쓸 수 있다. 이는 매우 효율적인 자료구조다.


CS (Server)

  • Client => request (요청)

  • server => response (응답)
    Client와 Server는 URL로 소통한다.

  • Server == Computer (Internet에 연결된 상태에서)

  • 127.0.0.1 == Localhost == 내 컴퓨터

  • 프레임워크 = 순수 개발에만 몰입할 수 있게 도와주는 도구

  • Route란?
    - 경로, 길

    • Client로부터 요청(request)이 들어오면, 해당 요청에 맞는 경로를 알려줌.
    • default로 GET을 가짐.
  • Port란?
    - 서버로 들어갈 수 있는 고유번호

  • def == definition (정의)

  • render
    - v. (만들어)주다

    • render_template('index.html') : index.html을 브라우저(Client)에게 주다
  • GET
    - parameter(매개변수)노출

    • 간단한 랜더링 기능을 수행할 때 쓰임
  • POST
    - parameter(매개변수) 노출 X

DB 통신은 POST나 Petch로 통싱할 것. GET은 데이터 유출로 인하여 사용하면 안된다.

  • 비동기와 동기 방식 차이
    - 출처(슬랙 내배캠4기 강__ 동기님⭐️)

    app.py를 실행했을 때, Running on http://127.0.0.1:5000 은 왜 뜨는지 알겠어!
    그렇다면 그 아래에 떠있는 주소 는 뭐지?
    이에 대해 제가 검색하고 약간의 실험(?)을 하여 이해한 바로는... 인터넷 연결 주소인 것 같습니다!
    그러니까 127.0.0.1 은 나의 컴퓨터 자체 주소 (내 컴퓨터, 이를 루프백 IP주소라고 하더군요)이며,
    그 아래에 뜬 192.~.~.~ 은 나의 컴퓨터(클라이언트) -> 인터넷(브라우저) -> 나의 컴퓨터(서버) 라는 여정을 통해!!
    인터넷을 들어갈 때 받은 나의 인터넷 ip 주소 인 것 같습니다. (좀 더 정확하게는 라우터를 통하고 어쩌고 저쩌고의 여정을.. 중요하지 않으니 넘어갑시다)
    이는 인터넷에 "내 아이피" 를 치거나,
    "윈도우 설정 -> 네트워크 및 인터넷 -> 이더넷(Wi-Fi) 속성 -> 아래쪽 속성 부분의 IPv4" 부분을 보셔서 확인 할 수 있습니다.
    혹은! " 윈도우 + R " 을 눌러 실행창을 킵니다 -> cmd 를 적고 확인 -> 명령프롬프트가 뜨면 ipconfig 입력 후 엔터! -> 그럼 본인이 사용하고 있는 네트워크 목록이 나오는데 거기서 IPv4 주소를 확인 할 수도 있습니다!
    맥에서는 터미널에서 ipconfig가 아닌 ifconfig로 확인 또는 설정 -> 네트워크 -> 와이파이 또는 이더넷 -> 세부사항 에서 확인 가능 하다고합니다! (이정익님 감사해용)
    조금 더 설명을 추가하면, 루프백 IP주소는 "현재 내가 사용하고 있는 장치 자체의 주소" 로 생각하면 될 것 같습니다.
    즉, 나 자신 을 가리키는 IP라고 생각됩니다. (제발 맞다고 해줘)
    또, 검색을 하다 보니 알게 됐는데
    우리의 app.py 에 마지막 코드는 다들 app.run('0.0.0.0', port=5000, debug=True) 로 되어있으리라 생각됩니다.
    이 때, 0.0.0.0 은 local 장치의 모든 IP를 뜻한다고 합니다. (정확히 어떤 의미인지 아시는 분은 댓글로 알려주세요!)
    제 생각에 이 부분은 "브라우저로 서버에 접속할 때의 url"의 역할인 듯 합니다.
    제가 위에서 나의 컴퓨터(클라이언트) -> 인터넷(브라우저) -> 나의 컴퓨터(서버) 라는 여정을 통해 나의 인터넷 ip주소 를 받게 된다고 했는데, 0.0.0.0 에 나의 인터넷 ip 주소를 넣어도 잘 작동하는 것을 알 수 있습니다.
    (단, 이때는 localhost:5000 이 아닌 " 나의 인터넷 ip 주소:5000 " 을 통해 브라우저로 서버에 접속이 가능합니다)
    제가 이해한 게 틀릴 수도 있으니 이 부분에 대해 정확히 아시면 댓글 남겨주시기 바랍니다!
    혹은 이 누추한 글을 읽으시며 "어? 이 부분은 이게 아니라 이거 같은데?" 라는 생각이 드신 분이 있으시더라도 댓글에 남겨주시기 바랍니다..
    (제발 아무 댓글이라도 좋으니 댓글 달아주세요)
    어찌보면 쓸 데 없을 수도 있는 글 읽어주셔서 감사합니다..
    (내 ip 확인하기 부분을 조금 추가했어요)

profile
- 배움에는 끝이 없다.

1개의 댓글

comment-user-thumbnail
2022년 11월 11일

동기의 답변 ㅎㅎ 최고~

답글 달기