SCSS와 SASS는 CSS를 편리하게 이용할 수 있도록 도와주며 추가 기능도 있는 확장판(CSS를 확장하는 스크립팅언어)이다.
불필요한 선택자(Selector)의 과용과 연산 기능의 한계, 구문(Statement)의 부재 등 프로젝트가 커지면서 복잡해지는 CSS 작업을 쉽게 해주며 가독성과 재사용성을 높여주어 유지보수가 쉬워지게 도와준다.
코드 중복을 줄이고 변수, 함수, 연산자를 사용할 수 있고 mixin을 사용해 자주 쓰이는 CSS 그룹을 만들고 재사용할 수 있다. extend는 특정 셀렉터를 상속할 수 있게 하여 셀렉터에 정의된 값을 한 곳에서 관리할 수 있게 해 준다.
SCSS와 SASS는 CSS의 preprocessor(전처리기)로, CSS에 기능을 추가한 것이다. 기능을 추가한 것이지, CSS 표준 자체를 확장한 것은 아니다.
CSS와 SASS/SCSS의 차이점
SASS와 SCSS의 차이점
리액트와 사용할 경우 SASS와 SCSS 중 어느 것을 사용할지?
id는 문서 안의 유일한 요소를 식별하고 싶을 때 사용하며, class는 공통점이 있는 여러 요소를 그룹화하여 식별하고 싶을 때 사용한다.
CSS에서 id는 샾(#)를 앞에 붙이며, class는 피리어드(.)을 붙여서 구별한다.
또한 id는 class의 속성보다 우선순위가 높으며, id의 속성은 해당 요소에 부여된 class의 속성과 관계없이 작동한다.
모든 HTML 요소는 박스 모양으로 구성되기 때문에, 이를 박스 모델이라고 한다.
크게 4부분으로 나뉘어지며 아래와 같다.
flexbox는 X축 또는 Y축 방향으로 요소를 배치, 정렬할 수 있으며, 각 요소의 순서를 변경할 수 있기 때문에, 기존 CSS 레이아웃 기술에 비교했을 때, 손쉽게 멀티 스크린에 대응할 수 있다.
grid는 테이블처럼 세로 열과 가로 행을 기준으로 요소를 정렬한다. 그러나 테이블에 비해 Grid는 더 다양한 레이아웃을 구현할 수 있다. 행과 열 격자 구조에 요소를 자유롭게 배치할 수 있고, HTML 문서 위계 구조와 무관하게, grid 인터페이스 내부에 포함된 자식 아이템을 Grid 내부에 자유롭게 위치시킬 수 있다.
flexbox는 레이아웃을 다룰 때 한 번에 하나의 차원(행이나 열)만 다루기 때문에 1차원이라 부른다. 반면, grid 레이아웃은 행과 열을 함께 조절하기 때문에 2차원 모델이라 부른다.
장점
단점
position 속성이 없는 태그는 순서대로 쌓인다.
position 속성이 있는 태그들은 없는 태그들보다 위에, 나오는 순서대로 쌓인다.
position 속성과 z-index 값이 있으면 z-index 값이 큰 태그가 위에 쌓인다.
z-index 값이 커도 부모 태그의 z-index가 우선된다.
자바스크립트는 단일 스레드이지만 구동되는 환경(브라우저, Node.js 등)에서는 주로 여러 개의 스레드가 사용된다. 이러한 구동 환경이 단일 호출 스택을 사용하는 자바 스크립트 엔진과 연동하기 위해 사용되는 장치가 바로 'event loop' 이다. JavaScript event loop는 call stack이 비어있는 경우, task queue에서 대기하던 callback을 call stack으로 옮겨서 callback을 실행시켜주는 역할을 한다.
자바스크립트에서는 함수 호출을 관리하는 call stack과 비동기 작업 처리를 위한 Web API가 함께 작업을 처리한다. Web API는 특히 작업 완료에 시간이 오래 걸리는 작업을 처리하게 되는데, 이 결과값을 처리할 수 있는 callback 함수를 task queue에 쌓는다.
하나의 js파일이 실행되면, 코드가 차례로 실행된다. 이 과정 중에 호출되는 함수가 비동기로 작동되는 경우, 이 비동기 작업은 (브라우저는) Web API에서 처리된다. 이 작업의 결과를 처리하는 callback 함수는 이후에 call stack에서 따로 실행이 되어야 하는데, call stack에서 실행 컨텍스트가 아직 남아있는 경우 task queue에서 "대기"하게 된다.
이처럼 시간이 오래 걸리는 작업이 call stack에 머물러서 싱글스레드로 작동되는 event loop를 막지 않도록 도와준다. 그래서 연산이 많고 시간이 오래 걸리는 작업은 비동기로 처리하는 것이 효율적이다.
JavaScript 비동기 핵심 Event Loop 정리
콜백 함수
Promise
Async/Await
Blocking은 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고, 호출한 함수가 대기하도록 한다. 예를 들어 실행하는데 10초가 걸리는 A 라는 함수가 실행되면 B라는 함수가 실행되려면 10초간 대기해야 한다.
반면, Non-Blocking은 호출된 함수가 할 일을 마치지 않았더라도 바로 제어권을 내주어 호출한 함수가 다른 일을 진행할 수 있는 것이다. 예를 들어, A함수가 종료되지 않은 상태여도 바로 B함수를 실행할 수 있다.
Node.js 자체는 싱글스레드 방식이 아니다. 싱글 스레드 방식으로 동작하는 것은 Node.js나 브라우저가 아니라 브라우저에 내장된 자바스크립트 엔진이다. 만약 모든 자바스크립트 코드가 자바스크립트 엔진에서 싱글 스레드 방식으로만 동작한다면 자바스크립트는 비동기로 동작할 수 없기 때문이다. 즉, 자바스크립트 엔진은 싱글 스레드로 동작하지만 브라우저나 Node.js는 멀티 스레드로 동작한다. 자바스크립트를 실행하는 부분에서만 싱글스레드로 구성되어있고, 이 때의 작업 동시성은 이벤트 루프를 통해서 구현할 수 있다.
자바스크립트는 객체 기반의 프로그래밍 언어이며 원시 타입의 값을 제외한 나머지 값들은 모두 객체이다.
객체 지향 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다. 이 방법은 실제 세계의 실체들을 프로그래밍에 접목시키려는 시도에서 부터 시작되었다.
객체지향 프로그램의 핵심 개념으로 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것이다. javascript는 상속을 구현하여 불필요한 중복을 제거할 수 있다. 이는 코드의 재사용이란 관점에서 매우 유용하다. 생성자 함수가 생성할 모든 인스턴스가 공통적으로 사용할 프로퍼티나 메서드를 프로토타입에 미리 구현해 두면 생성자 함수가 생성할 모든 인스턴스는 별도의 구현 없이 상위(부모) 객체인 프로토타입의 자산을 공유하여 사용할 수 있게 된다.
Immediately Invoked Function Expressions의 줄임말로써 함수 정의와 동시에 즉시 호출되는 즉시 실행 함수를 의미한다.이는 단 한번만 호출이 되며 다시 호출할 수 없는 특성이 있다.
IIFE는 전역 스코프를 오염시키지 않기 위해 사용한다.
Javascript에서는 함수가 어떻게 정의되었는지 혹은 어떻게 호출되었는지에 따라서 scope가 정해지게 된다.이를 활용하여 변수나 메소드가 접근되는 것을 closure가 보호해 줄 수 있는데 이를 private scope라 하며 주로 이런 상황에 IIFE가 사용된다.
IIFE (Immediately-Invoked Function Expression) 정리
this는 함수의 호출 방식에 의해서 결정된다. setTimeout()에 의해 실행된 코드는 별도의 실행 컨텍스트에서 setTimeout이 호출된 함수로 호출된다. 호출된 함수에 대해서는 this 키워드를 설정하는 일반적인 규칙이 적용되며, this를 설정 혹은 할당하지 않은 경우, non-strict 모드에서 전역(혹은 window) 객체, strict모드에서 undefined를 기본 값으로 한다.
콜 스택(call stack) 영역에는 원시타입(숫자 등) 데이터가 저장된다.
메모리힙(memory heap) 영역에는 참조타입(배열, 객체, 함수 등) 데이터가 저장된다. 만약 참조타입 데이터를 선언을 하게 되면 해당 주소값만 콜 스택에 저장되고 주소값에 따른 value는 힙에 저장된다.
함수 호출 방식 중 하나이다.
Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것이다.
Call by value(값에 의한 호출)
장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
Call by reference(참조에 의한 호출)
장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)