닿을 수 없는 주소를 더 이상 필요없는 주소로 정의하고 지우는 알고리즘
객체가 생성되면 비트를 0(false)로 표시한다.
마크 페이즈에서는 모든 도달 가능한 객체. 또는 사용자가 참조할수 있는 객체에 1(true)가 찍힙니다.
이제 이 동작을 수행하려면 그래프 탐색(graph traversal)을 할 필요가 있다. 그리고 그 방법으로 깊이우선 탐색기법(depth first search approach)을 사용한다.
여기에선 모든 객체를 노드처럼 취급하고, 더이상 들를 곳이 없을때까지 노드에서 접근할 수 있는 모든 노드들을 방문합니다.
루트는 객체를 참조하는 변수이며, 지역변수가 곧장 접근할 수 있다.
일단 루트가 하나만 있다고 간주한다.
markedBit(obj)의 호출로 객체의 mark bit에 접근할 수 있다.
만약 루트가 하나 이상이라면 그냥 모든 루트에다 Mark를 호출하면 된다.
"sweep(쓸어버린다)"라고 이름을 붙였듯이, 이건 힙 메모리에 있는 모든 도달 불가능한 객체를 치워버린다.
marked 값이 false로 설정된 모든 객체는 정리되고, true인 객체는 유지한다.
이제 도달가능한 객체의 mark값을 false로 설정해서 다시 마크 페이즈로 넘어가 모든 도달가능한 객체에 마크를 하도록 해야한다.
마크앤스윕 알고리즘은 프로그램에서 직간접적으로 접근할 수있는 모든 객체를 추적하기 때문에 추적(tracing) 가비지 컬렉터라고도 부른다.
객체에 속성이 있는지 확인하기 위한 연산자
const x = { name: "Kim Tae-Wan" email: "ktw9115@naver.com" } "name" in x; // true
false, undefined, null, 0, NaN, ""(empty string)
do - while
let x = 0; do { console.log("Fire"); } while (x > 10);
하드웨어의 시스템 클럭을 이용하여 특정 시각(Epoch)을 기준으로 클럭의 틱을 세는 것으로 구현된다.
이를 시스템 시간으로 부르고, 값으로 표현한 것을 타임스탬프(Timestamp)라고 부른다. 타임스탬프는 운영체제마다 기준 시간과 단위가 다를 수 있다.
유닉스 계열 운영체제에서 시간을 표시하는 방법을 Unix Time라고 부른다.
시스템 클럭의 원리
Rtc(Real Time Clock)라는 모듈이 메인보드에 붙어있어, 전원을 끄더라도 계속 작동한다. 카운터회로를 통해 클럭을 발생시키는데, 핵심부품인 결정 진동자가 만드는 주파수를 이용한다. 1클럭에 1초를 계산하기 쉬운 주파수인 32.768kHz가 발생한다.
결정 진동자에대한 자세한 내용
UTC(세계 협정 시)
원자 시계와 윤초 보정을 기반으로 표준화한 시각이며, 모든 시간을 UTC+0 기준으로 환산한다. T는 Time을 의미하고, Z는 Zulu Time을 뜻한다.
경도 0(Zero)의 앞글자 z를 나타내고 z는 무선 통신 용어로 Zulu라고 표현된다.
2021-03-20T09:00:00Z // UTC+0기준 2021년 3월 20일 9시 2021-03-20T09:00:00+09:00 // UTC+9(한국시간) 기준 2021년 3월 20일 9시
Unix Time
1970년 1월 1일 0시 0분 0초가 기준 시각이며, 이전 시간은 음수로 표현된다. 초 단위로 시간이 증가하는 특징이 있다.
시스템 시간을 네트워크 타임 프로토콜(NTP)를 통해 동기화 할 수 있고, NTP서버에 네트워크 요청을 하여 현재 시간을 받을 수 있다.
NTP서버는 계층으로 이루어져 있으며, 그 계층을 Stratum이라 부르고 최상위 계층은 PRC(Primary Reference Clock)라고 부른다.
Time zone 데이터를 활용하여 시간을 고려할 수 있다. 현실 세계에서 일광 시간 절약제나 어떠한 이벤트로 시간이 바뀌면 해당 데이터베이스에 저장이 된다.
표기법은 Asia/Seoul, America/New_York와 같이 대륙/도시 형태를 따르고 이 값을 Zoneid라고 부른다.
글로벌 서비스를 운영할 때 시간을 매우 중요한데, 사용되는 시간을 용도에 맞춰서 기록할 필요가 있다.
주식과 같은 시계열 데이터
결제 시각, 푸시 알림시간, UI 시각 표시, 캘린더
'userId': 1, 'name': '김태완', 'zoneId': '1991-01-05' // 순수한 시간 'creatAt': '2023-10-08T04:59:25Z' // 기준 시간 UTC 'updateAt': '2023-10-08T05:12:38Z' 'posts': [ { 'postId': 1, 'publishedAt': '2023-10-08T06:00:00Z', // 기준 시간 오전 6시에 발행 //publishedAt은 user의 zoneId에 따라 다르게 보일 수 있다. ]
평문(Plaintext)을 해독할 수 없는 암호문(Ciphertext)로 변환하는 것을 의미한다. 단방향(해싱)과 양방향 암호화가 존재한다.
복호화가 불가능하지만 Rainbow Table을 통해 원문을 알아낼 수도 있다.
Rainbow Table은 평문과 해시 함수로 만든 문자열을 모두 저장시켜 놓은 표를 말한다.
따라서 불의의 사고로 암호화된 데이터를 탈취당하더라도 원문을 알아 낼 수 없도록 조치를 해야한다.
Salt, Key stretching를 이용하여 해결할 수 있다.
8129387198asjldasljdaoislf + redfl0wer => DIGEST
직접 구현하는 것보다 이미 검증받은 알고리즘을 사용하는 것이 안전하다.
$2a$10$N9qo8uLOickgx2ZMRZoMyeljZAgcfl7p92ldGxad68LJZdL17lhWy
$2a
Alg, $10
Cost$N9qo8uLOickgx2ZMRZoMyelj
SaltZAgcfl7p92ldGxad68LJZdL17lhWy
Hash평문을 복화하 할 수 있는 형태로 암호화하는 방법이다.
대칭키와 비대칭키 알고리즘으로 나뉜다.
대표적으로 대칭키를 이용하는 AES와 비대칭키를 이용하는 RSA로 나뉜다.
다수를 대상으로 하는 방법으로 비대칭키가 쓰인다.
프로그램은 순차, 분기, 반복, 참조로 구성된다.
패러다임은 위 4가지 요소를 어떻게 이용할 것인가를 다룬다.
객체지향 추상화의 최소 단위가 객체이고, 객체는 현실에 있는 것을 추상화한 것이다. 객체 위주로 설계하고 프로그래밍하는 패러다임으로 각각의 객체는 메시지를 주고받을 수 있다.
function StringNumber(string) { this.string = string; } StringNumber.prototype.calculate = function () { const stringNumber = "12345"; this.sum = 0; for (let i = 0; i < sringNumber.length; i += 1) { this.sum += stringNumber[i] - "0"; } }; const stringNumver = new StringNumber("12345"); const printer = new Printer(); stringNumber.calculate(); printer.log(stringNumber.sum);
function Person(name) { this.name = name; } Person.prototype.getName = function () { return this.name || "선협"; }; function Korean(name) {} Korean.prototype = new Person(); const lee = new Person("이선협"); const kim = new Korean("김선협"); console.log(lee.getName()); // 이선협 console.log(kim.getName()); // 선협
function Person(name) { this.name = name; } Person.prototype.getName = function () { return this.name || "선협"; } function Korean(name) { Person.apply(this, arguments); } Korean.prototype = new Person(); Korean.prototype.setName = function (name) { this.name = name; }; const lee = new Person("이선협"); const kim = new Korean("김선협"); console.log(lee.getName()); // 이선협 console.log(kim.getName()); // 김선협 kim.setName("박선협"); console.log(kim.getName()); // 박선협
const lee = { name: "이선협" getName: function () { return this.name; } }; const kim = Object.create(lee); kim.name = "김선협"; console.log(lee.getName()); // 이선협 console.log(kim.getName()); // 김선협 console.log(lee.__proto__); // {} console.log(kim.__proto__); // { name: '이선협', getName: [Function: getName]}
함수형은 함수가 최소 단위이고,함수 단위로 나눠지므로 재사용성이 높다.
불변성을 지향하기에 동작을 예측하기 쉽고 사이드 이펙트를 방지한다.
사이드 이펙트를 방지한다는 것은 동시성 문제도 해결된다는 의미
함수형은 변수 할당에 부과되는 규율
const stringNumber = "12345"; console.log( stringNumber .split('') .map(x => parseInt(x)) .reduce((x,y) => x + y, 0); );