Basics
Computer Science of Basics

동기 🆚 비동기 ✔️

👉 동기 방식
  👉 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식
  👋 설계가 매우 간단하고 직관적
  👋 여러가지 요청을 동시에 처리할 수 없어 효율이 떨어짐
  👋 호출한 함수가 호출되는 함수의 작업의 완료 후의 return을 기다리거나 return을 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경씀
👉 비동기 방식
  👉 요청을 보낸 후 응답과 상관없이 다음 동작이 이루어지는 방식
  👋 여러가지 요청을 동시에 처리할 수 있어 자원을 효율적으로 사용할 수 있음
  👋 동기 방식에 비해 설계가 복잡함
  👋 호출되는 함수에게 callBack을 전달해서 작업이 완료되면 전달받은 callBack을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 X


Blocking 🆚 Non-Blocking ✔️

👉 Blocking
  👉 자신의 작업을 모두 마칠 때까지 제어권을 넘겨주지 않고 대기하게 만드는 방식
👉 Non-Blocking
  👉 호출된 즉시 바로 return하여 호출한 함수에게 제어권을 넘겨주고 호출한 함수가 다른 일을 할 수 있는 기회를 주는 방식


동기 & 비동기 🆚 Blocking & Non-Blocking

👉 관심사에 차이가 있음
  👉 동기 & 비동기
    👉 호출한 함수가 호출되는 함수의 작업 완료 여부를 신경쓰는지에 관심
      👉 Yes : 동기, No : 비동기
  👉 Blocking & Non-Blocking
    👉 호출되는 함수가 즉시 제어권을 return을 하는지에 관심
      👉 Yes : Non-Blocking, No : Blocking


동시성 🆚 병렬성

👉 여러 작업을 한번에 많이 처리 시키는 것
👉 동시성
  👉 동시에 실행되는 것처럼 보이는 것
  👉 싱글 코어에서 멀티 쓰레드를 동작 시키는 방식
  👉 Context Switching과 관련됨
    👉 동시 작업이 너무 많다면 Context Switching Overhead로 인해 싱글 코어에서 싱글 스레드로 작업하는 것이 더 빠를 수 있음
👉 병렬성
  👉 실제로 여러 작업이 동시에 처리되는 것
  👉 멀티 코어에서 멀티 쓰레드를 동작시키는 방식
👉 병렬성이 항상 우수한 것이 X, 동시성이 더 효율적일 때가 있음
  👉 네트워크 통신, 파일 저장 및 로드 등의 I/O 작업은 CPU가 거의 일을 하지 않고 요청 후 응답이 올 때까지 대기상태에 있음
    👉 이때, 한 개의 CPU가 I/O 요청 후 기다리는 동안 다른 작업을 처리하도록 하면 효율적


Git 🆚 Github ✔️

👉 Git
  👉 분산 버전 관리 시스템
  👉 프로젝트 파일의 변경 사항을 추적하는 시스템
  👉 개발자들은 이를 통해, 프로젝트 변경사항을 기록하고 특정 시점의 버전으로 언제든 돌아갈 수 있음
👉 Github
  👉 Git을 사용하는 프로젝트를 위한 호스팅 플랫폼 서비스
👋 repository : 프로젝트 저장소
👋 add : 커밋에 변경 사항을 추가
👋 push : 원격 저장소로 커밋을 전송
👋 pull : 원격 저장소의 변경 내용 가져오기
👋 commit : 프로젝트의 현재 상태를 나타내는 체크포인트, 커밋을 생성
👋 clone : 원격 저장소의 프로젝트를 로컬 저장소로 내려 받기
👋 branch : 독립적인 작업을 위해 새로운 버전을 생성하는 것


Pull Request

👉 수정한 코드가 있으니, branch를 가져가 검토 후 merge해 줄 것을 요청하는 것
👉 코드 충돌 최소화, push 권한이 없는 오픈 소스 프로젝트에 적합
👉 fork, clone, branch, add/commit/push, PR, merge PR, 데이터 동기화 및 branch 삭제


TDD(Test Driven Development) ✔️

👉 개발함에 있어 테스트를 많이 고려하는 프로그램 개발 방법
👉 쉽게 말해, 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 방법론
👉 개발 사이클 3단계
  👉 Red 단계에서는 실패하는 테스트 코드를 먼저 작성
  👉 Green 단계에서는 성공하기 위해 코드를 수정
  👉 Blue 단계에서는 중복 코드를 제거하는 등의 리팩토링을 수행
👉 코드의 안정성(모듈화)이 높아지며, 재설계(설계 변경) 시간이 단축된다는 장점이 있음
👉 일반적인 개발 방식보다 개발 시간이 늘어나기에 생산성이 저하된다는 단점이 있음


CI/CD

👉 애플리케이션 개발 단계부터 배포 단계까지 모든 단계를 자동화를 통해서 고객들에게 좀 더 빠르고 효율적으로 제공하기 위한 방법
👉 CI(Continuous Integration, 지속적 통합)
  👉 빌드 및 테스트 자동화
  👋 코드에 대한 통합을 지속적으로 진행함으로써 품질을 유지하자는 개념
👉 CD(Continuous Deployment, 지속적 배포)
  👉 배포 자동화
  👋 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 지속적으로 관리하자는 개념
👋 Jenkins, Bitrise, etc


Unit Test

👉 응용 프로그램에서 실행 및 테스트 가능한 가장 작은 소프트웨어를 실행하여 문제없이 의도한대로 잘 동작하는지 확인하는 테스트


Refactoring

👉 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법


애자일(Agile)

👉 변화하는 요구사항에 신속하고 민첩하게 대응하며 소프트웨어 개발을 진행하기 위한 방법론
  👉 계획에 의존하며 형식적인 절차를 따라야 하는 고전적인 방법인, Waterfall의 단점을 보완하기 위함
    👉 가장 큰 단점 : 시간의 낭비
  👉 기능을 축소하고 주기를 짧게 하여, 빠르게 한 주기 돌린 후 중간 피드백을 많이 가지는 방식
👋 대표적인 애자일 프레임워크 : 스크럼, 칸반 등
  👉 스크럼
    👉 애자일을 이상적으로 실행할 수 있게 하는 애자일 프레임워크의 한 유형
    👉 제품 출시 기간을 단축하기 위한 애자일 방법론의 활동
    👉 팀에서 개발자는 보통 1-4주 단위의 스프린트로 작업을 진행함
      👉 스프린트 : 과제가 진행되는 짧은 하나의 주기
  👉 칸반
    👉 애자일을 이상적으로 실행할 수 있게 하는 애자일 프레임워크의 한 유형
    👉 시각적 워크플로우를 통해 팀의 진행 상황을 보여줌
👋 백로그
  👉 프로젝트 수행에 필요한, 즉 해야할 일들의 목록


Library

👉 자주 사용하는 코드를 함수로 가공하여 정리해 놓은 것을 재사용할 수 있게끔 해놓은 일종의 코드 모음집


Framework

👉 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합
👉 쉽게 말해, 특정 프로그램을 만들기 위해 여러 기능을 제공함


Framework 🆚 Library

👉 Framework : 전체적인 흐름을 자체적으로 제어함
👉 Library : 사용자가 직접 흐름에 대한 제어를 함

URL 🆚 URI

👉 URL(Uniform Resource Locator)
  👉 인터넷에 있는 자원을 나타내는 유일한 주소
👉 URI(Uniform Resource Identifier)
  👉 네트워크 상에서 자원 위치를 알려주기 위한 규약
✋ URI가 URL의 상위 개념


에러 🆚 예외

👉 에러
  👉 시스템에 미리 예측할 수 없던 비정상적인 상황이 생겼을 때 발생
👉 예외
  👉 미리 예측하여 프로그램의 코드로 처리할 수 있는 예외적인 상황


Client 🆚 Server

👉 두 개의 컴퓨터 프로그램 사이에 이루어지는 역할 관계를 나타내는 용어
👉 Client
  👉 다른 프로그램에게 서비스를 요청하는 프로그램
👉 Server
  👉 요청을 처리하여 응답을 해주는 프로그램


Parameter 🆚 Argument

👉 Parameter
  👉 함수를 정의할 때 나열되는 변수 명
  ✋ void solution(int a, int b)
👉 Argument
  👉 함수 호출 시 함수의 파라미터로 전달된 실제 값
  ✋ solution(7, 9) // 7, 9 ; argument


API(Application Programming Interface)

👉 하나의 프로그램에서 다른 프로그램으로 데이터를 주고 받는 방법
  👉 손님과 식당이 있다면 메뉴판 혹은 키오스크가 API


Load Balancing

👉 둘 이상의 CPU or 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것
👉 클라이언트와 서버 사이에 Load Balancer를 두어 부하가 일어나지 않도록 함
✋ Round Robin, Least Connection Method, IP Hash, etc


Data Race (Problem Thread with 전역변수)

✋ 서로 다른 Thread에서 동시에 같은 변수에 접근하면
✋ 4개의 Thread, 각각 전역변수 a에 +1, 2500000번 실행
✋ a = 4 * 2500000 = 10000000을 예상
✋ 실제 결과, ex) a = 4827031
✋ Why?
👉 같은 변수를 동시에 접근했기 때문
👉 CPU 연산 과정의 문제
  👉 1. a의 값을 메모리에서 레지스터로 불러옴
  👉 2. 레지스터에서 더함
  👉 3. 더한 값을 실제로 a가 있는 메모리에 저장
👉 즉, 4개의 Thread가 거의 동시에 실행하려다 보면 3번째 과정이 끝나기 전에 다른 Thread가 a의 값을 메모리에서 레지스터로 불러올 수 있음


ASCII Code 🆚 UniCode 🆚 UTF-8

👉 숫자로 문자를 표현하기 위한 일종의 약속된 코드
👉 ASCII Code
  👉 1byte로 표현
  👉 1bit, parity bit
  👉 즉, 128(2^7)개의 문자 표현 가능
👉 UniCode
  👉 2byte로 표현
  👉 즉, 65536(2^16)개의 문자 표현 가능
  👉 전 세계 언어의 문자를 정의하기 위한 국제 표준 코드가 등장, But, 이 역시 부족
👋 UTF-8
  👋 대표적인 유니코드 인코딩 방식
    👋 인코딩 방식이란, 컴퓨터가 어떤 글자를 만났을 때 얼만큼씩 읽어야 하는지 미리 말해주는 것
  👋 유니코드 한 문자를 나타내기 위해서 1byte에서 4byte까지 사용, 이를 가변 길이 인코딩 방식이라 함
    👋 가변적으로 인코딩하는 이유는, ASCII 문자들은 1byte로 문자를 표현할 수 있는데, 모든 문자를 4byte를 사용한다면 저장소의 낭비
  👋 따라서, ASCII Code로 표현 가능한 것들은 1byte로 표현, 그것이 안된다면 2바이트 이상을 사용하는데, 이때 이 방식이 UTF-8 방식
  👋 첫번째 바이트를 통해 몇 바이트를 읽을 지 구분
    👋 0xxxxxxx : 첫 번째 바이트가 0으로 시작한다면 0 이외의 나머지 7비트를 아스키로 인식
    👋 110xxxxx 10xxxxxx : 두번째 바이트까지 읽어서 11비트로 하나의 문자로 표현
    👋 1110xxxx 10xxxxxx 10xxxxxx : 세번째 바이트까지 읽어서 16비트로 하나의 문자로 표현
    👋 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx : 네번째 바이트까지 읽어서 21비트 하나의 문자로 표현
👋 parity bit
  👉 통신 에러 탐지 비트
  👉 일곱 자리 중 1의 개수 홀수 개면 1, 아니면 0을 덧붙임
  👉 정밀하지는 않지만, 어느 정도 에러 탐지 가능


Memory Leak

👉 컴퓨터 프로그램이 더이상 필요하지 않은 메모리를 계속해서 점유하고 있는 현상


Dangling Pointer 🔥

👉 여전히 해제된 메모리 영역을 가리키고 있는 포인터


Garbage Collector(Java)

👉 Garbage를 청소해주는 JVM 실행 엔진의 한 요소
👉 Garbage Collector가 메모리를 정리하는 과정을 Garbage Collection
👋 Garbage : 더 이상 참조되지 않는 메모리
👋 Link
👋 Link2


JSON

👉 간결하고 쉽게 데이터를 나타내는 방법 중 하나
👉 주로, 딕셔너리처럼 key-value의 형태와 중괄호로 이뤄져 있음



💚 Additional

펌웨어(Firmware)

👉 전자기기 등의 기본적인 제어 및 구동을 담당하는 소프트웨어
  👉 새로운 소프트웨어가 등장할 때마다 그에 해당하는 기능을 갖춘 하드웨어를 새로 만들 수도 있지만, 시간적으로 약간 낭비
  👉 따라서, 하드웨어 내부에 추가적인 공간을 만들어 기능을 보강하는 등의 역할을 가진 프로그램을 넣을 수 있게 함
    👉 이를 펌웨어라고 함
👉 ex) BIOS : 컴퓨터의 기본적인 입력과 출력을 담당하는 시스템 (메인보드)


미들웨어(Middleware)

👉 소프트웨어 시스템 내에서 여러 구성 요소 간의 통신과 상호 작용을 관리하는 소프트웨어


JDK 🆚 SDK

👉 JDK
  👉 Java로 소프트웨어를 개발할 수 있도록 여러 가지 기능들을 제공하는 개발 도구 모음
👉 SDK
  👉 특정 플랫폼을 대상으로 소프트웨어를 개발할 수 있도록 여러 가지 기능들을 제공하는 개발 도구 모음


JRE 🆚 JVM

👉 JRE(J Runtime Env)
  👉 JVM 실행 환경을 구현한 것, 프로그램 동작에 필요한 라이브러리 파일들과 기타 파일들을 가지고 있음
👉 JVM
  👉 자바 프로그램을 컴파일 해서 나온 바이트 코드(.class)를 실행시켜주는 가상 머신
  👉 메모리 등의 자원을 할당 및 관리하며 정보를 처리하는 작업을 함


daemon

👉 백그라운드에서 실행하면서 종료되지 않고 지속적으로 무엇인가 처리하는 프로그램
✋ a daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user
✋ the process names of a daemon end with the letter d (ex. syslogd)


컴퓨터 음수의 표현

👉 컴퓨터는 음수를 표현하기 위해서 2의 보수라는 개념을 사용
  👋 ex) -6
  👋 6(2) = 0000 0110
  👋 0000 0110 ➡️ 1111 1001 : 전부 뒤집고
  👋 1111 1001 ➡️ 1111 1010 : +1
  👋 -6(2) = 1111 1010
👉 컴퓨터의 연산기에는 사실 덧셈 기능의 회로만 있음
👉 따라서, 뺄셈 기능으로 덧셈으로 구현


자료형 크기 및 범위

👉 char / 1byte / -2^7 ~ 2^7-1
👉 short / 2byte / -2^15 ~ 2^15-1
👉 int / 4byte / -2^31 ~ 2^31-1
👉 long(C++) / 4byte / -2^31 ~ 2^31-1
👉 long long(C++) / 8byte / -2^63 ~ 2^63-1
👉 long(Kotlin) / 8byte / -2^63 ~ 2^63-1
👋 field : 부호 + 값
👋 Kotlin에는 long long 없음
👉 float / 4byte / 3.4E-38 ~ 3.4E+38
👉 double / 8byte / 1.7E-308 ~ 1.7E+308
👋 field : 부호 + 지수 + 가수


int 🆚 long (C++)

👉 int
  👉 4byte(32bit OS, 64bit OS)
👉 long
  👉 4byte(32bit OS)
  👉 8byte(64bit OS)
  👉 4byte(windows, 64bit OS)
👋 OS bit : Register 크기


float 🆚 double

👉 float
  👉 4byte, 유효자릿수 7자리
👉 double
  👉 8byte, 유효자릿수 16자리
👉 유효자릿수 : 몇 자리까지 오차없이 표현할 수 있는지
👋 Link


부동(浮動) 소수점 개념

👉 실수의 덧셈 및 곱셈 교환법칙 성립
  👋 a + b = b + a
  👋 a * b = b * a
👉 실수의 덧셈 및 곱셉 결합법칙 성립 X
  👋 (a + b) + c ≠ a + (b + c)
  👋 (a * b) * c ≠ a * (b * c)


PNG 🆚 JPG

👉 이미지 파일 형식, 비트맵 방식 이용
  👋 아주 작은 픽셀로 분해하고, 각 화소의 색상과 위치를 기록해 저장
👉 PNG
  👉 비손실 압축방식, 원본이 훼손 되지 X
  ✋ 투명배경이 지원
👉 JPG
  👉 손실 압축방식, 원본이 훼손
  ✋ 복잡한 풍경, 인물사진 저장에 적합
    ✋ 파일 크기가 매우 커질 수 있기 때문에
  👋 JPEG : 사람의 눈에 거슬리지 않을 정도로 원본을 훼손해 압축 효과를 극대화하는 알고리즘
➕ GIF
  👉 압축률을 우선적으로 고려한 그림 파일 형식
  👉 손실 압축 방식, 원본이 훼손


HDD 🆚 SSD

👉 컴퓨터의 정보와 자료 등을 저장하고 읽을 수 있는 장치
👉 HDD(Hard Disk Drive)
  👉 고속으로 디스크를 회전시켜 저장하는 방식
👉 SSD(Solid State Drive)
  👉 메모리 반도체를 기반하여 저장하는 방식
  👉 HDD에 비해 압도적으로 속도가 빠름


ROM 🆚 RAM

👉 ROM(Read Only Memory)
  👉 컴퓨터를 구동하기 위한 기본적인 정보가 담겨있음
  👉 비휘발성 메모리
👉 RAM(Random Access Memory)
  👉 컴퓨터가 빠른 액세스를 하기 위해 데이터를 단기간 저장하는 구성 요소
  👉 휘발성 메모리


프로그램 실행 순서

👉 1. 사용자가 OS에게 프로그램 실행을 요청함
👉 2. OS는 프로그램의 정보를 읽어 메모리(RAM)에 로드함
👉 3. CPU는 프로그램 코드를 가져다 메모리를 관리하고 명령문을 실행
👉 4. 동적메모리나 스택메모리가 할당되면 FreeStore 영역을 사용


CPU 작동 원리

👉 연산장치
  👉 산술연산 및 논리연산 수행
  👉 연산에 필요한 데이터를 레지스터에서 가져오고, 결과를 다시 레지스터로 전송
👉 제어장치
  👉 명령어를 순서대로 실행할 수 있도록 제어
  👉 메인 메모리에서 프로그램 명령어를 꺼내 해독하고, 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력장치로 보냄
👉 레지스터
  👉 고속 기억장치
  👉 CPU 안에서 연산을 처리하기 위한 데이터를 일시적으로 저장하는 공간


CPU 동작 과정

👉 주기억장치는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램 읽어옴
👉 CPU는 프로그램을 실행하기 위해 주기억장치에 저장된 프로그램 명령어와 데이터를 읽어와 처리하고 결과를 다시 주기억장치에 저장
👉 주기억장치는 처리 결과를 보조기억장치에 저장하거나 출력장치로 보냄
👉 제어장치는 1~3과정에서 명령어가 순서대로 실행되도록 각 장치를 제어


CPU 실행시간 계산 관련

👉 프로그램 CPU 실행시간
👉 = CPU 클럭 사이클 수 / 클럭 속도
👋 = CPI * IC / 클럭 속도
👋 = CPU 클럭 사이클 수 * 클럭 사이클 시간
✋ 클럭 사이클 시간 = 1 / 클럭 속도
  👋 ex) 2GHz 컴퓨터 A 10초 수행 프로그램 ➡️ B 6초 수행, A보다 1.2배 많은 클럭 사이클 필요할 때, B 클럭 속도?
  👋 A = 10 = A 클럭 사이클 수 / 2GHz
  👋 20 * 10^9 = A 클럭 사이클 수
  👋 B 클럭 속도 = 1.2 * 20 * 10^9 / 6 = 4 * 10^9 = 4GHz
👋 Kilo, Mega, Giga // 10^3, 10^6, 10^9


Endian

👉 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법
👉 Big Endian
  👉 큰 단위가 앞에 나오는 방법
  👋 0x1234 : 12 34
👉 Little Endian
  👉 작은 단위가 앞에 나오는 방법
  👋 0x1234 : 34 12


CS 계산 문제 관련

👋 Link
👋 Link


여러 가지 웹 해킹기법

👋 Link



*****
NOT A TALENT ❎ NOT GIVING UP ✅
CopyRight ⓒ 2022 DCherish All Rights Reserved.