2024년 10월 22일
사용자는 컴퓨터에게 명령하고, 컴퓨터는 수행한다.
이렇게 흐름을 제어하는 것을 flow control이라 함
Flow control : 제어흐름, 흐름제어
어느 부분이 표현식이고, 어느 부분이 문일까?
표현식 (expression) : 어떤 값으로 이행되는 임의의 유효한 코드 단위
문 (statement) : 프로그램을 구성하는 기본 단위, 최소 실행 단위
== 명령문
ex) 선언문, 할당문, 제어문, 반복문, 블럭문 ...
블럭문(block statement)
제어문(control flow statement)
반복문(iteration statement)
일부 조건이 충족되는 경우에만 일련의 명령문 실행
ex) if ... else문,
if ... else문 : 논리조건의 참/거짓에 따라 명령문을 실행해야 할 경우 사용
if문의 논리조건에는 true, false로 평가할 수 있는 표현식을 대입가능
논리조건이 참인 경우, if 블럭문 실행 / 논리조건이 거짓인 경우, else 블럭문 실행
해당 값은 false로 평가(Falsy)
else if절을 사용해 다수의 조건을 순차적으로 검사할 수 있음
실제 로직을 구현할 때, 중첩 if문을 사용할 수도 있음
마틴 파울러의 리팩토링 자료
switch문 : switch에 명시된 표현식을 평가한 후, 평가된 값과 case 라벨 값을 비교해 일치하는 case의 명령문을 실행
switch ( 표현식 ) {
case 라벨:
... 명령문 ...
default:
... 명령문 ...
}
조건부 loop
대부분의 프로그래밍 언어에는 일부 조건이 변경될 때까지 루프를 반복하는 구조가 있다.
시작할때 조건을 평가하는 타입 : 본문 생략 가능
while문
while(표현식) {
... 명령문 ...
}
마지막에 조건을 평가하는 타입 : 본문은 항상 한번 이상 실행
do ... while문
do {
... 명령문 ...
} while(표현식);
주의 사항
특정 부분의 코드가 반복적으로 수행될수 있도록 함
언어별로 지원하는 형식이 있음(자바스크립트 기준)
[초기화-조건식-증감문]의 형식
c언어에서 유래한 문법
while문과 다르게 해당 루프와 관련된 loop 변수 존재
for([초기문]; [조건문]; [증감문]) { ... }
Collection loop (Foreach 루프)
컬렉션 안의 항목들을 횡단하는 제어흐름문
For문과 다르게, 명시적으로 카운터(루프변수)를 관리 하지 않는다.
잠재적인 순환 횟수 오류를 예방(off-by-one error)
자바스크립트 collection loop
for ... of
for ... in
예외 상항 (Exception)
예외의 원인
: 언어 레벨 ~ 외부 요인에 의한 예외 상황까지 다양
예외의 종류 (코드 레벨에서 문제)
ECMAScript Error (자바스크립트 에러객체를 상속받음)
DOMException (WebAPI레벨에서 발생하는 에러 타입)
그 외
thorw
Error 객체
예외가 발생하면
콜스택(call stack)
try ... catch 문
try ... catch 문은 블록문 내에서 예외가 발생할 경우, 예외 처리를 맡을 하나 이상의 반응 명령문을 지정한다.
콜스택 중 하나에서 catch문에서 예외가 처리된다면, 더 상위의 콜스택에서는 더이상 예외가 타고 올라오지 않는다.
finally블록은 try 블록에서 예외 상황이 발생하지 않더라도, 실행됨
외부에 의존되어서 구현된 로직에서 사용 (예기치 못한 상황 대응)
객체 (Object) : 속성을 가진 독립적인 개체 (entity)
자바스크립트는 객체기반의 프로그래밍 언어
const 객체명 = {
"속성" : 값,
"속성" : 값
}
객체 - 속성 property
객체 - 속성 method
객체 - 생성방법
생성방법 1 - 리터럴 표기
생성 방법 2 - 생성자 함수
생성 방법 3 - Object.create
Object 빌트인 객체
Object 객체 - 정적 method
이는 객체의 변경이 일어날때 참조된 객체들도 같이 변경되는 문제점을 야기
때문에 의도한 동작이 되기 위해서는 아래와 같은 조작을 적절히 사용해야함
for ... in : 모든 열거 가능한 속성을 순회한다(객체의 프로토타입 체인의 속성까지)
Object.keys(객체) : 객체 자신의 열거 가능한 속성 이름을 배열로 반환
Object.getOwnPropertyNames(객체) : 객체 자신만의 모든 속성을 배열로 반환
객체는 참조 타입 Reference type : 모든 연산이 참조값(메모리 주소)으로 처리됨
객체 비교
동일한 객체를 생성해야할 때
얕은 복사
const person = {
name: '???',
address: {
country: 'Korea',
city: 'Seoul'
},
};
const joy = Object.assign({}, person);
const kei = { ...person };
joy.name = 'Joy Kim';
keiname = 'Kei Ko';
console.log('joy:', joy);
/*
'joy:' {
name: 'Joy Kim',
address { country: 'Korea', city: 'Seoul' }
}
*/
console.log('kei:', kei);
/*
'key:' {
name: 'Kei Ko',
address { country: 'Korea', city: 'Seoul' }
}
*/
console.log(joy === kei); // false
console.log(joy.address == kei.address); //true
joy.address.country = 'Japan';
console.log('joy:', joy);
/*
'joy:' {
name: 'Joy Kim',
address { country: 'Japan', city: 'Seoul' }
}
*/
console.log('key:', kei);
/*
'key:' {
name: 'Kei Ko',
address { country: 'Japna', city: 'Seoul' }
}
*/
깊은 복사
재귀함수를 이용한 복사 (라이브러리: lodash - cloneDeep)
JSON.stringify -> JSON.parse : 객체 -> 문자열로 변환(참조가 끊어짐) -> 객체로 변환
import cloneDeep from 'lodash.cloneDeep';
const person = {
name: '???',
address: {
country: 'Korea',
city: 'Seoul'
},
};
const joy = cloneDeep(person);
const personStr = JSON.stringify(person);
const kei = JSON.parse(personStr);
console.log(person.address === joy.address); // false
console.log(person.address === kei.address); // false
joy.address.country = 'Japan';
console.log('joy:' joy);
/*
'joy:' {
name: '???',
address { country: 'Japan', city: 'Seoul' }
}
*/
console.log('key:' kei);
/*
'key:' {
name: '???,
address { country: 'Korea', city: 'Seoul' }
}
*/
크게 2가지 종류임
표준 빌트인 객체 ECMAScript
빌트인 객체 형태 (생성자 함수로써 사용 가능)
Number 객체
숫자를 표현하고 다룰 때 사용하는 원시 래퍼 Built-in 객체
함수로 바로 사용 가능
Static 속성과 메서드
생성자 함수
변수 또는 객체의 속성이 숫자를 갖고 있으면, Number 객체 인스턴스 생성 없이 Number의 인스턴스 속성과 메서드 사용가능
Date 객체
Date 인스턴스 메서드
인스턴스 메서드 - 시간 갖고오기
인스턴스 메서드 - 시간 갖고 오기
인스턴스 메서드 시간 set 하기
문자열 특징
문자열 조작
String 객체
인스턴스 메서드 - 문자열 체크
인스턴스 메서드 - 문자열 변경
인스턴스 메서드 - 문자열 변경
인스턴스 메서드 - 문자열 변경
정규표현식 - 문법
문자열에서 특정 문자 조합을 찾기 위한 패턴 (== 정규식)
/pattern/flags
(예시 /\w+\s/g)
패턴 작성하는 방법
flag를 활용하여 탐색(특성 지정): d, g, I, m, s, u, y
정규표현식 - 생성 방법
RegExp 객체
RegExp 객체 와 String 객체가 함께 사용 되는 경우
Collection 이란?
Indexed collections
Keyed collections
특징
배열 요소의 참조
배열에 값 저장 :
배열의 길이 : 마지막 index에 +1한 값
배열의 반복 처리하기
정적 메서드 : from, isArray, of
생성자 : Array.prototype
인스턴스
인스턴스 메서드
요소 접근 : at()
요소 찾기 : indexOf(), lastIndexOf()
요소 포함 여부 : includes()
순회하며
요소 조작
요소 추가 : push(), unshift()
요소 제거 : pop(), shift()
순회하며
배열 합치기, 추가하기 : concat(), fill()
배열 분리하기 : slice(), splice()
배열 요소 변경하기 : copyWithin(), flat()
배열 재배치하기 : reverse()
반환 타입 변환하기 :
key 값을 기준으로 정렬되어 있는 데이터 집합
- Map, Set 포함
키와 값을 매핑하여 저장한다.
저장된 순서대로 각 요소들을 반복적으로 접근할 수 있다.
Map객체와 WeakMap 객체 공통 속성
Map 객체
Map 객체 - 특징
키 기반의 Object와 어떤 차이가 있을까?
속성의 데이터 타입
default 속성과의 충돌
객체의 크기
Object : 수동으로 추적해야함
Map : size 인스턴스 속성으로 얻을 수 있음
순서 보장
iterable 여부 (forEach문 사용 여부)
퍼포먼스(데이터 핸들링)
직렬화와 구문분석 제공여부
WeakMap - 특징
Set과 WeakSet 공통 속성
Set의 특징
모든 값들의 집합 (값 콜렉션)
입력된 순서에 따라 저장된 요소를 반복처리 할 수 있다.
특정 값은 Set 내에서 하나만 존재
배열 -> Set 으로 Set -> 배열로 변환 가능하다.
for ... of를 통해 순회 가능하다.
생성자 함수 : Set.prototype
인스턴스 :
- 속성 : size
index 콜렉션과 어떤 차이가 있을까?
WeakSet의 특징
JSON (JavaScript Object Notation)
인터넷에서 자료를 주고받을 때 자료를 표현하는 방법으로 알려져있음
키-값 쌍, 배열 자료형, 기타 모든 직렬화 가능한 값
또는 키-값 쌍으로 이루어진 데이터 객체를 전달하기 위해 사람이 읽을 수 있는 텍스트(문자열)를 사용하는 open standard 포맷
JSON의 파일 확장자 : .json
기본 자료형: number, string, boolean, array, object, null
객체의 형태와 유사
직렬화 (serialization, deserialization)
JSON 객체
intl 객체 (internalization 객체)
intl 객체 - DateTimeFormat 생성자 함수
intl 객체 - NumberFormat 생성자 함수
객체 지향 프로그래밍
객체는 현실의 개념을 추상화하여 정의
인스턴스 객체
객체지향 프로그래밍 :
대표적인 객체지향 프로그래밍
프로토타입 객체
프로토타입 객체 - 접근하기
프로토타입 객체 - 생성하기
속성이 없는데 조회된다?
ES6 + Class
class의 형태
class 문법
class 문법 - constructor
class 문법 - 인스턴스 method
class 문법 - 정적 메서드
class 문법 - 인스턴스 속성
class 문법 - 인스턴스 속성 조회 및 조작
class 문법 - 인스턴스 속성 할당 및 조작
class 문법 - 상속 - extends
class 문법 - 상속 - super
super()
자식 클래스의 constructor 사용시 constructor 반환문 전에 사용되어야함
super()
this란?
this 바인딩 - 함수 호출 방식
프로그래밍에서 scope
스코프의 규칙
스코프 종류
Scope의 규칙
정적 영역 규칙(lexical scoping rule)
동적 영역 규칙(dynamic scoping rule)
Scope의 종류
전역, 모듈, file, 함수, 블럭 스코프
전역 스코프 : 소스 코드 상의 모든 곳에서 사용할 수 있는 전역 변수
- 자바스크립트 : (브라우저 기준) window 객체
file 스코프
- 해당 파일 전체에서 접근 가능, 다른 파일에서 접근 불가능
모듈 스코프
- 모듈을 지원하는 프로그래밍 언어에서 모듈 단위 변수 선언 가능
함수 레벨 스코프
- 지역 변수: 함수 내에서 유효한 변수
- 함수가 반환된 이후에는 사용 불가능
- 함수 외부에서 유효하지 않음
블록 레벨 스코프
- 지역 변수 : 코드 블럭 내에서 유효한 변수
- ES6+ 자바스크립트 : let, const 키워드는 블록레벨 스코프
정리
자바스크립트를 실행시킬 때, 자바스크립트엔진은 몇가지 정보를 알고 있어야함
위의 정보들을 자바스크립트 엔진은 물리적 객체 형태로 관리를 하는데,
이 객체를 '실행 컨텍스트'라고 한다.
-> 실행 컨텍스트 : 코드가 실행되는 범위에 대한 개념
자바스크립트 엔진은 코드를 읽은 후에, 코드를 평가하고 평가된 코드를 실행한다.
여기서 평가(creation phase 실행컨텍스트 생성)와 실행(execution phase 실행컨텍스트 실행)은 실행컨텍스트에 의해서 관리된다.
실행 컨텍스트 생성 단계 - creation phase
실행 컨텍스트 실행 단계 - execution phase
실행 컨텍스트의 3가지 종류
우리가 작성한 자바스크립트 코드를 보면, 코드가 실행이 될때 하나의 Global Context와 여러개의 Functional Context가 생성될 것이다. 자바스크립트와 같은 인터프리터 언어는 call stack이라는 메커니즘을 사용
자바스크립트의 Call Stack
예시를 보면
발생 조건
상황
클로저
클로저 특징