블로그 플랫폼을 벨로그로 옮길까 하다가, 티스토리가 복구되어 다시 써보려고 한다.
지금까지 작성한 글들이 이 곳에 있다보니 옮기기가 쉽지 않았다...!
🐈오늘 배운 것
✔️기술면접 준비
오늘 준비 시간이 살짝 촉박하고 질문이 많아서 주어진 시간안에 모든 질문을 다 준비할 수는 없었다.
전체 내용을 블로그에 정리하는 것은 내용이 너무 길어질 것 같고...
오늘 좀 몰랐던 부분에 대해서만 간략히 정리하려고 한다.
먼저 Node.js 는 일정 부분 멀티 스레딩을 지원한다. 자바스크립트가 싱글스레드 언어이기 때문에 node 도 당연히 싱글 스레드일 것이라고 생각했는데, 일정 부분은 맞지만 libuv 라는 노드 라이브러리가 멀티스레드를 지원하고 이 라이브러리를 통해 비동기 작업을 처리한다고 한다. node 에서도 그냥 웹 api 처럼 비동기를 지원해주는 api가 있겠거니 하고 넘겨짚었었는데, 같이 세션을 진행해주셨던 한 분의 의문제기로 이 내용에 대해서 짚고 넘어갈 수 있었다.
그리고 클래스형 컴포넌트와 함수형 컴포넌트의 차이에서... 클래스형 컴포넌트에서는 라이프 사이클 메서드를 사용해 컴포넌트의 생명 주기를 관리한다. 함수형 컴포넌트에서 훅을 사용해 직관적으로 조작할 수 있는 부분을 메서드로 조금 복잡하게 작성해야 하는 것 같다. 지금 당장 알아야 하는 내용은 아닌 것 같지만 실무에서 레거시로 만날 수도 있기 때문에 언젠간 짚고 넘어가야 할 것 같다.
그리고 오늘 반응형 웹에 대한 질문이 있었는데, 생각보다 간단한 질문임에도 제대로 생각나지 않아 답변을 할 수 없었다 ㅜ. 반응형 웹이라는 것은 다양한 디바이스 환경에 맞춰서 제작되는 웹을 의미하고, 화면의 크기나 해상도와 관계 없이 사용할 수 있다는 장점이 있다. 다만 컨텐츠가 너무 많을 시에는 성능상에 영향을 줄 수도 있다고 한다.
✔️함수형 프로그래밍
인프런 ES6 함수형 프로그래밍 강의로 공부하는 중이다. 스터디를 시작했는데 이번주 분량이 꽤 많아서 후다닥 봐야한다.
오늘 공부한 내용인데 이렇게라도 정리하지 않으면 또 휘발될까봐 정리해보았는데...
이렇게 코드를 보면 어떤 내용인지 느낌이 오는데 막상 이터레이터와 제너레이터에 대해서 설명하라고 하면 명확하게 설명하기가 좀 힘들다. 이런 내용을 배워서 함수형 프로그래밍에 어떻게 적용한다는 것인지 감이 안와서 그런것일지도 모른다.
그래도 오랜만에 자바스크립트로 돌아가서 반갑고 기분은 좋다.
이터러블과 이터레이터 프로토콜
ES6에서 for...of 문은 이터러블을 순회할 수 있는 반복문이다. 이터러블이란 반복 가능한 객체로, 이터레이터라는 값을 활용해 생성되는 value 라는 값으로 이터러블을 반복할 수 있다. ES6에서 이터러블로는 일단 배열, Sets, Maps 같은 것들이 있다.
// set(이터러블)
const set = new Set([1, 2, 3]);
// set의 이터레이터
cosnt iterator = set[Symbol.iterator]();
console.log(iterator.next()) // { value: 1, done: false }
for...of 문을 사용해서 배열, set, map 같은 이터러블을 돌 수 있는 이유는 기존처럼 key, value 로 접근하는게 아니라 이 이터레이터의 next 메서드가 반환하는 객체의 value 값을 반복하여 출력하기 때문이다.
이러한 방식을 이터러블/이터레이터 프로토콜 이라고 하며, for...of 반복문은 이터러블 프로토콜을 따르고 있다고 표현할 수 있다.
참고로 for...of 로 반복을 할 수 없는 객체는 이렇게 조회해도 이터레이터를 찾을 수 없다.
console.log({hi: true, hello: false}[Symbol.iterator]); // undefined
사용자 정의 이터러블
이터레이터를 만들 수 있으면 배열이나 맵같은 이터러블 객체가 없어도 이터러블을 만들 수 있다.
// 이터러블에서 [Symbol.iterator] 키로 이터레이터에 접근할 수 있었기 때문에
// 직접 그 속성을 정의해본다.
const iterable = {
// 대괄호를 사용하는 이유 : symbol이라서.
[Symbol.iterator]() {
let i = 3;
return {
// 이터레이터는 next 메서드를 가지고 value를 순회(?)한다.
next() {
return i === 0 ? {done: true} : {value: i--, done: false};
},
// 이터레이터가 자신의 이터레이터로써 자기 자신을 리턴해야함. 그래야 완벽한 이터레이터이다.
[Symbol.iterator]() {
return this;
},
};
},
};
// 위에서 정의된 이터러블에 직접 정의한 키를 실행하면 이터레이터를 생성할 수 있다.
let iterator = iterable[Symbol.iterator]();
// 이터러블,이터레이터 프로토콜에 의해 이터레이터로도 순회가 가능해진다.
for (const a of iterator) console.log(a); // 3,2,1
제너레이터
제너레이터는 이터레이터이자 이터러블을 생성하는 함수이다.
// 제너레이터 함수는 앞에 * 표시를 붙여준다.
function* generator() {
// 몇 번의 next로 value를 꺼내줄지 결정한다.
yield 1;
// 순회할 값을 나열하여 정의하는 것이라 아래와 같이 정의할 수도 있다.
if (false) yield 2;
yield 3;
// next가 실행되고 마지막에 done이 true가 되면 리턴되는 값이다. 순회할 때 이 값은 출력되지 않는다.
return 100;
}
// generator 함수의 리턴값은 이터레이터
const iterator = generator();
// 따라서 이터레이터의 next 메서드를 실행할 수 있다.
console.log(iterator.next()); // { value: 1, done: false }
// generator는 well-formed 이터레이터를 리턴한다.
// 이터레이터의 Symbol.iterator 의 리턴값이 자기자신!
console.log(iterator[Symbol.iterator]() === iterator); // true
// generator의 실행 결과값이 이터레이터이자 이터러블이므로, 아래와 같이 for..of 문으로 순회할 수 있다.
for (const a of generator()) console.log(a);
✔️타입스크립트
캐럿마켓 클론코딩을 수강하면서 타입스크립트 부분은 제대로 알지 못해 복습을 하지 못했다. 보다 보니 잘 알고 적용하면 너무 좋을 것 같아서 공부를 시작했다.
void 타입
함수에만 있는 타입인데, 해당 함수가 아무것도 리턴하지 않는다는 것을 의미한다.
// 보통 void 타입을 별도로 지정할 필요는 없다.
function hello() :void {
console.log('hi');
}
Call Signatures
함수의 인자 타입과 반환 타입을 미리 정의하는 것이다.
// 먼저 함수의 타입 구조를 정의하고
type Add = (a:number, b:number) => number;
// 그 타입을 함수에 적용할 수 있다.
const add:Add = (a, b) => a + b;
Overloading
함수가 여러개의 콜 시그니쳐를 가졌을 때 오버로딩이 발생한다.
// 아래와 같이 여러개의 콜 시그니쳐를 가지는 타입이 있을 때
type Add = {
(a:number, b:number) : number
(a:number, b:string) : number
}
// 이런 함수를 오버로딩 함수라고 한다.
const add : Add = (a,b) => {
if(typeof b === 'string') return a
return a + b
}
실제 이런 식으로 타입을 정의해서 사용하는 일은 별로 없겠지만, 라이브러리에서 많이 사용되는 방식이라서 알아두면 좋다.
🐈feedback
1. 평일에는 알고리즘과 개념 공부에 집중하고, 주말에는 사이드 프로젝트로 구현하는 연습을 하려고 한다. 해야할 일의 흐름이 쭉 이어지는 느낌이라 조금 더 수월하게 진행할 수 있는 것 같다.
2. 집중을 너무 못한다. 집에 들어오면 밥먹고 좀 쉬는데, 차라리 오후에 카페를 가지 말고 저녁 시간에 가는게 훨씬 나은 것 같다.
🐈오늘의 느낀 점
내일이면 대망의 pre 프로젝트가 시작되는 날이다. 한 가지에 몰두하면 너무 몰입해서 힘들어지는 때가 종종 있는데, 그런 어려움을 알기 때문에 이번에는 컨디션을 잘 조절하면서 진행할 수 있을 것 같다. 내일 아이스브레이킹이 힘들까봐 받아둔 자료를 가지고 진행을 해볼까 하는데 ㅎ^ㅎ~ 백엔드 분들은 어떤 분들일지 아쥬아쥬 기대가 된다. 왠지 즐겁게 잘 할 수 있을 것 같은 기대가... ㅎㅎ 아직 뭘 할지 정해진 것은 없지만...
잘 안되더라도 지치지 말고 루틴! 루틴을 꼭 기억하자!
'TIL' 카테고리의 다른 글
[TIL] 2022-1111 : UI 프로토타입 작업 / 타입스크립트 공부 (1) | 2022.11.12 |
---|---|
[TIL] 2022-1020 : pre-project DAY-0 (0) | 2022.10.21 |
[TIL] 2022-1013 (0) | 2022.10.13 |
[TIL] 2022-1012 (0) | 2022.10.12 |
[TIL] 2022-1011 (0) | 2022.10.12 |