[BOOK] IT 5분 잡학 사전

Beanxx·2024년 9월 25일
1

Dev-Book

목록 보기
3/3
post-thumbnail

오랜만에 완독해본 개발 서적 ~📚
밀리의 서재로 올해 초에 좀 읽다가 다시 읽기 시작해서 이제야 끝까지 다 읽었다 🫠
여러 주제에 대해 가볍게 다룬 책이라 재미삼아 읽기 좋았던 책 !
기억하고 싶었던 내용 요약해보기 ~*

✅ 1. Basic

☑️ 1.1. 어떤 언어를 공부해야 할까?

‣ C

: 제한된 상황에서 최대 성능을 내기 위해 만들어짐 → 가전 제품에 이식되는 프로그램에 주로 사용

‣ Java

: 자바 기반 전자 정부 프레임워크 사용 회사가 많아서 우리나라 회사에 취업할 때 유리 + 안드로이드 개발에도 사용됨 (자바 → 코틀린)

‣ Python

: 현재 가장 많이 사용하는 언어로 머신러닝이나 데이터 과학 분야에서 사용 가능 → 범용성이 넓고 초보자들이 배우기에 추천

JavaScript

: 웹 프로그래밍 개발


☑️ 1.2. 새 프로그래밍 언어 쉽고 빠르게 공부하는 방법!

  1. 공식 문서
  2. 문법 확인
  3. 다른 언어와 비슷한 특징 집중해서 보기
  4. 새 언어로 코딩 시도
  5. 공식 문서 내 튜토리얼 시작
  6. 나만의 프로젝트 만들기

☑️ 1.3. C, C++, C# 은 이름처럼 비슷할까?

‣ C언어

: 1972년 개발, 메모리 자원을 효율적으로 사용하면서 실행 속도가 빠름

‣ C++

: C를 포함하는 언어 / 절차 지향 + 객체 지향 / 실행속도는 C언어와 비슷

‣ C#

: 마이크로소프트가 만든 자바 언어 / C, C++보단 느림


☑️ 1.4. 파이썬이 C언어보다 느린 이유는?

‣ 인터프리터

: 실시간 통역 (e.g. python, javascript)

‣ 컴파일

: 한번에 통역 (e.g. C)

👉 즉, C언어가 파이썬보다 속도가 빠르다!


☑️ 1.5. 코틀린은 자바와 100% 호환될까?

🙆‍♀️ 자바와 코틀린은 100% 호환이 가능하다!

⌙ why? 자바를 70%나 사용하고 있었던 JetBrains 회사에서 자바를 자바와 호환되는 새로운 언어로 개선하고 싶어서 만들게 된 언어가 코틀린이기 때문!


  • compilation: 코드 전체를 받아서 한번에 기계어로 해석 (fast)
  • interpretation: 코드를 실시간으로 기계어로 해석

👀 자바 코드 → 자바 바이트 코드로 컴파일 → 자바 가상 머신을 통해 해석해서 기계어로 변역
👉 코틀린을 자바 바이트 코드로 컴파일하기만 하면 되므로 코틀린이 자바와 100% 호환!

‣ 코틀린 장점

  1. 자바(null 허용)와 달리 null이 있을 것 같으면 코드 실행 전 미리 알려줌
    (null 허용은 하지만 null 발생 가능성 미리 검사해주는 것)
  2. 코틀린은 안드로이드 앱 개발할 때도 사용하는데 코틀린 코드를 JS로 컴파일해서 react나 node.js에 활용 가능


✅ 2. 웹 기술

☑️ 2.1. 라이브러리 vs 프레임워크

  • 차이점: ‘누가 누구를 제어하는가?’
    • 라이브러리: 개발자가 필요할 때 불러쓸 수 있는 것 (e.g. jQuery, BootStap)
    • 프레임워크: 개발자가 정해진 규칙을 따라야 하는 것 (e.g. Spring, Django)

☑️ 2.2. API

: (Application Programming Interface) 프로그램끼리 소통할 때 쓰는 일종의 규칙을 코드화한 것

✋ 사용자는 API 작동 방식을 알 수 없음 → 그저 API가 제공하는 기능의 결과만 보는 것!


☑️ 2.3. 도메인

‣ HTTP

: (HyperText Transfer Protocol) 인터넷에서 정보를 주고받기 위한 프로토콜
⇒ 즉, 인터넷에서 사용자와 서버가 정보를 주고받기 위한 일종의 규칙

‣ registry

: 서브 전화번호부 (e.g. .com, .co, co.kr)


☑️ 2.4. 쿠키(Cookie) 🍪

: 웹사이트를 접속할 때마다 서버에 전송되어서 서버의 기억을 되살리는 역할

브라우저에 주소를 치면 → 서버는 그 주소에 해당하는 데이터를 보내주고 → 데이터를 다 보내면 우리와 연결 상태를 끊음 → 결론적으로 우리가 누구인지 잊어버림

💡 이때, 우리가 누구인지 기억해야 할 필요가 있는데 이때 ‘쿠키’가 필요!

‣ 쿠키 규칙

  1. 도메인 1개에만 한정
  2. 자동으로 쿠키를 보냄
  3. 컴퓨터에 자동으로 저장됨

☑️ 2.5. 프론트엔드 vs 백엔드 ?

‣ 프론트엔드

  • 프론트엔드 기술은 빨리 발전해서 공부해야 할 내용이 방대
    ⇒ 끊임없이 발전하고 업데이트하는 환경

‣ 백엔드

  • 개발 환경 안정적
  • 기술 선택지 다양

☑️ 2.6. 서버 vs 서버리스

‣ 서버

  • 24시간 내내 주소 입력 대기
  • 주소가 입력되면 그 주소에 해당하는 데이터를 꺼내서 보여줌
    ⇒ 서버는 항상 켜져 있는 컴퓨터이면서 인터넷에 연결되어 있으며 접속 요청에 응답하는 컴퓨터

‣ 서버리스

: 직접 관리하지 않는 서버 (e.g. Amazon: 등록한 함수가 실행된 만큼만 돈을 지불하면 됨)

👎 서버리스 단점

  1. cold start: 요청하지 않을 때 잠을 자고 있는 함수들이 깨는데 시간이 필요함 (응답 시간이 조금 더 필요)
  2. 서버 제공자에게 지나치게 의존함

👉 서버 관리, 설정에서 시간을 아끼고 싶다면 서버리스 추천!



✅ 3. 컴퓨터 공학 1

☑️ 3.1. 배열

‣ 시간 복잡도

: 프로그램의 작업 속도가 얼마나 빠른지 측정하는 방법

‣ Memory

: 컴퓨터의 기억 공간

  1. 비휘발성 메모리: like 컴퓨터 하드 드라이브
  2. 휘발성 메모리: RAM
    (컴퓨터 끄면 램에 있는 데이터 전부 사라짐, 램에는 프로그램에 필요한 데이터가 저장됨 → 데이터에 접근하는 속도가 매우 안정되며 빠름)

‣ 배열

  • 👍 배열에서 데이터 읽는 속도 fast (배열의 시작 주소와 길이를 알고 있기 땜에)
  • 👎 검색 속도는 not fast
  • 👎 배열 삽입, 삭제는 slow

☑️ 3.2. 알고리즘 속도는 어떻게 표현할까?

‣ Big-O

: 알고리즘의 속도(시간 복잡도)를 표현하는 방법

  • Big-O는 실행 단계에 영향을 주는 요소만 본다
  • 상수 시간(constant time) = O(1):
    이미 실행횟수가 고정으로 정해진 것 (배열 길이와 상관없이 늘 실행 횟수가 같음을 의미)

☑️ 3.3. 검색 알고리즘

‣ 선형 검색

: 배열 길이가 길어지는 만큼 검색 시간도 길어짐 (y = x)

‣ 이진 검색

: 데이터 정렬이 끝난 배열(데이터가 순서대로 정렬된 상태)에서만 사용 가능 (y = log x)

  1. 배열 중앙에서 검색 시작
  2. 찾으려는 값이 중앙값보다 작으면 👈 왼쪽으로 | 크면 오른쪽으로 👉

🙋‍♀️ 이진 검색이 속도가 빠른 이유는 ? → 단계마다 배열의 절반을 제외할 수 있기 때문

🧚‍♀️ 이진 검색 summary

  • 거대한 배열을 다룰 때 더 효과적
  • 이진 검색 알고리즘을 사용하려면 배열이 항상 정렬되어 있어야 한다

☑️ 3.4. 정렬 알고리즘

‣ 버블 정렬 (bubble sort) 🫧

: 왼쪽부터 2개씩 비교하는데 오른쪽으로 1칸씩 밀면서 왼쪽과 오른쪽을 비교하는 방식으로 정렬

→ 왼쪽 > 오른쪽 → 자리 switch ⇒ 1 cycle → 가장 큰 수가 제일 오른쪽 자리에 위치
→ 2 cycle 에선 마지막 위치에서 1개를 제외하고 진행 !

  • 좋은 알고리즘은 아님,,
  • 시간 복잡도: O(N^2)

‣ 선택 정렬(selection sort)

: 가장 작은/큰 데이터 위치를 따로 기억하는 방식으로 진행

가장 작은 데이터가 있는 위치를 파악한 후 0번째 위치로 switch (1 cycle)
→ 그 다음으론 index 1부터 cycle 시작

  • 시간 복잡도: O(N^2)
  • But, 버블 정렬보단 훨씬 효율적
    ⌙ why? 자리를 바꾸는 연산은 사이클당 1번씩만 하므로!

‣ 삽입 정렬(insertion sort)

  • 앞에 있는 데이터를 보면서 배치
  • 사이클마다 데이터 1개를 앞쪽으로 밀어 넣음

✋ 데이터를 교환하는 게 아니라 밀어 넣는 것에 주의!

  • 시간 복잡도: O(N^2)
    • 선택 정렬, 버블 정렬보다 빠름

🙋‍♀️: 시간복잡도는 같은데 속도 차이나 나는 이유?
🎙️: 단순히 측정한 시간 복잡도는 같아도 알고리즘은 초기 데이터 상태에 따라 처리 속도가 달라지므로 평균적으로 빠른 알고리즘이 있을 수 있음!


☑️ 3.5. 스택(stack), 큐(queue)

‣ 큐(Queue)

  • 먼저 들어온 데이터가 먼저 빠져 나갈 수 있음
    ⇒ 즉, 위로 데이터를 쌓고, 아래에서부터 데이터를 뺀다
  • FIFO (first in, first out) = 선입선출

🤷‍♀️ when use 스택, 큐 ?

  • [스택] 웹 브라우저의 뒤로가기 버튼 (맨 마지막에 방문한 녀석을 뺌)
  • [스택] 되돌리기 단축키 Ctrl + Z (가장 마지막 실행 기록을 빼서 없애 버림)
  • [큐] 쇼핑몰 주문 처리 시스템 (주문이 들어온 순서대로 데이터 쌓고, 가장 먼저 온 주문부터 처리)

☑️ 3.6. Hash Table

  • 해시 테이블: 키&값을 짝지어 모은 것 (like 사전)
  • 시간 복잡도: O(1) → 효율 so good!!!👍👍
  • 배열 형태로 구성 (배열에 해시 함수가 세트로 존재)
    • 해시 함수: 검색할 때 쓰는 키를 인덱스로 바꿔주는 역할
    • 해시 충돌(hash collison): 같은 인덱스를 반환해야 하는 상황
      • 대처 방법 : 같은 인덱스에 또 다른 배열 넣기

☑️ 3.7. Clean Code

  • 클린 코드: 설명이 필요 없는 코드 (코드를 설명하지 않아도 이해가 되는 고런 코드..!)
  1. 의미 있는 변수, 함수의 이름을 적절히 사용하라
  2. 함수 이름은 가급적 동사로 지어라 (함수 액션은 1개인 것이 좋음)
  3. 매개변수는 너무 많이 쓰지 마라
    • 3개 이하까지 ok
    • 매개변수를 많이 설정해야 한다면 configuration object방식으로 매개변수 묶어서 전달하는 방식 사용 추천 (함수 파악 용이)
    function makePayment({a, b, c, d, e}) { ... }
   	makePayment({a: 1, b: 2, c: 3, d: 4, e: 5})
  1. Boolean 값을 인자로 보내지 마라
    • boolean 값으로 보통 if-else문을 사용하여 실행 분기를 나누는데 그럼 함수는 최소 2가지 동작을 하게 되기 떄문
  2. 축약어를 쓰지 마라


✅ 4. 컴퓨터 공학 2

☑️ 4.1. SQL

  • SQL (Structured Query Language): 데이터베이스에 어떤 질문/문의를 하기 위해 어떤 구조를 가진 언어
    ⇒ 데이터베이스를 다루는 언어
    ⇒ 데이터베이스를 관리해 주는 DBMS와 대화하기 위한 언어

  • DBMS(DataBase Management System): 데이터베이스 관리 시스템
    ⇒ 즉, SQL로 데이터베이스와 상호작용을 하려면 DBMS를 거쳐야 함

  • 데이터베이스 - 데이터를 보관하는 역할
  • DBMS - 데이터를 직접 정리하거나 처리
  • MySQL, Oracle, MariaDB와 같은게 다 DBMS !

  • ORM(Object Relational Mapping): 개발자에게 SQL 번역기 같은 도구


☑️ 4.2. NoSQL

‣ document DB

e.g. MongoDB - 데이터를 JSON document 형태로 저장

[{"id": 1, "name": apple}, {"id": 2, "name": pear}]
  • JSON: JavaScript Object Notation
  • JSON document: JSON 형식으로 저장된 파일

👀 SQL로 다루는 데이터베이스는 표 형태여서 매우 정적인 반면,
👀 NoSQL은 대괄호, 중괄호로만 구성되어 있고, 데이터마다 구성이 같을 필요가 없어서 원하는 포맷으로 저장할 수 있는 장점이 있음


‣ key-value DB

e.g. 카산드라DB(CassandraDB) - column wide (애플, 넷플, 인스타그램 등에서 사용)

e.g. 다이나모DB(DynamoDB) - 아마존에서 만든 DB

⇒ 둘 다 속도가 매우 빠름


‣ graph DB

: 노드 개념을 활용한 페이스북에서 만든 DB


☑️ 4.3. Git & Github

  • git: 파일 이력 관리 프로그램
  • github: 파일과 git으로 관리한 이력을 저장하고 공유하는 공간 = 파일 클라우드 서비스
    • push: github에 git 이력을 업로드하는 것
    • pull: github에서 git 이력을 내려받는 것

☑️ 4.4. 버전 표기 방법

  • Sem Ver(Semantic Versioning Specification): 숫자 3개를 사용하는 버전 표기 방식
    • e.g. 4.1.2
      - 1.0.0 → 2.0.0 : 새 버전에 맞게 코드 업데이트 필요
      - 1.0.0 → 1.1.0 : 새 기능 추가 수준 정도
      - 1.0.0 → 1.0.1 : 패치나 버그 숫정

☑️ 4.5. 비밀번호 저장 시스템

[해시 함수 활용]
- 동일 입력값 → 동일 출력값
- 입력값이 아주 살짝만 바껴도 출력값은 완전 바뀜 (무작위성)
- 반대로 입력한다고 해서 원래 값이 나오지 않음

레인보우 테이블
: 해시 함수가 변경한 값을 원래의 값과 연결한 표 ⇒ 해시 함수도 완벽하진 않음

  • 솔트(salt): 아주 작은 무작위 텍스트

👍 비밀번호 + 솔트 ⇒ 해시함수 통과시키기 → 레인보우 테이블 있어도 원래 비밀번호 찾을 수 없음!


☑️ 4.6. 객체 지향 프로그래밍

  • 프로그래밍 페러다임: 프로그래머가 프로그래밍할 때의 관점, 방식 = 프로그래밍 하는 사고
    • 종류 - 객체 지향, 절차 지향, 함수형 프로그래밍
  • 클래스: 속성은 같지만 데이터는 다른 것들을 위한 like 공장 느낌
  • 상속: 중복을 줄이기 위한 개념

☑️ 4.7. 함수형 프로그래밍

  • 프로그래밍 패러다임 중 하나
  • 버그가 발생하기 어려운 구조라 개발자에게 매우 유용하므로 함수형 프로그래밍을 배워야 함!

1. 선언형 프로그래밍
: 원하는 결괏값을 선언 (e.g. CSS)

  • 결과 중심으로 코드를 작성해서 실수도 적고, 동료가 코드를 이해하기도 쉬움

2. 명령형 프로그래밍
: 원하는 결괏값에 어떻게 도달하는지 선언

  • 할 일을 세세하게 지시할 수 있지만, 개발자가 실수하기 쉽고, 내가 작성한 코드를 동료가 이해하기 어려울 수 있음

👉 함수형 프로그래밍은 함수 중심으로 코드를 적는 방식으로, 선언형 프로그래밍 콘셉!



✅ 5. 최신 기술

☑️ 5.1. 인공지능, 머신러닝, 딥러닝

  • AI: Artificial Intelligence

‣ 인공지능

  • 일반 인공지능 (general AI = strong AI)
    • 사람처럼 행동하는 인공지능으로, 현실엔 아직 없음
  • 좁은 인공지능 (narrow AI = weak AI)
    • 몇 가지 일만 할 줄 아는 인공지능 즉, 한정된 영역에서만 동작
    • 현재 인공지능 기술의 위치
    • e.g. 얼굴인식, 음성인식 등

👉 이런 인공지능이 학습하는 방식 또는 인공지능을 학습시키는 방식이 머신러닝, 딥러닝 !

‣ 머신러닝

: 인공지능을 학습시키는 방법

  • 지도학습(supervised learning)
    : 기계 자율로 판단하지 않고 인간이 기계에게 준 라벨(특징?)을 토대로 학습해서 대답 (e.g. 음악 추천 시스템)

  • 비지도 학습(unsupervised learning)
    : 라벨이 없는 데이터를 주는 것 → 직접 가르치지 않는 학습 (정답을 미리 알려 주지 않음) (e.g. Tensor Flow)

‣ 딥러닝

  • 머신러닝을 달성하기 위한 방법 (즉, 머신러닝 하위 개념)
  • 여러 층으로 깊이(deep) 학습

☑️ 5.2. REST API

  • REST API : Representational State Transfer API
    • URL에서 동사 제외하기
    • HTTP 메서드 도입
      • GET, POST, PUT, DELETE ... → URL에 갈림길을 만들어주는 웹 기술
      • HTTP 메서드를 사용하면 같은 URL로 다른 작업을 할 수 있음
    • 쿼리 도입
      • 쿼리 파라미터 사용 (e.g. /movies?min+rating=9.8)

☑️ 5.3. Docker

  • 도커는 개발 환경이 맞지 않은 상황 또는 개발 환경이 변경되었을 때 유연하게 대처할 수 있게 해줌
    ⇒ 즉, 도커는 어떤 컴퓨터에서도 같은 개발 환경을 준비할 수 있도록 해주는 도구
  1. 컴퓨터(window)와 서버(Linux)에 도커 설치
  2. 도커 파일 생성 (구현하고 싶은 환경 목록 존재)
  3. 컴퓨터와 서버에 전달하면 도커는 자동으로 그 파일을 확인하여 필요한 것을 내려받아 설치함
  • 컨테이너: 도커가 준비한 프로그래밍 언어가 동작하는 환경
    • 개발 환경이 여러 종류 필요할 경우 그것을 도커가 컨테이너로 나누어서 관리함
    • 도커 컨테이너는 각각 서로 분리되어 있고, 독립적 → 하나의 컴퓨터에 수많은 컨테이너가 존재할 수 있음
      ⇒ 컨테이너를 미리 분리해서 관리하면 개발 환경이 갑자기 변해도 쉽게 대처 가능
    • 만약 자바 애플리케이션 사용량이 증가한다면 자바 컨테이너 개수만 늘리면 됨!
      ⇒ 도커는 컨테이너 수를 필요한 만큼 늘려줌
      ++ 추가 개발 환경은 컨테이너를 복제하면 바로 준비 가능

🧚‍♀️ Docker Summary

  • 도커는 원하는 개발 환경을 도커 파일에 저장하여 준비해줌
  • 도커가 마련한 개발 환경은 컨테이너 형태로 존재하므로 개발에 필요한 도구를 따로 모아 준비할 수 도 있고, 쉽게 복제할 수도 있음

☑️ 5.4. 하이브리드 앱

‣ 하이브리드 앱

: 웹 사이트를 보여 주는 웹 뷰
⇒ HTML, CSS, JS로 개발한 웹 앱을 모바일에서 쓸 수 있도록 hybrid로 만들어 앱을 구글 플레이스토어나 앱 스토어로 보내는 것

  • 웹 뷰: 브라우저의 윈도우 부분 ⇒ 주소 창(내비게이션)이 없는 브라우저

👍 네이티브 앱 개발 지식 필요 없음

👎 UI를 한 땀 한 땀 구현해야 함
👎 스마트폰의 성능을 온전히 활용하지 못함


‣ 크로스 플랫폼 앱

: 특정 언어로 코딩하면 나중에 iOS, android가 이해할 수 있는 코드로 변환해서 만듬
⇒ 어떤 언어로 코드를 작성하면 그 코드가 나중에 네이티브 코드로 변환된다는 것!

e.g. React-Native (React → JS → JS엔진으로 iOS, Android가 실행)
e.g. Flutter (Dart → C/C++)

👍 코드를 한 번만 작성해도 iOS, android 환경 모두 실행 가능

👎 네이티브 앱 성능을 아직은 따라갈 수 없음
(결국 네이티브 언어로 변환하는 과정이 있어서 성능에 조금 문제가 있을 수 밖에 없음)


‣ 네이티브 앱

: iOS만을 위한(swift), android만을 위한(java/kotlin) 언어로 코드를 작성하여 개발

👍 스마트폰 성능 최대로 사용 가능

👎 다른 앱에 비해 배우는데 시간 x2배 걸림


☑️ 5.5. NFT

  • NFT(Non Fungible Token): 대체 불가능한 토큰

  • 토큰(Token): 블록체인으로 발행하는데 즉, 돈을 받는 기능과 돈을 받고 토큰을 보내주는 기능이 반드시 있어야 함 → 그것을 합쳐서 스마트 계약 이라고 함

  • NFT는 토큰을 딱 1개만 발행할 수 있도록 스마트 계약을 만들고, 그 안에 이미지를 넣는 것!
    👉 즉, 유일한 원본임을 증명하는 기술!

☑️ 5.6. 멀웨어, 바이러스, 웜

‣ 멀웨어(malware)

: malicious(악의 있는) + software악성 소프트웨어 → 컴퓨터를 감시하거나 파괴하는 😈

👀 사이버 무기는 국가나 특정 기관에서 다른 국가의 핵심 시설이나 인프라를 감시하거나 파괴하려고 제작함

  • 바이러스(virus) : 숙주 필요함 (e.g. 어떤 파일(숙주)을 내려받아서 열 때 감염)
  • 웜(worm) : 숙주 필요 없음 → 자기 자신을 복제하면서 전파 (e.g. USB로도 전파 가능)
    • 미사일 & payload 필요
      ⇒ 미사일을 통해 컴퓨터 안에 침투하고, 그 순간 페이로들르 배포하는 방식으로 컴퓨터를 파괴시킴
      ✋ 여기서 미사일이 더 위험한 이유 - 컴퓨터의 루트에 존재하는 운영체제(모든 자원 관리)에 설치되므로
profile
FE developer

0개의 댓글