오랜만에 완독해본 개발 서적 ~📚
밀리의 서재로 올해 초에 좀 읽다가 다시 읽기 시작해서 이제야 끝까지 다 읽었다 🫠
여러 주제에 대해 가볍게 다룬 책이라 재미삼아 읽기 좋았던 책 !
기억하고 싶었던 내용 요약해보기 ~*
: 제한된 상황에서 최대 성능을 내기 위해 만들어짐 → 가전 제품에 이식되는 프로그램에 주로 사용
: 자바 기반 전자 정부 프레임워크 사용 회사가 많아서 우리나라 회사에 취업할 때 유리 + 안드로이드 개발에도 사용됨 (자바 → 코틀린)
: 현재 가장 많이 사용하는 언어로 머신러닝이나 데이터 과학 분야에서 사용 가능 → 범용성이 넓고 초보자들이 배우기에 추천
: 웹 프로그래밍 개발
: 1972년 개발, 메모리 자원을 효율적으로 사용하면서 실행 속도가 빠름
: C를 포함하는 언어 / 절차 지향 + 객체 지향 / 실행속도는 C언어와 비슷
: 마이크로소프트가 만든 자바 언어 / C, C++보단 느림
: 실시간 통역 (e.g. python, javascript)
: 한번에 통역 (e.g. C)
👉 즉, C언어가 파이썬보다 속도가 빠르다!
🙆♀️ 자바와 코틀린은 100% 호환이 가능하다!
⌙ why? 자바를 70%나 사용하고 있었던 JetBrains 회사에서 자바를 자바와 호환되는 새로운 언어로 개선하고 싶어서 만들게 된 언어가 코틀린이기 때문!
compilation
: 코드 전체를 받아서 한번에 기계어로 해석 (fast)interpretation
: 코드를 실시간으로 기계어로 해석👀 자바 코드 → 자바 바이트 코드로 컴파일 → 자바 가상 머신을 통해 해석해서 기계어로 변역
👉 코틀린을 자바 바이트 코드로 컴파일하기만 하면 되므로 코틀린이 자바와 100% 호환!
null
허용)와 달리 null
이 있을 것 같으면 코드 실행 전 미리 알려줌null
허용은 하지만 null
발생 가능성 미리 검사해주는 것)라이브러리
: 개발자가 필요할 때 불러쓸 수 있는 것 (e.g. jQuery, BootStap)프레임워크
: 개발자가 정해진 규칙을 따라야 하는 것 (e.g. Spring, Django): (Application Programming Interface)
프로그램끼리 소통할 때 쓰는 일종의 규칙을 코드화한 것
✋ 사용자는 API 작동 방식을 알 수 없음 → 그저 API가 제공하는 기능의 결과만 보는 것!
: (HyperText Transfer Protocol)
인터넷에서 정보를 주고받기 위한 프로토콜
⇒ 즉, 인터넷에서 사용자와 서버가 정보를 주고받기 위한 일종의 규칙
: 서브 전화번호부 (e.g. .com
, .co
, co.kr
)
: 웹사이트를 접속할 때마다 서버에 전송되어서 서버의 기억을 되살리는 역할
브라우저에 주소를 치면 → 서버는 그 주소에 해당하는 데이터를 보내주고 → 데이터를 다 보내면 우리와 연결 상태를 끊음 → 결론적으로 우리가 누구인지 잊어버림
💡 이때, 우리가 누구인지 기억해야 할 필요가 있는데 이때 ‘쿠키’가 필요!
- 도메인 1개에만 한정
- 자동으로 쿠키를 보냄
- 컴퓨터에 자동으로 저장됨
: 직접 관리하지 않는 서버 (e.g. Amazon
: 등록한 함수가 실행된 만큼만 돈을 지불하면 됨)
👎 서버리스 단점
cold start
: 요청하지 않을 때 잠을 자고 있는 함수들이 깨는데 시간이 필요함 (응답 시간이 조금 더 필요)👉 서버 관리, 설정에서 시간을 아끼고 싶다면 서버리스
추천!
: 프로그램의 작업 속도가 얼마나 빠른지 측정하는 방법
: 컴퓨터의 기억 공간
- 비휘발성 메모리: like 컴퓨터 하드 드라이브
- 휘발성 메모리:
RAM
(컴퓨터 끄면 램에 있는 데이터 전부 사라짐, 램에는 프로그램에 필요한 데이터가 저장됨 → 데이터에 접근하는 속도가 매우 안정되며 빠름)
: 알고리즘의 속도(시간 복잡도)를 표현하는 방법
O(1)
:: 배열 길이가 길어지는 만큼 검색 시간도 길어짐 (y = x)
: 데이터 정렬이 끝난 배열(데이터가 순서대로 정렬된 상태)에서만 사용 가능 (y = log x)
- 배열 중앙에서 검색 시작
- 찾으려는 값이 중앙값보다 작으면 👈 왼쪽으로 | 크면 오른쪽으로 👉
🙋♀️ 이진 검색이 속도가 빠른 이유는 ? → 단계마다 배열의 절반을 제외할 수 있기 때문
🧚♀️
이진 검색
summary
- 거대한 배열을 다룰 때 더 효과적
- 이진 검색 알고리즘을 사용하려면 배열이 항상 정렬되어 있어야 한다
: 왼쪽부터 2개씩 비교하는데 오른쪽으로 1칸씩 밀면서 왼쪽과 오른쪽을 비교하는 방식으로 정렬
→ 왼쪽 > 오른쪽 → 자리 switch ⇒ 1 cycle → 가장 큰 수가 제일 오른쪽 자리에 위치
→ 2 cycle 에선 마지막 위치에서 1개를 제외하고 진행 !
- 좋은 알고리즘은 아님,,
- 시간 복잡도: O(N^2)
: 가장 작은/큰 데이터 위치를 따로 기억하는 방식으로 진행
가장 작은 데이터가 있는 위치를 파악한 후 0번째 위치로 switch (1 cycle)
→ 그 다음으론 index 1부터 cycle 시작
- 시간 복잡도: O(N^2)
- But, 버블 정렬보단 훨씬 효율적
⌙ why? 자리를 바꾸는 연산은 사이클당 1번씩만 하므로!
- 앞에 있는 데이터를 보면서 배치
- 사이클마다 데이터 1개를 앞쪽으로 밀어 넣음
✋ 데이터를 교환하는 게 아니라 밀어 넣는 것에 주의!
- 시간 복잡도: O(N^2)
- 선택 정렬, 버블 정렬보다 빠름
🙋♀️: 시간복잡도는 같은데 속도 차이나 나는 이유?
🎙️: 단순히 측정한 시간 복잡도는 같아도 알고리즘은 초기 데이터 상태에 따라 처리 속도가 달라지므로 평균적으로 빠른 알고리즘이 있을 수 있음!
FIFO
(first in, first out
) = 선입선출
[스택]
웹 브라우저의 뒤로가기 버튼 (맨 마지막에 방문한 녀석을 뺌)[스택]
되돌리기 단축키 Ctrl + Z (가장 마지막 실행 기록을 빼서 없애 버림)[큐]
쇼핑몰 주문 처리 시스템 (주문이 들어온 순서대로 데이터 쌓고, 가장 먼저 온 주문부터 처리)
해시 테이블
: 키&값을 짝지어 모은 것 (like 사전)
- 시간 복잡도:
O(1)
→ 효율 so good!!!👍👍- 배열 형태로 구성 (배열에 해시 함수가 세트로 존재)
- 해시 함수: 검색할 때 쓰는 키를 인덱스로 바꿔주는 역할
- 해시 충돌(
hash collison
): 같은 인덱스를 반환해야 하는 상황
- 대처 방법 : 같은 인덱스에 또 다른 배열 넣기
- 의미 있는 변수, 함수의 이름을 적절히 사용하라
- 함수 이름은 가급적 동사로 지어라 (함수 액션은 1개인 것이 좋음)
- 매개변수는 너무 많이 쓰지 마라
- 3개 이하까지 ok
- 매개변수를 많이 설정해야 한다면
configuration object
방식으로 매개변수 묶어서 전달하는 방식 사용 추천 (함수 파악 용이)function makePayment({a, b, c, d, e}) { ... } makePayment({a: 1, b: 2, c: 3, d: 4, e: 5})
- Boolean 값을 인자로 보내지 마라
- boolean 값으로 보통 if-else문을 사용하여 실행 분기를 나누는데 그럼 함수는 최소 2가지 동작을 하게 되기 떄문
- 축약어를 쓰지 마라
SQL
(Structured Query Language
): 데이터베이스에 어떤 질문/문의를 하기 위해 어떤 구조를 가진 언어
⇒ 데이터베이스를 다루는 언어
⇒ 데이터베이스를 관리해 주는 DBMS와 대화하기 위한 언어
DBMS
(DataBase Management System
): 데이터베이스 관리 시스템
⇒ 즉, SQL로 데이터베이스와 상호작용을 하려면 DBMS를 거쳐야 함
- 데이터베이스 - 데이터를 보관하는 역할
- DBMS - 데이터를 직접 정리하거나 처리
MySQL
, Oracle
, MariaDB
와 같은게 다 DBMS !
ORM
(Object Relational Mapping
): 개발자에게 SQL 번역기 같은 도구
e.g. MongoDB
- 데이터를 JSON document
형태로 저장
[{"id": 1, "name": apple}, {"id": 2, "name": pear}]
JSON
:JavaScript Object Notation
JSON document
: JSON 형식으로 저장된 파일
👀 SQL
로 다루는 데이터베이스는 표 형태여서 매우 정적인 반면,
👀 NoSQL
은 대괄호, 중괄호로만 구성되어 있고, 데이터마다 구성이 같을 필요가 없어서 원하는 포맷으로 저장할 수 있는 장점이 있음
e.g. 카산드라DB
(CassandraDB
) - column wide (애플, 넷플, 인스타그램 등에서 사용)
e.g. 다이나모DB
(DynamoDB
) - 아마존에서 만든 DB
⇒ 둘 다 속도가 매우 빠름
: 노드 개념을 활용한 페이스북에서 만든 DB
git
: 파일 이력 관리 프로그램github
: 파일과 git으로 관리한 이력을 저장하고 공유하는 공간 = 파일 클라우드 서비스push
: github에 git 이력을 업로드하는 것pull
: github에서 git 이력을 내려받는 것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 : 패치나 버그 숫정
[해시 함수 활용]
- 동일 입력값 → 동일 출력값
- 입력값이 아주 살짝만 바껴도 출력값은 완전 바뀜 (무작위성)
- 반대로 입력한다고 해서 원래 값이 나오지 않음
레인보우 테이블
: 해시 함수가 변경한 값을 원래의 값과 연결한 표 ⇒ 해시 함수도 완벽하진 않음
솔트(salt)
: 아주 작은 무작위 텍스트👍
비밀번호 + 솔트
⇒ 해시함수 통과시키기 → 레인보우 테이블 있어도 원래 비밀번호 찾을 수 없음!
프로그래밍 페러다임
: 프로그래머가 프로그래밍할 때의 관점, 방식 = 프로그래밍 하는 사고 객체 지향
, 절차 지향
, 함수형 프로그래밍
등 클래스
: 속성은 같지만 데이터는 다른 것들을 위한 like 공장 느낌상속
: 중복을 줄이기 위한 개념
- 프로그래밍 패러다임 중 하나
- 버그가 발생하기 어려운 구조라 개발자에게 매우 유용하므로 함수형 프로그래밍을 배워야 함!
1. 선언형 프로그래밍
: 원하는 결괏값을 선언 (e.g. CSS)
2. 명령형 프로그래밍
: 원하는 결괏값에 어떻게 도달하는지 선언
👉 함수형 프로그래밍은 함수 중심으로 코드를 적는 방식으로, 선언형 프로그래밍
콘셉!
AI
: Artificial Intelligence
일반 인공지능
(general AI
= strong AI
)좁은 인공지능
(narrow AI
= weak AI
)👉 이런 인공지능이 학습하는 방식 또는 인공지능을 학습시키는 방식이 머신러닝
, 딥러닝
!
: 인공지능을 학습시키는 방법
- 지도학습(supervised learning)
: 기계 자율로 판단하지 않고 인간이 기계에게 준 라벨(특징?)을 토대로 학습해서 대답 (e.g. 음악 추천 시스템)
- 비지도 학습(unsupervised learning)
: 라벨이 없는 데이터를 주는 것 → 직접 가르치지 않는 학습 (정답을 미리 알려 주지 않음) (e.g. Tensor Flow)
REST API
: Representational State Transfer API
- URL에서 동사 제외하기
- HTTP 메서드 도입
GET
,POST
,PUT
,DELETE
... → URL에 갈림길을 만들어주는 웹 기술- HTTP 메서드를 사용하면 같은 URL로 다른 작업을 할 수 있음
- 쿼리 도입
- 쿼리 파라미터 사용 (e.g.
/movies?min+rating=9.8
)
- 컴퓨터(window)와 서버(Linux)에 도커 설치
- 도커 파일 생성 (구현하고 싶은 환경 목록 존재)
- 컴퓨터와 서버에 전달하면 도커는 자동으로 그 파일을 확인하여 필요한 것을 내려받아 설치함
컨테이너
: 도커가 준비한 프로그래밍 언어가 동작하는 환경🧚♀️ Docker Summary
- 도커는 원하는 개발 환경을 도커 파일에 저장하여 준비해줌
- 도커가 마련한 개발 환경은 컨테이너 형태로 존재하므로 개발에 필요한 도구를 따로 모아 준비할 수 도 있고, 쉽게 복제할 수도 있음
: 웹 사이트를 보여 주는 웹 뷰
⇒ 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배 걸림
NFT
(Non Fungible Token
): 대체 불가능한 토큰
토큰(Token)
: 블록체인으로 발행하는데 즉, 돈을 받는 기능과 돈을 받고 토큰을 보내주는 기능이 반드시 있어야 함 → 그것을 합쳐서 스마트 계약 이라고 함
- NFT는 토큰을 딱 1개만 발행할 수 있도록 스마트 계약을 만들고, 그 안에 이미지를 넣는 것!
👉 즉, 유일한 원본임을 증명하는 기술!
: malicious
(악의 있는) + software
⇒ 악성 소프트웨어
→ 컴퓨터를 감시하거나 파괴하는 😈
👀 사이버 무기는 국가나 특정 기관에서 다른 국가의 핵심 시설이나 인프라를 감시하거나 파괴하려고 제작함
바이러스(virus)
: 숙주 필요함 (e.g. 어떤 파일(숙주)을 내려받아서 열 때 감염)웜(worm)
: 숙주 필요 없음 → 자기 자신을 복제하면서 전파 (e.g. USB로도 전파 가능)
- 미사일 & payload 필요
⇒ 미사일을 통해 컴퓨터 안에 침투하고, 그 순간 페이로들르 배포하는 방식으로 컴퓨터를 파괴시킴
✋ 여기서 미사일이 더 위험한 이유 - 컴퓨터의 루트에 존재하는 운영체제(모든 자원 관리)에 설치되므로