주간 학습 공유
강의 및 실습
Simple Todo List 앱 만들기
- 기본 컴포넌트 작성 및 추상화 개념 이해하기
- TodoList, TodoForm, Header, App
- 모듈화
- Promise, async & await, fetch의 비동기 이해하기
추상화
“복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것” - 위키
결국, 추상화란 기술적 복잡함, 구체적인 구현은 뒤로 감추고 단순한 인터페이스를 앞으로 내세우는 것을 말합니다.
- 관점 - 관심 있는 것을 중심으로 바라보는 것
- 사소한 것을 쳐내고, 핵심적인 기능을 뽑아내는 것
핵심적인 기능을 뽑아내서 단순한 인터페이스로 제공하는 것.
추상화의 가장 기초적인 예시는 함수라고 할 수 있습니다.
사용자가
ImplementAbstraction
객체에서 제공하는 set(), display()를 사용할 때는, 그 내부에 어떻게 구현되어 있는 지는 관심이 없습니다. 기대하는 기능만 잘 작동하면 굿!class ImplementAbstraction { // method to set values of internal members set(x, y) { this.a = x; this.b = y; } display() { console.log('a = ' + this.a); console.log('b = ' + this.b); } } const obj = new ImplementAbstraction(); obj.set(10, 20); obj.display();
추상화를 잘 사용하면…
- 코드의 중복을 막고, 재사용성, 가독성을 높인다.
- 사용자에게 영향을 미치지 않고, 내부 구조를 수정할 수 있다.
- 추상화가 잘 되어 있으면, 각각이 독립되어 있기 때문에 다양한 응용이 가능하다.
스택, 큐, 맵, 우선순위 큐 같은 것들도 추상적 자료구조라고 할 수 있습니다.
엄밀히 말하자면, 구체적인 concept, idea를 구상하고 정의하는 것을 우선으로 필요한 자료의 형태 및 연산을 수학적인 개념 단계에 있는 자료형을 추상적 자료구조라고 합니다. 추상적 자료형이 정의한 연산들을 구현한 구현체들을 비로소 자료구조라고 부릅니다.
추상적 자료형 단계의 예) 스택은 삽입한 순서대로 값들이 쌓이는 형태야. 스택의 제일 위에 값을 넣는 push연산과 반대로 값을 빼는 pop연산이 있어 스택이 비어있는 지 알아보는 empty연산이 있고 스택에 쌓인 값이 몇 개인지 알아보는 size 연산이 있어
위 예에서는 스택이 배열로 구현되어 있는지, 연결리스트로 구현 되어 있는 지는 다루지 않습니다. 마찬가지로 각각의 연산들이 어떤 방식으로 구현 되어 있는 지도 관심을 두지 않습니다.
다만, 경우에 따라 각각의 연산의 시간복잡도까지 포함될 수 있다.
자바스크립트 코딩의 기술
Part4. 조건문 - 거짓값이 있는 조건문을 축약하라
자바스크립트에서 거짓을 의미하는 다양한 값이 있습니다.
- false
- null
- 0
- NaN
- ‘’ (or “”)
조건문을 쓸 때는, 의도와 다르게 거짓 값을 만들어내는 것은 없는 지 주의해야 합니다.
['a', 'b'].indexOf('a') // 0 == false ['a', 'b'].indexOf('t') // -1 == true
위 경우에는
Array.includes()
로 대체해서 쓸 수 있습니다.Array.includes()
: 값이 있는 경우true
, 값이 없는 경우false
반환
객체의 키-값 데이터를 조건문에 사용할 때도 주의할 점이 있습니다.
const employee = { name: 'Eric', equipmentTraining: true, } function listCerts(employee) { if (employee.equipmentTraining) { employee.certificates = "Equipment"; delete employee.equipmentTraning; //조작 } } function checkAuthorization(employee) { if (!employee.equipmentTraining) { return 'No Authorization'; } return 'Has Authorization'; } listCerts(employee); checkAuthorization(employee);
listCert()
에서는 근무자가 직업 교육을 받았을 경우, 수료했다는 표시를 한 다음 equipmentTraning
필드를 지우는 조작을 하고 있습니다.이 후에,
checkAuthorization()
이 호출될 때, 해당 인자의 equipmentTraining
은 존재하지 않는 키값으로 undefined
를 반환하게 됩니다. 해당 근무자는 수료했음에도 불구하고, 권한이 없다는 판단을 받게 되었습니다.위 경우에는, 다음의 2가지 해결 방안을 생각해 볼 수 있습니다.
delete employee.equipmentTraining
과 같이 함수 내에서 데이터를 조작하지 않습니다.
- 데이터 조작이 불가피하다면, 엄격한 일치를 사용합니다.
if (employee.equipmentTraining !== true) {...}
Short Circuiting
||
로 작성하는 OR 연산자는 두 개의 비교 값 중 하나라도 참이라며 true를 반환합니다. 다시 정의하면, 둘 중 어느 값이라도 true라면 다른 값은 확인할 필요가 없다는 의미가 됩니다.반대로
&&
로 작성하는 AND 연산자는 두 개의 비교 값 중 하나라도 false이면 다른 값을 확인할 필요가 없습니다.//foo1() - 1초 //foo2() - 100초 //방법 1 if (foo1() || foo2()) { console.log('yes'); } //방법 2 if (foo2() || foo1()) { console.log('yes'); }
위와 같이 boolean 값을 반환하는 두 개의 함수
foo1()
, foo2()
가 있다고 가정합시다. foo1()
의 경우, 전체 연산이 1초가 걸리고 foo2()
는 100초가 걸립니다.JS의 경우 단락 평가(Short Circuit Evaluation)을 지원하기 때문에 방법 1의 경우
foo1()
이 참이라면 조건문의 전체 연산은 1초 만에 종료될 수 있습니다.방법 2로 작성했을 경우,
foo2()
가 참이 될 때 최소 100초의 시간이 걸릴 것을 예상할 수 있습니다.따라서, 다음과 같이 조건문을 작성할 때는 비용이 높은 코드를 가능한 한 나중에 평가되도록 작성하는 것이 좋습니다.