👉 동기 방식
👉 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식
👋 설계가 매우 간단하고 직관적
👋 여러가지 요청을 동시에 처리할 수 없어 효율이 떨어짐
👋 호출한 함수가 호출되는 함수의 작업의 완료 후의 return을 기다리거나 return을 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경씀
👉 비동기 방식
👉 요청을 보낸 후 응답과 상관없이 다음 동작이 이루어지는 방식
👋 여러가지 요청을 동시에 처리할 수 있어 자원을 효율적으로 사용할 수 있음
👋 동기 방식에 비해 설계가 복잡함
👋 호출되는 함수에게 callBack을 전달해서 작업이 완료되면 전달받은 callBack을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 X
👉 Blocking
👉 자신의 작업을 모두 마칠 때까지 제어권을 넘겨주지 않고 대기하게 만드는 방식
👉 Non-Blocking
👉 호출된 즉시 바로 return하여 호출한 함수에게 제어권을 넘겨주고 호출한 함수가 다른 일을 할 수 있는 기회를 주는 방식
👉 관심사에 차이가 있음
👉 동기 & 비동기
👉 호출한 함수가 호출되는 함수의 작업 완료 여부를 신경쓰는지에 관심
👉 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을 사용하는 프로젝트를 위한 호스팅 플랫폼 서비스
👋 repository : 프로젝트 저장소
👋 add : 커밋에 변경 사항을 추가
👋 push : 원격 저장소로 커밋을 전송
👋 pull : 원격 저장소의 변경 내용 가져오기
👋 commit : 프로젝트의 현재 상태를 나타내는 체크포인트, 커밋을 생성
👋 clone : 원격 저장소의 프로젝트를 로컬 저장소로 내려 받기
👋 branch : 독립적인 작업을 위해 새로운 버전을 생성하는 것
👉 수정한 코드가 있으니, branch를 가져가 검토 후 merge해 줄 것을 요청하는 것
👉 코드 충돌 최소화, push 권한이 없는 오픈 소스 프로젝트에 적합
👉 fork, clone, branch, add/commit/push, PR, merge PR, 데이터 동기화 및 branch 삭제
👉 개발함에 있어 테스트를 많이 고려하는 프로그램 개발 방법
👉 쉽게 말해, 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 방법론
👉 개발 사이클 3단계
👉 Red 단계에서는 실패하는 테스트 코드를 먼저 작성
👉 Green 단계에서는 성공하기 위해 코드를 수정
👉 Blue 단계에서는 중복 코드를 제거하는 등의 리팩토링을 수행
👉 코드의 안정성(모듈화)이 높아지며, 재설계(설계 변경) 시간이 단축된다는 장점이 있음
👉 일반적인 개발 방식보다 개발 시간이 늘어나기에 생산성이 저하된다는 단점이 있음
👉 애플리케이션 개발 단계부터 배포 단계까지 모든 단계를 자동화를 통해서 고객들에게 좀 더 빠르고 효율적으로 제공하기 위한 방법
👉 CI(Continuous Integration, 지속적 통합)
👉 빌드 및 테스트 자동화
👋 코드에 대한 통합을 지속적으로 진행함으로써 품질을 유지하자는 개념
👉 CD(Continuous Deployment, 지속적 배포)
👉 배포 자동화
👋 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 지속적으로 관리하자는 개념
👋 Jenkins, Bitrise, etc
👉 응용 프로그램에서 실행 및 테스트 가능한 가장 작은 소프트웨어를 실행하여 문제없이 의도한대로 잘 동작하는지 확인하는 테스트
👉 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법
👉 변화하는 요구사항에 신속하고 민첩하게 대응하며 소프트웨어 개발을 진행하기 위한 방법론
👉 계획에 의존하며 형식적인 절차를 따라야 하는 고전적인 방법인, Waterfall의 단점을 보완하기 위함
👉 가장 큰 단점 : 시간의 낭비
👉 기능을 축소하고 주기를 짧게 하여, 빠르게 한 주기 돌린 후 중간 피드백을 많이 가지는 방식
👋 대표적인 애자일 프레임워크 : 스크럼, 칸반 등
👉 스크럼
👉 애자일을 이상적으로 실행할 수 있게 하는 애자일 프레임워크의 한 유형
👉 제품 출시 기간을 단축하기 위한 애자일 방법론의 활동
👉 팀에서 개발자는 보통 1-4주 단위의 스프린트로 작업을 진행함
👉 스프린트 : 과제가 진행되는 짧은 하나의 주기
👉 칸반
👉 애자일을 이상적으로 실행할 수 있게 하는 애자일 프레임워크의 한 유형
👉 시각적 워크플로우를 통해 팀의 진행 상황을 보여줌
👋 백로그
👉 프로젝트 수행에 필요한, 즉 해야할 일들의 목록
👉 자주 사용하는 코드를 함수로 가공하여 정리해 놓은 것을 재사용할 수 있게끔 해놓은 일종의 코드 모음집
👉 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합
👉 쉽게 말해, 특정 프로그램을 만들기 위해 여러 기능을 제공함
👉 Framework : 전체적인 흐름을 자체적으로 제어함
👉 Library : 사용자가 직접 흐름에 대한 제어를 함
👉 URL(Uniform Resource Locator)
👉 인터넷에 있는 자원을 나타내는 유일한 주소
👉 URI(Uniform Resource Identifier)
👉 네트워크 상에서 자원 위치를 알려주기 위한 규약
✋ URI가 URL의 상위 개념
👉 에러
👉 시스템에 미리 예측할 수 없던 비정상적인 상황이 생겼을 때 발생
👉 예외
👉 미리 예측하여 프로그램의 코드로 처리할 수 있는 예외적인 상황
👉 두 개의 컴퓨터 프로그램 사이에 이루어지는 역할 관계를 나타내는 용어
👉 Client
👉 다른 프로그램에게 서비스를 요청하는 프로그램
👉 Server
👉 요청을 처리하여 응답을 해주는 프로그램
👉 Parameter
👉 함수를 정의할 때 나열되는 변수 명
✋ void solution(int a, int b)
👉 Argument
👉 함수 호출 시 함수의 파라미터로 전달된 실제 값
✋ solution(7, 9) // 7, 9 ; argument
👉 하나의 프로그램에서 다른 프로그램으로 데이터를 주고 받는 방법
👉 손님과 식당이 있다면 메뉴판 혹은 키오스크가 API
👉 둘 이상의 CPU or 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것
👉 클라이언트와 서버 사이에 Load Balancer를 두어 부하가 일어나지 않도록 함
✋ Round Robin, Least Connection Method, IP Hash, etc
✋ 서로 다른 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
👉 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을 덧붙임
👉 정밀하지는 않지만, 어느 정도 에러 탐지 가능
👉 컴퓨터 프로그램이 더이상 필요하지 않은 메모리를 계속해서 점유하고 있는 현상
👉 여전히 해제된 메모리 영역을 가리키고 있는 포인터
👉 Garbage를 청소해주는 JVM 실행 엔진의 한 요소
👉 Garbage Collector가 메모리를 정리하는 과정을 Garbage Collection
👋 Garbage : 더 이상 참조되지 않는 메모리
👋 Link
👋 Link2
👉 간결하고 쉽게 데이터를 나타내는 방법 중 하나
👉 주로, 딕셔너리처럼 key-value의 형태와 중괄호로 이뤄져 있음
👉 전자기기 등의 기본적인 제어 및 구동을 담당하는 소프트웨어
👉 새로운 소프트웨어가 등장할 때마다 그에 해당하는 기능을 갖춘 하드웨어를 새로 만들 수도 있지만, 시간적으로 약간 낭비
👉 따라서, 하드웨어 내부에 추가적인 공간을 만들어 기능을 보강하는 등의 역할을 가진 프로그램을 넣을 수 있게 함
👉 이를 펌웨어라고 함
👉 ex) BIOS : 컴퓨터의 기본적인 입력과 출력을 담당하는 시스템 (메인보드)
👉 소프트웨어 시스템 내에서 여러 구성 요소 간의 통신과 상호 작용을 관리하는 소프트웨어
👉 JDK
👉 Java로 소프트웨어를 개발할 수 있도록 여러 가지 기능들을 제공하는 개발 도구 모음
👉 SDK
👉 특정 플랫폼을 대상으로 소프트웨어를 개발할 수 있도록 여러 가지 기능들을 제공하는 개발 도구 모음
👉 JRE(J Runtime Env)
👉 JVM 실행 환경을 구현한 것, 프로그램 동작에 필요한 라이브러리 파일들과 기타 파일들을 가지고 있음
👉 JVM
👉 자바 프로그램을 컴파일 해서 나온 바이트 코드(.class)를 실행시켜주는 가상 머신
👉 메모리 등의 자원을 할당 및 관리하며 정보를 처리하는 작업을 함
👉 백그라운드에서 실행하면서 종료되지 않고 지속적으로 무엇인가 처리하는 프로그램
✋ 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
👉 4byte(32bit OS, 64bit OS)
👉 long
👉 4byte(32bit OS)
👉 8byte(64bit OS)
👉 4byte(windows, 64bit OS)
👋 OS bit : Register 크기
👉 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
👉 비손실 압축방식, 원본이 훼손 되지 X
✋ 투명배경이 지원
👉 JPG
👉 손실 압축방식, 원본이 훼손
✋ 복잡한 풍경, 인물사진 저장에 적합
✋ 파일 크기가 매우 커질 수 있기 때문에
👋 JPEG : 사람의 눈에 거슬리지 않을 정도로 원본을 훼손해 압축 효과를 극대화하는 알고리즘
➕ GIF
👉 압축률을 우선적으로 고려한 그림 파일 형식
👉 손실 압축 방식, 원본이 훼손
👉 컴퓨터의 정보와 자료 등을 저장하고 읽을 수 있는 장치
👉 HDD(Hard Disk Drive)
👉 고속으로 디스크를 회전시켜 저장하는 방식
👉 SSD(Solid State Drive)
👉 메모리 반도체를 기반하여 저장하는 방식
👉 HDD에 비해 압도적으로 속도가 빠름
👉 ROM(Read Only Memory)
👉 컴퓨터를 구동하기 위한 기본적인 정보가 담겨있음
👉 비휘발성 메모리
👉 RAM(Random Access Memory)
👉 컴퓨터가 빠른 액세스를 하기 위해 데이터를 단기간 저장하는 구성 요소
👉 휘발성 메모리
👉 1. 사용자가 OS에게 프로그램 실행을 요청함
👉 2. OS는 프로그램의 정보를 읽어 메모리(RAM)에 로드함
👉 3. CPU는 프로그램 코드를 가져다 메모리를 관리하고 명령문을 실행
👉 4. 동적메모리나 스택메모리가 할당되면 FreeStore 영역을 사용
👉 연산장치
👉 산술연산 및 논리연산 수행
👉 연산에 필요한 데이터를 레지스터에서 가져오고, 결과를 다시 레지스터로 전송
👉 제어장치
👉 명령어를 순서대로 실행할 수 있도록 제어
👉 메인 메모리에서 프로그램 명령어를 꺼내 해독하고, 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력장치로 보냄
👉 레지스터
👉 고속 기억장치
👉 CPU 안에서 연산을 처리하기 위한 데이터를 일시적으로 저장하는 공간
👉 주기억장치는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램 읽어옴
👉 CPU는 프로그램을 실행하기 위해 주기억장치에 저장된 프로그램 명령어와 데이터를 읽어와 처리하고 결과를 다시 주기억장치에 저장
👉 주기억장치는 처리 결과를 보조기억장치에 저장하거나 출력장치로 보냄
👉 제어장치는 1~3과정에서 명령어가 순서대로 실행되도록 각 장치를 제어
👉 프로그램 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
👉 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법
👉 Big Endian
👉 큰 단위가 앞에 나오는 방법
👋 0x1234 : 12 34
👉 Little Endian
👉 작은 단위가 앞에 나오는 방법
👋 0x1234 : 34 12
👋 Link