1. 브라우저의 동작원리
브라우저의 핵심 기능
- 사용자가 참조하고자 하는 웹페이지를 서버에 요청(Request)하고 서버의 응답(Response)를 받아 브라우저에 표시하는 것
- 서버로부터 HTML, CSS, javaScript, 이미지 파일 등을 응답 받는다.
- HTML, css파일은 렌더링 엔진의 HTML 파서와 CSS파서에 의해 파싱(Parsing)되어 DOM, CSSOM 트리로 변환되고 렌더 트리로 결합된다. 렌더 트리를 기반으로 웹페이지를 화면에 그린다.
- 자바스크립트 엔진을 통해 자바스크립트를 처리한다.
- HTML 파서가 Script태그를 DOM 생성 프로세를 중지하고 자바스크립트 코드를 실행하기 위해 자바스크립트 엔진으로 제어 권한을 넘긴다.
- 자바스크립트엔진은 Script의 src속성에서 가리키는 자바스크립트 파일을 로드하고 파싱하여 실행한다.
- 실행이 종료되면 HTML 파서가 제어 권한이 넘어가고 다시 DOM 생성 프로세스가 시작된다.
브라우저의 특성
- 브라우저는 동기(Synchronous)적으로 HTML, CSS, JavaScript를 처리한다.
- 위에서 보면 알 수 있듰이 script태그를 만나면 JavaScript를 처리하기 전까지 DOM생성 프로세스가 중단된다.
- 그러므로 웹의 뷰 로딩이 늦어지지 않게 Script를 처리하는 방법을 알고 있으면 좋다.
- Script를 Body요소의 가장 아래에 위치시킨다.
- Script태그에 async, defer 키워드를 추가한다.
- Script에서 작동시킬 주요 로직을 EventHandler를 이용하여 HTML파싱을 다 한 이후에 불러와 실행시킨다.
2. 자바스크립트의 기본 문법
변수
- 목적
- 어떠한 값을 할당하여 변수 이름을 통해 그 값을 참조하기 위해 사용한다.
- 변수 이름을 통해 변수에 할당 한 값의 의미를 알 수 있다.
- 원리
- 변수는 메모리 상의 주소를 기억하는 저장소이다. 즉, 메모리 주소에 접근하기 위해 사람이 이해 할 수 있는 언어로 지정한 식별자(Identifier)이다.
- 사용법
값
- 값은 프로그램에 의해 조작 될 수 있는 대상, 다양한 방법으로 생성할 수 있으며 대표적인 방법으로 리터럴 표기법 (literal notation)이 있다.
- 데이터 타입(Data Type)
- 프로그래밍 언어에서 사용할 수 있는 값의 종류
- 자바스크립트는 C / Java와 다르게 변수를 선언 할 때 변수에 할당 할 값의 데이터 타입을 미리 지정하지 않는다. 즉, 자바스크립트는 동적 타이핑이 적용되었다.
- 자바스크립트는 아래와 같이 총 7가지 데이터 타입이 있다.
- 원시타입 (Primitive Data Type)
- number
- string
- boolean
- null
- undefined
- symbol
- 객체 타입 (Object data type)
- object
- 리터럴(literal)
연산자
키워드
- 수행할 동작을 규정한 것이다.
- 키워드 종류는 아래에 나와있는 것 말고도 많다.
var: 새로운 변수를 생성하는 동작을 규정
function: 새로운 함수를 생성하는 동작을 규정
return: 함수 종료 및 값을 반환하는 동작을 규정
while: 반복문을 생성하는 동작을 규정
break: 반복문을 탈출 하는 동작을 규정
주석
- 프로그램의 의미나 프로그램 외 사용자가 알아두면 좋을 정보(예: 저작권)등을 나타내기 위해 사용한다.
- 주석을 사용하지 않고도 의미를 알 수 있는 프로그램이 최선이다.
- 주석은 해석기가 무시하며 실행되지 않는다.
문
- 프로그램을 이루는 명령을 각각 문(statement)이라 한다.
- 리터럴, 연산자(Operator), 표현식(Expression), 키워드(Keyword) 등으로 구성되며 세미콜론으로 끝내는 관습이 있다. 자바스크립트에서는 세미콜론이 필수가 아니다.
- 문은 위에서 아래로 순서대로 실행된다.
- 실행 순서는 조건문, 반복문에 의해 흐름제어 된다. 함수 호출에 의해서도 바뀔 수 있다.
- var을 사용시 block-level-scope가 유효하지 않고 function-level-scope가 유효하다.
- let, const는 block-level-scope, function-level-scopr모두 유효하다.
표현식
문과 표현식의 비교
- 문(Statement)이 마침표로 끝나는 하나의 완전한 문장(Sentence)이라고 한다면 표현식은 문을 구성하는 요소이다.
- 표현식은 그자체로 하나의 문이 될 수도 있다. (예: 할당문)
함수
- 어떤 작업을 수행하기 위해 필요한 문(statement)들의 집합을 정의한 코드 블록이다.
- 이름과 매개변수를 갖으며 필요한 때에 호출하여 코드 블록에 담긴 문들을 일괄적으로 실행할 수 있다.
- 다음과 같이 선언 할 수 있다.
function square(number) {
return number * number;
}
square(2);
- 함수를 사용하면 코드의 재사용성을 높일 수 있다.
객체
- 자바스크립트는 객체(object) 기반의 스크립트 언어이다.
- 자바스크립트를 이루고 있는 거의 “모든 것”이 객체이다.
- 원시 타입(Primitives)을 제외한 나머지 값들(함수, 배열, 정규표현식 등)은 모두 객체이다.
- 자바스크립트 객체는 key(이름)와 value(값) 으로 구성된 프로퍼티(property) 및 메소드(method)의 집합이다.
- 프로퍼티의 value(값)으로 자바스크립트에서 사용할 수 있는 모든 값을 사용할 수 있다.
- 데이터와 함수를 모두 객체안에 종속시켜 하나의 단위로 구조 할 수 있어 객체는 유용하다.
- 자바스크립트 객체는 객체지향 상속을 '프로토타입'을 통해 구현했다. 객체는 객체의 '프로토타입'으로부터 프로퍼티와 메소드를 상속 받는다.
배열
- 배열(array)은 1개의 변수에 여러 개의 값을 순차적으로 저장할 때 사용한다.
- 자바스크립트의 배열은 객체이며 유용한 내장 메소드를 포함하고 있다.
단어
- 동적타이핑: 변수의 타입이 할당된 값의 데이터 타입에 의해 결정 되는 것
- 피연산자: 연산의 대상이 되는 값
- method: 객체의 프로퍼티 값이 함수일 경우 해당 프로퍼티를 method라고 한다.
3. 데이터타입과 변수
- 데이터 타입의 존재 이유
- 메모리에 값을 저장하기 위해서는 확보해야 할 메모리 공간을 알아야하고 데이터 타입을 확보해야 할 메모리 공간을 나누는 기준으로 사용 한다.
데이터 타입
-
프로그래밍 언어에서 사용할 수 있는 데이터(숫자, 문자열, 불리언 등)의 종류를 말한다.
-
데이터 타입이 컴퓨터와 개발자에게 알려주는 것
- 데이터를 메모리에 저장할 때 확보해야 하는 메모리 공간의 크기
- 할당할 수 있는 유효한 값에 대한 정보
- 메모리에 저장되어 있는 2진수 데이터를 어떻게 해석할 지에 대한 정보
-
자바스크립트에는 7개의 데이터 타입이 있다. 위에 다루었으므로 생략한다.
-
원시 타입 (Primitive Data Type)
-
원시 타입의 값은 변경 불가능한 값(immutable value)이다.
-
원시 타입의 값은 pass-by-value(값에 의한 전달)이다.
-
number
- 자바스크립트는 number라는 하나의 숫자 타입만 존재한다.
- 배정밀도 64비트 부동소수점 형을 따른다.(double-precision 64-bit floating-point format : -(2^53 - 1) 와 2^53 - 1 사이의 숫자값)
- 정수 데이터 타입은 없다.
- 예시, 2, 8, 16진수도 10진수와 동일하게 배정밀도 64비트 부동소수점 형을 따라 저장되기 때문에 참조시 10진수로 해석된다.
var integer = 10; // 정수
var double = 10.12; // 실수
var negative = -20; // 음의 정수
var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수
- 3가지 특별한 값이 있다.
- Infinity: 양의 무한대
- -Infinity: 음의 무한대
- NaN: 산술 연산 불가Not-a-Number)
-
string
- 텍스트 데이터를 나타내는데 사용한다.
- 문자열은 0개 이상의 16bit 유니코드 문자(UTF-16) 들의 집합으로 대부분의 전세계의 문자를 표현할 수 있다. 문자열은 작은 따옴표(‘’) 또는 큰 따옴표(“”) 안에 텍스트를 넣어 생성한다.
- 문자열에서 각 문자를 str[0]과 같이 참조 할 수 있다. 하지만 오직 읽을 수만 있고 변경 할 수는 없다.
-
boolean
- 불리언(boolean) 타입의 값은 논리적 참, 거짓을 나타내는 true와 false 뿐이다.
- 조건문에서 자주 사용된다.
- 조건문에서 null, 비어있는 문자열, undefined, 숫자 0은 false로 간주된다.
-
undefined
- undefined 타입의 값은 undefined가 유일하다.
- 선언 이후 값을 할당하지 않은 변수는 undefined 값을 가진다.
- 변수 선언에 의해 확보된 메모리 공간에 원래 있던 Garbage value를 자바스크립트 엔진이 undefined로 초기화 하기 때문이다.
- 만일 개발자가 스스로 값이 없다라는 걸 명시하고 싶다면 undefined보다는 null을 할당한다.
-
null
- null 타입의 값은 null이 유일하다.
- 의도적으로 변수에 값이 없다는 것을 명시할 때 사용한다. 이는 변수가 기억하는 메모리 어드레스의 참조 정보를 제거하는 것을 의미하며 자바스크립트 엔진은 누구도 참조하지 않는 메모리 영역에 대해 가비지 콜렉션을 수행할 것이다.
-
symbol
- 심볼(symbol)은 ES6에서 새롭게 추가된 7번째 타입이다.
- 심볼은 주로 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키(property key)를 만들기 위해 사용한다.
- 심볼은 Symbol 함수를 호출해 생성한다. 이때 생성된 심볼 값은 다른 심볼 값들과 다른 유일한 심볼 값이다.
// 심볼 key는 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키
var key = Symbol('key');
console.log(typeof key); // symbol
-
객체 타입 (Object type, Reference type)
- 원시 타입(Primitives)을 제외한 나머지 값들(배열, 함수, 정규표현식 등)은 모두 객체이다.
- 객체는 pass-by-reference(참조에 의한 전달) 방식으로 전달된다.
변수
-
데이터에 고유의 이름인 식별자(identifier)를 명시한 것이다. 식별자를 변수명이라 하고 변수로 참조할 수 있는 데이터를 변수값이라 한다.
- 식별자는 어떤 대상을 유일하게 식별할 수 있는 이름을 말한다. 식별자에는 변수명, 함수명, 프로퍼티명, 클래스명 등이 있다.
-
변수 이름 짓기 규칙
- 반드시 영문자(특수문자 제외), underscore ( _ ), 또는 달러 기호($)로 시작하여야 한다.
- 이어지는 문자에는 숫자(0~9)도 사용할 수 있다.
-자바스크립트는 대/소문자를 구별하므로 사용할 수 있는 문자는 “A” ~ “Z” (대문자)와 “a” ~ “z” (소문자)이다.
-
선언만 되어 있는 변수는 undefined로 초기값을 갖는다.
-
선언하지 않은 변수에 접근하면 ReferenceError가 발생한다.
-
변수의 중복 선언
- var 키워드로 선언한 변수는 중복 선언이 가능하다.
-
변수 호이스팅 (Variable Hoistin)
- var 키워드를 사용하여 선언하면 해당 선언문이 해당 변수의 scope의 선두로 옮겨진 것처럼 동작하는 특성이다.
- var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한 번에 이루어진다.
-
변수 생성 단계
- 선언 단계(Declaration phase)
- 변수 객체(Variable Object)에 변수를 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.
- 초기화 단계(Initialization phase)
- 변수 객체(Variable Object)에 등록된 변수를 메모리에 할당한다. 이 단계에서 변수는 undefined로 초기화된다.
- 할당 단계(Assignment phase)
- undefined로 초기화된 변수에 실제값을 할당한다.
-
var 키워드로 선언된 변수의 문제점
단어
- 정적 타입(Static/ Strong Type): 변수의 데이터 타입이 변수 선언 시 미리 타입 지정(Type - annotation)해주는 값에 따라 정해지는 것을 정적 타입이라 한다. C, Java등이 해당된다.
- 가비지 콜렉션: 값이 할당되었던 메모리 영역중에서 필요없게 된 영역을 해제하는 것
4. 연산자
표현식과 연산자
- 리터럴, 식별자, 연산자, 함수 호출 등의 조합을 말한다.
- 평가(evaluation)되어 하나의 값을 만든다. 즉, 표현식은 하나의 값으로 평가될 수 있는 문이다.
- 표현식의 종류
- 리터럴 표현식 (예: 10)
- 식별자 표현식 (예: sum)
- 연산자 표현식 (예: 10 + 20)
- 함수/메소드 호출 표현식 (예: square())
문과 표현식
- 문(statement)은 자바스크립트 엔진에게 내리는 명령이다.
- 문의 종류
- 선언문 (예: var x;)
- 할당문 (예: x = 5;)
- 함수 선언문 (예: function foo () {})
- 조건문 (예: if (x > 5) {})
- 반복문 (예: for (let i = 0; i < 10; i++) {}
- 문은 리터럴, 연산자, 표현식, 키워드 등으로 구성되며 세미콜론으로 끝나야 한다. 단 코드블록은 제외이다.
- ASI: automatic semicolon insertion, 세미콜론을 안붙혀도 자바스크립트 엔진이 자동으로 세미콜론을 붙혀주는 기능
- ESLint와 같은 정적 분석 도구에서도 세미콜론 사용을 기본으로 설정하고 있다.
- TC39(ECMAScript 기술 위원회)도 세미콜론 사용을 권장하는 분위기이다.
- 문은 표현식이 될 수 있는 문과 표현식이 아닌 문으로 나눌 수 있다. 표현식이 아닌 문은 크롬 개발자 도구에서는 undefined를 반환한다.
연산자
5. 제어문
- 주어진 조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용한다.
블록문(Block statement/Compound statement)
- 0개 이상의 문들을 중괄호로 묶은 것으로 코드 블록 또는 블록이라고 부르기도 한다.
- 자바스크립트는 블록문을 하나의 단위로 취급한다.
- 블록문은 단독으로 사용할 수도 있다.
- 일반적으로 제어문이나 함수 선언문 등에서 사용한다.
- 말미에 세미콜론을 붙히지 않는다.
조건문(conditional statement)
반복문(Loop statement)
-
주어진 조건식(conditional expression)의 평가 결과가 참인 경우 코드 블럭을 실행한다.
-
그 후 조건식을 다시 검사하여 여전히 참인 경우 코드 블록을 다시 실행한다.
-
조건식이 거짓일 때까지 위 과정을 반복한다.
-
자바스크립트는 3가지의 반복문 for 문, while 문, do…while 문을 제공한다.
-
for 문
- for 문은 조건식이 거짓으로 판별될 때까지 코드 블록을 반복 실행한다.
- for (초기화식; 조건식; 증감식) { 실행문 }
- for 문의 실행 순서
- 초기화식 -> 조건식 -> 실행문 -> 증감식 -> 조건식 -> 실행문 -> 증감식 -> 조건식 ...
- 위 과정을 조건식이 false가 될 때까지 반복한다. false이면 for문 종료.
- for문의 초기화식, 조건식, 증감식은 모두 옵션이다. for( ; ; )을 사용하면 무한루프가 발동한다.
-
while 문
- 주어진 조건식의 평가 결과가 참이면 코드 블록을 계속해서 반복 실행한다.
- 조건문의 평가 결과가 거짓이 되면 실행을 종료한다.
-
do…while 문
- 코드 블록을 실행하고 조건식을 평가한다. 따라서 코드 블록은 무조건 한번 이상 실행된다.
- do {실행문} while (조건식)
break 문
-
break 문은 레이블 문, 반복문(for, for…in, for…of, while, do…while) 또는 switch 문의 코드 블록을 탈출한다.
-
레이블 문, 반복문, switch 문의 코드 블록 이외에 break 문을 사용하면 SyntaxError(문법 에러)가 발생한다.
-
레이블 문(Label statement)이란 식별자가 붙은 문을 말한다. case문과 default문도 레이블 문이다.
foo: console.log('foo');
foo: {
console.log(1);
break foo; // foo 레이블 블록문을 탈출한다.
console.log(2);
}
-
중첩된 for 문의 내부 for 문에서 break 문을 실행하면 내부 for 문을 탈출하여 외부 for 문으로 진입한다. 이때 내부 for 문이 아닌 외부 for 문을 탈출하려면 레이블 문을 사용한다.
-
중첩된 for 문을 외부로 탈출할 때 레이블 문은 유용하지만 그 외의 경우 레이블 문은 일반적으로 권장하지 않는다.
- 레이블 문을 사용하면 프로그램의 흐름이 복잡해져서 가독성이 나빠지고 오류를 발생시킬 가능성이 높아지기 때문이다.
-
break 문은 레이블 문 뿐만이 아니라 반복문, switch 문에서도 사용할 수 있다. 이 경우에는 break 문에 레이블 식별자를 지정하지 않는다.
-
break 문은 반복문을 더 이상 진행하지 않아도 될 때 불필요한 반복을 회피할 수 있어 유용하다.
continue 문
- 반복문(for, for…in, for…of, while, do…while)의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 이동한다.
- break 문처럼 반복문을 탈출하지는 않는다.