부트캠프 18일차가 된 날이다. 오늘은 JS/Node
의 핵심개념들과 문법들에 대해서 공부를 했다. 전에는 가볍게 알아보는 수준이었다면, 오늘은 조금 더 깊이 파고들어 학습을 하는 시간을 가졌다. 오늘 배운 개념들을 복습할 겸 정리를 시작해보겠다.
일단 고정된 저장 공간을 차지하는 데이터는 모두 원시 타입(primitive) 데이터라고 생각하자!
javascript
에서 원시 타입의 데이터는 객체가 아니면서 메소드를 가지지 않는 6가지 타입을 말한다.string
, number
, bigint
, boolean
, undefined
, symbol
이 있는데 여기에는 null
도 끼워줄 수도 있겠다. 저 6가지는 typeof
를 통해 검사하면 저대로 출력이 되나 null
은 object
로 출력이 된다. 하지만 동작은 원시타입과 비슷하기 때문에 끼워줄 수도 있다.모두 하나의 정보(데이터)를 담고 있다. 즉, 변수에는 하나의 데이터만 보관이 가능하다.
원시 자료형이 보관함인 변수에는 하나의 원시자료형만 들어갈 수 있다. 이는 참조자료형과 구분되는 특징히다.
JS
에서 원시 자료형이 아닌 것은 모두 참조 자료형이다.
'범위'의 의미를 가지고 있다. 더 자세하게 말하면 변수의 유효 범위라고 알면 된다.
변수에는 접근할 수 있는 범위가 존재한다.
여기에서는 중괄호(블록) 안에 선언됐는가, 바깥쪽에서 선언됐는가가 중요하다. 이 범위를 스코프라고 한다.
스코프의 정의와 규칙
같은 함수여도, 화살표 함수 를 사용하면 블록 스코프로 취급된다. function키워드를 사용하면 함수 스코프이다. 이것이 화살표 함수와 일반 함수의 가장 큰 차이점이다.
let키워드는 for문 안의 변수를 바깥에서 사용하면 ReferenceError가 발생한다.
var키워드는 for문 안의 변수를 바깥에서 사용하면 에러가 발생하지 않는다.
var 키워드는 block scope를 무시하고, function scope만 따른다!
변수를 정의하는 또 다른 키워드가 var이다
var 키워드보다 let 키워드가 더 안전한 이유
'use strict';
를 기재하면 사용 가능하다.정보의 접근 제한(캡슐화)
클로저 모듈 패턴
const makeCounter = () => { let value = 0; return { increase : () => { value += 1; } decrease : () => { value -= 1; } getVakye : () => value; } } const counter1 = makeCounter();
여기에서 value라는 변수에 값을 새롭게 할당할 수는 없을 것이다. 이는 스코프 규칙에 의해, 어떤 경우에도 value는 직접수정이 불가능하기 때문이다. 대신, 리턴하는 객체가 제공하는 메소드를 통해 value 값을 간접적으로 조작가능하다.
모듈화
function sum(x,y,z) { return x + y + z; } const numbers = [1, 2, 3]; sum(...numbers); // 6을 리턴
function sum(...theArgs) { return theArgs.reduce((pre, cur) => { return pre + cur; }); } sum(1,2,3); // 6을 리턴 sum(1,2,3,4); // 10을 리턴
Spread 문법은 배열에서 강력하다. 하지만 기존 배열을 변경하지 않아 immutable하다.
배열 합치기
let arr1 = [0, 1, 2]; let arr2 = [3, 4, 5]; arr1 = [...arr1, ...arr2]; // arr1 : [0, 1, 2, 3, 4, 5]
배열 복사
let arr1 = [0, 1, 2]; let arr2 = [...arr1]; arr2.push(4); // arr1 : [0, 1, 2], arr2 : [0, 1, 2, 4]
let obj1 = {foo : 'bar', x : 42}; let obj2 = {foo : 'baz', y : 13}; let clonedObj = {...obj1}; // {foo : 'bar', x : 42} let mergedObj = {...obj1, ...obj2}; // {foo : 'baz', x : 42, y : 13};
function myfun(a, b, ...args) { console.log('a, ' + a); console.log('b, ' + b); console.log('args, ' + args); } myfun('one', 'two', 'three', 'four', 'five'); // a, one // b, two // args, ['three', 'four', 'five'] <- 배열의 형태로
구조 분해 할당은 spread 문법을 활용해서 값을 해체한 후, 개별 값을 변수에 새로 할당하는 과정이다.
분해 후 새 변수에 할당
배열
const[a, b, ...rest] = [10, 20, 30, 40 ,50]; // a : 10, b : 20, rest : [30, 40, 50]
객체
const{a, b, ...rest} = {a : 10, b : 20, c : 30, d : 40}; // a : 10, b : 20, rest : {c : 30, d : 40}
여기에서 const 안의 ab, cd라면 ab, cd는 undefined고, rest가 {a : 10, b : 20, c : 30, d : 40}가 된다.
이번 챕터는 JS/Node의 핵심개념과 문법에 대해 알아봤다. 분명 쉬운 부분도 있었고 어려운 부분이 존재했다. 특히 구조분해를 하는 부분에서 객체에 대한 것이었는데 잘 배웠다고 생각했는데 실습을 해보니 엉망진창이었다. 이는 내가 조금 더 보완을 해야할 것 같다. 그리고 이번 주는 css도 더 깊게 해보는 시간을 가졌는데 특히 나는 CSS로 레이아웃을 구성하는 것을 어려워했던 것 같다. 많이 사용해보지도 못했고. 뭔가 구성하는데 있어서 내가 잘 생각을 못해내는건지, 제대로 하지 않은건지 많이 어려움을 겪었다. 이번 주 챕터를 하면서 느낀 것은 내가 어려워 하는 것들은 확실히 경험해보지 못하고, 많이 사용하지 않았던 것에서 나왔었다. 그러므로 나는 이를 극복하기 위해 더 경험하고, 실습같은 것을 더 하면서 많이 사용하면서 사용방법을 익혀야 될 것 같다. 이번 주는 정말 모르는 부분이 꽤 많았던 주였다. 앞으로더 더 많이 모르는 것들이 많이 나올텐데 기죽지 말고 내껄로 잘 만들어보자..!