— 8장
제어문
•
블록문: 0개 이상의 문을 중괄호로 묶은 것, 하나의 실행 단위, 자체 종결성 가짐,
ex. 블록문 단독, 제어문, 함수 선언문
•
조건문: 조건식은 ‘불리언값’으로 평가될 수 있는 표현식(아니면 강제변환),
ex. if…else문, switch문, 삼항연산자
•
반복문: ex. for문, while문, do…while문 → forEach메서드, for…in문, for…of문
•
break문: 레이블문, 반복문, switch문의 코드블록 탈출
•
레이블문: 식별자가 붙은 문, 프로그램의 실행순서를 제어하는데 사용
ex. switch문의 case문, default문, 중첩 for문 외부로 탈출
•
continue문: 반복문 코드블록 실행을 현 지점에서 중단하고 증감식으로 실행흐름 이동
— 9장
타입변환
기존 원시값을 사용해 다른 타입의 새로운 원시값을 생성하는 것
•
명시적 타입변환, 타입캐스팅: 개발자가 의도적으로 ex. 4.toString()
•
암묵적 타입변환, 타입강제변환: 자스 엔진에 의해 암묵적으로 ex. 4+’’
암묵적 타입변환
원시타입 중 하나로 자동 변환
문자열 타입으로 변환: 문자열 연결 연산자, 템플릿 리터럴
숫자 타입으로 변환: 산술 연산자, + 단항 연산자
불리언 타입으로 변환: Truthy값과 Falsy값으로 구분
명시적 타입변환
개발자 의도
방법 1. 표준 빌트인 생성자 함수를 new 연산자 없이
방법 2. 빌트인 메서드
방법 3. 암묵적 타입변환
•
문자열 타입으로 변환: 1. String(…) 2. .toString() 3. 문자열 연결 연산자
•
숫자 타입으로 변환: 1. Number(…) 2. parseInt(…), parsefloat(…) 3. + 단항 산술 연산자, * 산술 연산자
•
불리언 타입으로 변환: 1. Boolean(…) 2. 부정 논리 연산자 (!!)
연산자
•
단축평가 || &&
•
옵셔널 체이닝 연산자(ES11) ?.
•
null 병합 연산자(ES11) ??
&& | ?. |
|| | ?? |
단축평가 (||, &&)
논리 연산의 결과를 결정하는 피연산자를 타입변환하지 않고 그대로 반환
표현식을 평가(Falsy vs. Truthy)하는 도중에 평과 결과가 확정된 경우(논리곱 논리합) 나머지 평가과정 생략
2개의 피연산자 중 어느 한쪽으로 평가
if문 대체 가능
활용)
변수의 값이 객체인지 확인
함수 매개변수에 기본값 설정
옵셔널 체이닝 연산자 (?.) (ES?)
좌항의 피연산자가 null 또는 undefined 경우 undefined 반환, 아니면 우항 참조 실행
활용)
객체를 가리키기를 기대하는 변수가, null 또는 undefined가 아닌지 확인하고 프로퍼티 참조할때
null 병합 연산자 (??)
좌항의 피연산자가 null 또는 undefined 경우 우항 반환, 아니면 좌항 반환
활용)
변수에 기본값 설정할 때
— 10장
객체 타입
다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조
자스 객체 관리방식
객체
변경 가능한 값(mutable value)
0개 이상의 프로퍼티로 구성된 집합
•
프로퍼티: 객체의 ‘상태’를 나타내는 값
•
메서드: 객체에 묶여있는 함수, 프로퍼티 값이 함수(일급객체)인 프로퍼티, 프로퍼티를 참조하고 조작할 수 있는 ‘동작’
객체 생성하는 방법
1.
객체 리터럴
2.
Object 생성자 함수
3.
생성자 함수
4.
Object.create 메서드
5.
클래스(ES6)
(자스는 ‘프로토타입 기반 객체’지향 언어고, ‘클래스 기반 객체’지향 언어와는 달리 객체 생성하는 방법이 다양함)
객체 리터럴
객체를 생성하기 위한 표기법
1.
{…} 중괄호 안에 0개 이상의 프로퍼티 정의
2.
변수에 할당되는 시점(런타임)에 자스 엔진이 객체리터럴 해석해서 객체 생성
코드블록이 아니므로 세미콜론 붙여야 함, 값으로 평가되는 표현식임
ES6 확장 기능
•
프로퍼티 축약 표현
•
계산된 프로퍼티 이름
•
메서드 축약 표현
프로퍼티
쉼표로 구분
•
프로퍼티 키: 모든 문자열(빈값, 예약어도 가능하지만 권장하지 않음), 심벌값
중복 선언시 덮어씀
•
프로퍼티 값: 모든 값
— 11장
원시값 vs. 객체
1.
변경 불가능 vs. 가능
2.
실제 값 저장 vs. 참조 값 저장
3.
원시값 복사 vs. 참조값 복사 전달
원시값
1.
변경 불가능한 값(immutable)
: 읽기 전용, 데이터 신뢰성 보장, 불변성(immutability)
→ 원시값 자체를 변경할 수 없다는 것이지, 변수 값은 재할당을 통해 언제든지 교체가능,
상수(const 변수 = 원시값 || const 변수 = 객체)는 재할당이 금지된 변수
→ 재할당으로 변수 값을 변경하기 때문에 변수의 값 추적이 어려움
2.
실제 값 저장
3.
값에 의한 전달
: 할당받은 변수(copy)에 할당되는 변수(score)의 원시값이 복사되어 전달
→ 두 변수의 원시값은 서로 다른 메모리 공간에 저장된 별개의 값이므로 간섭x 영향x
원시값 중 ‘문자열’
(0개 이상의 문자 * 2 byte)만큼 메모리 공간 차지
유사배열객체: 인덱스로 프로퍼티 값에 접근 가능하고 length 프로퍼티 가짐 → for문 순회 가능
래퍼객체: 문자열은 객체처럼 사용 가능함
객체
1.
변경 가능한 값(mutable)
: 재할당 없이 객체 직접 변경
2.
참조값 저장
: 객체 변수의 메모리 공간에 접근하면 ’참조값’(실제 객체가 들어있는 메모리 공간 주소)이 있음
→ 여러개 식별자가 하나의 객체를 공유할 수 있음
얕은 복사 vs. 깊은 복사
→ 객체 변경 추적하려면 옵저버 패턴,,, 객체를 ‘불변객체’로 만들어 사용해야 함 (177p)
3.
참조에 의한 전달
(⇒ 자스는 ‘값에 의한 전달’만 존재한다)
— 12장
함수
일련의 과정을 문으로 구현하고 코드블록으로 감싸서 하나의 실행 단위로 정의한 것
1. 함수 정의 2. 함수 호출
함수 사용 이유: 코드의 재사용, 유지보수의 편의성, 코드의 신뢰성
함수 정의 방식
1.
함수 선언문
a.
표현식이 아닌 문 (값으로 평가 x, undefined)
b.
함수이름 생략 불가
c.
“ 함수 호이스팅 “ ← 런타임 이전에 생성
2.
함수 표현식 (함수 리터럴 표현식)
a.
표현식인 문
b.
변수에 할당 가능하니까 익명함수 가능
c.
“ 변수 호이스팅 “ ← 런타임 이전에 변수가 선언되고, 런타임에 함수가 정의되고 변수에 할당
3.
Function 생성자 함수
a.
자스 빌트인 함수 + 매개변수 목록 + 함수 몸체를 문자열로 전달 (+ new 키워드)
b.
new Function(’x’,’y’,’return x+y’)
c.
클로저 생성하지 않는 등 바람직한 함수 정의 방식 아님
4.
화살표 함수(ES6)
a.
function 키워드 대신 화살표 사용
b.
항상 익명함수
c.
일반 함수와 다른 특징을 가짐
: 1. 생성자 함수로 사용 불가 2. this 바인딩 방식 3. prototype 프로퍼티 x 4. argument 객체 생성 x
함수 호출
함수를 호출한다 = 함수 이름으로 호출한다 x = 함수 ‘객체’를 가리키는 ‘식별자’로 호출한다
함수 이름은 함수 몸체 내부에서만 사용 가능함
호출 방법: 함수 식별자 + 함수 호출 연산자 ( 0개 이상 인수 쉼표로 구분 나열 )
과정: 1. 매개변수에 인수가 “순서대로” 할당 2. 함수 몸체 문들 실행
•
인수: 함수 호출할 때 , 값으로 평가될 수 있는 표현식, 개수와 타입 제한 x
•
매개변수: 함수 정의할 때, 함수 몸체 내부(스코프)에서 변수로 사용, 함수가 호출되면 우선 undefined로 초기화 후 인수를 순서대로 할당받음
•
인수와 매개변수: 개수 일치 체크 x, 에러 x,
부족하면 undefined로 초기화 그대로,
초과하면 암묵적으로 arguments 객체의 프로퍼티로 보관
자스는 동적 타입언어이기 때문에 매개변수 타입을 사전에 지정하지 못하죠
따라서 (타입 또는 개수 등) 적절한 인수가 전달되었는지 확인할 필요가 있습니다
◦
(ES6) 매개변수 기본값 설정 가능
◦
매개변수 최대 개수가 규정되어 있지는 않지만,
최대 2개 또는 객체를 인수로 전달(부수효과 조심)하는 것을 권장함
일급객체
값의 성질을 갖는 객체 → 함수를 값처럼 자유롭게 사용할 수 있다
[+] 일급객체가 되기 위한 조건
•
변수나 데이터 구조안에 담을수 있다
•
파라미터로 전달할 수 있다
•
리턴값으로 사용할 수 있다
⇒ 자스 함수는 여기에 해당하므로 일급객체이고, 일급객체여서 고차함수, 콜백과 같은 기능이 가능하죠
( 모든 언어의 객체가 일급객체인지 이급객체인지를 위와 같은 조건으로 구분하구요, 대부분 언어가 배열이나 문자열이 일급객체가 아니라서 (값으로 사용할 수 없으므로) 객체에 할당 또는 매개변수에 전달할 수가 없다고 합니다 )
함수 호이스팅 vs. 변수 호이스팅
함수 호이스팅 | 함수 호이스팅 | |
공통점 | 런타임 이전에 자스엔진에 의해 먼저 실행돼 식별자 생성 | 런타임 이전에 자스엔진에 의해 먼저 실행돼 식별자 생성 |
차이점 | undefinedfh 초기화 (var키워드) | 함수 객체로 초기화 |
→ 함수 선언 전 호출 가능하다는 문제가 있으므로 “함수 표현식” 권장 |
반환문
return 키워드 + 반환값(표현식)
역할 1. 함수 실행 중단, 함수 몸체 빠져나감
역할 2. return 키워드 뒤 표현식 평가해 반환, 명시적으로 지정하지 않거나 생략하면 undefined 반환, 자동 세미콜론
함수 종류
•
재귀함수 : 재귀 호출을 수행하는 함수, 탈출 조건 필수
—
•
중첩함수, 내부함수 : 함수 내부에 정의된 함수 (함수 선언문으로 정의하지 않기 스코프와 클로저와 깊은 관련)
자신을 포함하는 외부함수를 돕는 ‘헬퍼함수’
•
외부함수: 반복적 하는 일 ‘합성’
( 함수의 변하지 않는 공통 로직은 미리 정의해두고, 경우에 따라 변경되는 로직은 추상화 해서,
함수 외부에서 내부로 전달받음 )
—
•
콜백함수: 함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수 (헬퍼함수)
•
고차함수: 매개변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수
ex. map, filter, reduce, …
◦
콜백함수는 고차함수가 필요할때 호출시점을 결정해서 호출하므로, 콜백함수를 호출하지 않고, “함수” 자체를 전달해야 함
◦
고차함수 내부에만 호출되는 콜백함수는 익명함수 리터럴로 매개변수에 곧바로 작성하기
→ 고차함수가 호출될 때마다 평가되어 함수 객체 생성
—
•
순수함수: 부수효과 없는 함수, 외부상태*에 의존하지 않고 변경하지도 않는 함수
* 외부상태 : 전역변수, 서버 데이터, 파일, console, DOM 등
◦
동일한 인수 전달하면 언제나 동일한 값 반환하는 함수
◦
오직 매개변수를 통해 함수 내부로 전달된 인수에게만 의존해 값을 생성해 반환
(내부 상태만 의존해도, 내부 상태가 호출될 때마다 변화하는 값 ex.현재시간 이라면 순수함수 아님)
최소 하나 이상의 인수 전달 받음(0개는 상수나 마찬가지)
인수를 변경하지 않는 것이 기본 (인수의 불변성 유지)
◦
함수의 외부 상태를 변경하지 않음
•
비순수함수: 외부상태에 의존하거나 외부상태를 변경하는 함수
◦
내부에서 외부상태 직접참조, 매개변수로 객체전달 받기
◦
코드 복잡성 증가하고 부수효과 억제가 필요하기 때문에 지양
⇒ 함수형 프로그래밍 : 순수함수와 보조함수의 조합을 통해 외부상태를 변경하는 부수효과를 최소화해서
불변성을 지향하는 프로그래밍 패러다임
(로직 내 조건문, 반복문 제거해서 복잡성 해결,
변수 사용 억제하거나 생명주기 최소화로 상태 변경 피해 오류 최소화)
⇒ 자스는 ‘멀티 패러다임 언어’ : 객체지향 + 함수형프로그래밍
— 14장
변수의 생명주기
메모리 공간 확보 시점 ~ 가용 메모리 풀에 반환되는 시점
호이스팅은 스코프 단위로 동작함 ***
•
지역변수의 생명주기
◦
함수 종료하면 지역변수 소멸(대부분 일치)
◦
오래 생존하는 경우 : 누군가 스코프를 참조하고 있으면 생존 (클로저)
•
전역변수의 생명주기
◦
var 키워드 전역변수 : 전역객체의 프로퍼티
* 전역객체 : Client = window / Server = global
전역객체의 프로퍼티 : 표준 비트인 객체, 호스트 객체, var 전역변수, var 전역함수
◦
전역변수 문제점
▪
암묵적 결합, 긴 생명주기, 스코프체인 상에서 종점에 존재, 네임스페이스 오염
◦
전역변수 사용 억제 방법
▪
즉시 실행함수, 네임스페이스 객체, 모듈 패턴(캡슐화), ES6 모듈
— 15
var | let | const | |