flow control
: 제어 흐름, 흐름 제어
: 명령어 프로그램의 개별 명령문, 명령 또는 함수 호출이 실행되거나 평가되는 순서
5가지 제어 흐름의 종류
1. goto : 다른 구문에서 시작
2. choice: 일부 조건이 충족되는 경우에만 일련의 명령문 실행 ( if-else 문, switch문)
3. loop: 어떤 조건이 충족될 때까지 일련의 명령문을 0회 이상 실행
4. continue: 현재 실행 구문에서 떨어진 한 구문의 집합을 실행
5. break: 프로그램 실행을 중단
표현식(expression)
- 어떤 값으로 이행되는 임의의 유효한 코드 단위
- 표현식이 평가되면, 새로운 값을 생성하거나 기존 값을 참조
- 새로운 값을 생성하거나 기존 값을 참조
문(statement)
- 프로그램을 구성하는 기본 단위, 최소 실행 단위
- 선언문, 할당문, 제어문, 반복문, 블럭문, ...
* 블럭문: 명령문들을 그룹으로 묶을 수 있는 블럭문, 한 쌍의 중괄호로 묶어서 표현
조건문
if-else 문
: 논리 조건의 참/ 거짓에 따라 명령문을 실행해야 할 경우 사용
: 논리 조건이 참인 경우 if 블럭문 실행
: 논리 조건이 거짓인 경우 else 블럭문 실행
: 해당 값은 false 로 평가 => false, undefined, null, 0 ,NaN, ""(empty string)
switch문
: switch 에 명시된 표현식을 평한 후, 평가된 값과 case 라벨 값을 비교하여 일치하는 case 의 명령문을 실행
: default 문 작성 => 평가된 값에 해당하는 case 문이 없을 경우 실행됨
switch ( 표현식 ) {
case 라벨:
..명령문..
default:
..명령문..
}
반복문
Conditional loop ( 조건부 )
: 일부 조건이 변경될 때까지 루프를 반복하는 구조
⚠️종료될 수 있는 조건이 아닌 경우, 무한 루프에 빠질 수 있다.
1. 시작할 때 조건을 평가하는 타입
ex) while 문
2. 마지막에 조건을 평가하는 타입
ex) do while 문
for loop
: 특정 부분의 코드가 반복적으로 수행될 수 있도록 한다.
: [초기화- 조건식- 증감문] 형식
- 초기문: loop 내에서 사용할 loop 변수를 초기화
- 조건문: loop 내 코드 실행 전, 조건을 평가하여 loop를 지속할지 판단
- 증감문: loop 내 코드 실행 후, 실행되는 문장 ( 루프 변수 증감 용도)
Collection loop ( Foreach 루프)
: 컬렉션 안의 항목들을 횡단하는 제어 흐름문
: 명시적으로 카운터(루프변수) 를 관리하지 않는다.
: 잠재적인 순환 횟수 오류를 예방한다.
for ... of 문
: 반복 가능한 객체를 통해 반복하는 루프를 만든다.
: for ([변수] of [object] ) {...}
: 변수는 반복 가능한 객체의 값을 반환한다.
: 반복 가능한 객체 => Array, Set, String
const foo = 'apple';
for(const i of foo){
console.log(i);
//'a'
//'p'
//'p'
//'l'
//'e'
}
for ... in문
: 객체의 열거 속성을 통해 지정된 변수를 반복한다.
: for ([변수] in [object] ) {...}
: 변수는 객체의 key 값을 반환한다.
break 문
: 프로그램 실행 중단 종류
: 반복문, switch 문을 종료시킬 때 사용
: 가장 가까운 반복문을 종료하고, 다음 명령어로 넘어간다.
continue 문
: 현재 실행 구문에서 떨어진 한 구문의 집합을 실행 종류에 속한다.
: while, do.. while, for 문을 다시 시작하기 위해 사용
: 전체 루프 실행을 종료하지 않는다. ( while 문 => 조건문으로 이동, for 문: 증감문으로 이동 )
⚠️예외 처리하기
예외상황이란?
런타임 때 발생할 수 있는 의도치 않은 상황
예외의 원인
: 코드 레벨에서의 문제, 하드웨어/디바이스의 문제, 라이브러리 손상, 사용자의 입력 실수 ...
예외의 종류
: ECMAScript Error => 자바스크립트 언어에서 발생하는 Error Type
ex) RangeError, ReferenceError, SyntaxError, TypeError
: DOMException => Web API 레벨에서 발생하는 Error Type
ex) NetworkError, AbortError, TimeoutError ...
: 그 외 예외
ex) 개발자도 예상치 못한 예외 상황
예외 처리하기
throw 문
: 예외를 발생시킬 때 사용 => catch 블럭에서 에러 객체 핸들링
: throw 문 이후의 명령문은 실행되지 않는다.
Error 객체
: 사용자가 직접 정의하여 사용할 수 있음
: new Error(' 에러 메시지') , Error.message, Error.name
try...catch 문
: 블록문 내에서 예외가 발생할 경우, 예외 처리를 맡을 하나 이상의 반응 명령문을 지정
=> try 블록의 명령문 중 하나가 실패하면, catch 로 제어권이 넘어간다.
=> try 블록의 명령문 중 하나가 성공하면, catch 로 제어권이 넘어가지 않는다.
=> finally 블록: try 블록에서 예외 상황이 발생하지 않더라도 실행된다.
객체(Object)
객체란?
: 속성을 가진 독립적인 개체
: 자바스크립트는 객체 기반의 프로그래밍 언어
const foo = {
hello : 'Javascript',
happy : 'nice to meet you'
};
foo;
객체의 속성
: 키와 값 사이의 연결관계 , key - value
: 속성 접근 방법
1. 마침표 표기법 => objectName.propertyName
2. 대괄호 표기법 => objectName["propertyName"]
: 속성에는 값 뿐 아니라 함수도 할당 가능 => method
객체 생성 방법
1. 리터럴 표기
const foo = {name: 'apple'};
2. 생성자 함수
: new 키워드와 함께 객체를 생성하고 초기화 하는 함수
: 템플릿처럼 사용하여 속성이 동일한 객체를 여러 개 생성할 수 있다.
function Person(name,age){
this.name = name;
this.age = age;
}
new Person('Jason',30);
3. Object.create
: 생성자 함수처럼 동일한 속성값을 갖는 객체를 생성할 수 있다.
: Object.create(객체)
객체 속성 control
: 객체는 원시타입과 다르게 변경 가능한 값이다.
: 객체는 전달하는 과정에서 참조형태로 전달된다.
1. 객체의 속성 동적 생성
: 객체에 존재하지 않는 속성을 참조하고 할당문을 통해 값을 할당하면 속성이 동적으로 생성되고 추가된다.
2. 나열하기
- for..in 문 : 모든 열거 가능한 속성을 순회한다.
- Object.keys(객체) : 객체 자신의 열거 가능한 속성 이름을 배열로 반환
- Object.getOwnPropertyNames(객체) : 객체 자신만의 모든 속성을 배열로 반환
3. 삭제하기
: delete 연산자로 속성 삭제
: delete 속성 이름
객체 간 비교와 복사
객체 비교
: 객체를 서로 비교하면 객체 속성과 값이 같은 객체여도, 참조값이 다르므로 서로 다름
: 자기 자신과의 비교에서만 true
const foo = {
name='apple'
};
const bar = {
name='apple'
};
console.log(foo === bar); //false
console.log(foo === foo); //true
객체 복사
1. 얕은 복사
: 복사된 객체의 속성 중 하나라도 같은 참조를 하고 있게 되면, 얕은 복사 되었다고 한다.
: 객체의 속성 중 참조 타입이 없는 경우에만 얕은 복사 방법 권장
: Object.assign({}, 복사할 객체) , spread 연산자 { ... 복사할 객체}
2. 깊은 복사
: 복사된 객체의 속성 중 하나라도 같은 참조를 하고 있는 속성이 없다면 깊은 복사 되었다고 한다.
: 재귀 함수를 이용한 복사(lodash - cloneDeep), JSON.stringify (권장 X)
Build-in 객체
Number 객체
: 숫자를 표현하고 다룰 때 사용하는 원시 래퍼 빌트인 객체
: 함수로 바로 사용 가능
: 속성 => MAX_VALUE, MAX_SAFE_INTEGER ..
: 메소드 => isNaN, isFinite,parseInt, parseFloat ..
Math 객체
: 수학적인 상수와 함수를 위한 속성과 메서드를 가진 빌트인 객체 ( 숫자 데이터 타입만 지원)
: 메소드 => abs(x), pow(x,y), sqrt(x), ...
Date 객체
: 1970년 1월 1일 UTC 자정과의 시간 차이를 밀리초 단위로 나타낸 것
: 메소드 => now(),parse(),UTC()
: 인스턴스 메서드
getMonth() => 1월이 0부터 시작, getDay() => 일요일이 0부터 시작
문자열
: 문자열 리터럴로 표현되며, 쌍따옴표나 따옴표를 사용하여 표현
: 문자열 내에 이스케이프 문자 사용 가능( \n)
: 데이터 보관시 문자열 형태로 저장 유용
문자열 조작
: 문자열 요소 접근 => charAt, 유사배열이라 배열처럼 접근
: 문자열 비교 => 알파벳순을 비교하여 순서가 뒤에 올수록 크다고 판단
String 객체
: 문자열을 다룰 때 사용하는 원시 래퍼 빌트인 객체
: 함수로 바로 사용 가능
: 인스턴스 메서드 => 문자열 체크(get) , 문자열 변경(set)
문자열 체크
: 접근 =>at(), charAt() , charCodeAt() , codePointAt()
: 찾기 => indexOf() , lastIndexOf(), search()
: 포함 여부 => includes(), startsWith() , endsWith(), match(정규표현식), matchAll(정규표현식)
: 비교 => localeCompare()
문자열 변경
: toLocaleLowerCase(), toLocaleUpperCase() , toString()
: replace(), replaceAll() ...
: 추가하기 => padEnd(), padStart(), repeat()
: 합치기 => concat() , 산술연산자
: 분리하기 => slice(), substring(), split(), trim(), trimStart(), trimEnd()
정규표현식
: 문자열에서 특정 문자 조합을 찾기 위한 패턴(==정규식)
: /pattern/flags
Collection
: 비용을 절감하기 위하여 상황마다 효율적인 데이터 형태로 처리해야한다.
: 컬렉션은 데이터 항목들의 그룹을 의미한다.
: 컬렉션에는 list,set,tree,graph 등이 포함되어 있다.
indexed collections
: index 값을 기준으로 정렬되어 있는 데이터 집합
: index 로 배열 내의 값을 참조할 수 있다.
const foo=[1,2,3];
foo[1]; // 2
* 배열(Array)
: 이름과 인덱스로 참조되어 정렬된 값들의 집합
: js 에서 배열의 길이는 고정되어 있지 않음
: 모든 요소는 필수값이 아님(undefined 로 지정해도 됨)
🛠️ 생성 방법
- 배열 리터럴: 대괄호([]) 로 묶는다.
- Array 객체 생성자: new Array(length) => 길이만 지정된 배열, new Array(element0, element1, ...) => 요소가 지정된 배열
key based collections
: key 값을 기준으로 정렬되어 있는 데이터 집합
: Map, Set 포함
: 키와 값을 매핑하여 저장
: 저장된 순서대로 각 요소들을 반복적으로 접근할 수 있음
const foo = new Map();
foo.set(key,value);
* Map 객체
: 간단한 키와 값을 서로 매핑시켜 저장하고, 저장된 순서대로 요소를 반복적으로 접근할 수 있다.
: [key,value] 의 형태로 삽입된 순서대로 추가
: 인스턴스 속성 => size
: 인스턴스 메서드
- 요소 체크(get) : 접근, 포함 여부 - get, has
- 요소 변경(set) : clear, delete, set
- 순환 관련 : keys, values, entries, forEach
* WeakMap
: 키에 대한 강력한 참조를 생성하지 않는 키/값 쌍의 모음
: 키는 object 만을 허용
: 객체 정보를 비노출 (객체의 사적인 정보를 저장하기 위함, 상세 구현 내용을 숨기기 위함)
- 요소 체크(get) : 접근, 포함 여부 - get, has
- 요소 변경(set) : delete, set
- 순환 관련 : 없음
* Set
: 모든 값들의 집합
: 입력된 순서에 따라 저장된 요소를 반복 처리할 수 있음
: 특정 값은 Set 내에서 하나만 존재
: 배열을 Set 으로, Set을 배열로 변환 가능
: for ... of 를 통해 순회 가능
: 인스턴스 속성 => size
: 인스턴스 메서드
- 요소 체크(get) : 접근, 포함 여부 - has
- 요소 변경(set) : clear, delete, add
* WeakSet
: 객체 컬렉션(object 만 허용)
: 약한 참조를 가진다.
: 인스턴스 메서드
- 요소 체크(get) : 포함 여부 - has
- 요소 변경(set) : delete, add
- 순환 관련: 없음
JSON 객체
Javascript Object Notation
: 키 - 값 쌍, 배열 자료형, 기타 모든 직렬화 가능한 값
: 직렬화 => Object 를 문자열로 변환하는 것 (JSON.stringify )
: 역직렬화 => 문자열을 Object 로 변환하는 것 ( JSON.parse )
Intl 객체
: 각 언어에 맞는 문자, 숫자, 시간, 날짜 비교를 제공하는 국제화 API를 위한 namespace
: DateTimeFormat 생성자 함수 => 언어에 맞는 날짜, 시간 서식을 적용하기 위한 객체
: NumberFormat 생성자 함수 => 언어에 맞는 숫자 서식을 적용하기 위한 객체
프로토타입 기반 언어
객체 지향 프로그래밍
: 객체 라는 기본 단위로 나누고, 이들의 상호작용으로 서술하는 방식
: 클래스 기반 객체 지향 => 자바 , 프로토타입 기반 객체 지향 => 자바스크립트
* 프로토타입 객체
- 객체의 인스턴스를 만드는 부모 객체 개념
- 자바스크립트의 모든 객체는 부모 객체인 프로토타입 객체와 연결
- 부모 객체의 속성과 메서드를 상속 받아 사용 가능
생성자 함수
: 인스턴스 객체 생성 시 사용
: 대문자 함수형 컨벤션
: new 키워드와 함께 호출
: 인스턴스의 부모 객체 == 생성자 함수.prototype
프로토타입 chain
: 객체 속성 참조시, 속성이 없는 경우 프로토타입 체인 동작
=> [[Prototype]] 을 통해서 부모 객체를 탐색
: 모든 객체의 부모는 Object.prototype
: 만약 마지막 부모객체에서까지 속성을 찾지 못할 경우, undefined 반환
class
: class 클래스명 {...}
: class 내에는 메서드만 작성 가능
: 인스턴스 생성 => new 클래스명();
constructor
: 인스턴스가 생성될 때, 호출되는 메서드
: 인스턴스 생성시 전달한 인자를 constructor 메서드의 인자로 받을 수 있다.
: 생략 가능
class Person {
constructor(name) {
console.log(name);
}
}
new Person('joy');
인스턴스 Method
: 클래스 내에 존재하는 메서드
: 메서드 내에서 클래스를 this 로 접근 가능
: 클래스의 인스턴스 속성에도 접근 가능
정적 Method
: 클래스의 인스턴스를 생성하지 않아도 호출할 수 있는 메서드를 정의할 때 사용
: static 키워드 사용
class Person {
constructor(age){
this.age=age;
}
static legCount(){
return 2;
}
}
Person.legCount();
인스턴스 속성
: 클래스 내부에 캡슐화된 변수 == 멤버 변수
: this 에 추가한 속성
: 인스턴스 속성 초기화는 constructor 메서드에서 보통 진행
인스턴스 속성 조회 및 조작
* getter
: 특정 인스턴스 속성을 조회하며 조작하는 메서드
: 무조건 값을 반환
: 사용시, 일반 메서드처럼 호출하지 않고 속성처럼 참조하는 형식으로 사용
*setter
: 특정 인스턴스 속성에 할당하며 조작하는 메서드
: 사용시 일반 메서드처럼 호출하지 않고 속성처럼 할당하는 형식으로 사용
상속(extends)
: 코드의 재사용 관점에서 상속 필요 (부모 - 자식)
: extends 와 super 키워드를 통해 class 에서 상속 구현
: extends => 부모 클래스를 상속 받는, 자식 클래스를 정의할 때 사용
: class 부모 {...}
class 자식 extends 부모 {...}
상속 - super()
: 부모 클래스의 생성자를 호출하게 됨
: 부모 클래스와 공통된 변수를 선언, 초기화시 간결하게 처리 가능
자바스크립트 컨텍스트
scope
: 스코프 == 변수 영역
: 변수가 유효성을 갖는 영역
scope 규칙
1. 정적 영역 규칙 (자바스크립트)
: 어디서 호출하였는지가 아니라, 어디에 선언하였는지에 따라 스코프 결정
2. 동적 영역 규칙
: 어디서 호출하였는지에 따라 스코프 결정
: 런타임 때 결정됨
scope 종류
: 전역 스코프 => 소스 코드 상 모든 곳에서 사용할 수 있는 전역 변수
: file 스코프 => 해당 파일 전체에서 접근 가능, 다른 파일에서 접근 불가능
: 모듈 스코프 => 모듈을 지원하는 프로그래밍 언어에서 모듈 단위 변수 선언 가능
: 함수 레벨 스코프 => 함수가 반환된 이후에는 사용 불가능, 함수 외부에서 유효하지 않음
: 블록 레벨 스코프 => 코드 블록 내에서 유효한 변수( let, const )
🌟 배운 점
오늘은 자바스크립트 입문 강의를 마쳤다. 진짜 강의가 너~무 많아서 듣는데 힘들었다. 처음 들어보는 것이 너무 많고, 내용도 정말 많아서 혼자 복습하는 시간이 꼭 필요할 것 같다. 블로그에 정리해둔 것을 두고 두고 봐야겠다. 그리고 이렇게 이론만 들으면 무슨 역할을 하고, 어떻게 쓰는 것인지 감이 잘 안잡혀서 실습도 꼭 필요할 것 같다.
'데브코스' 카테고리의 다른 글
컴파일 언어 이해하기(2) (1) | 2024.10.26 |
---|---|
컴파일 언어 이해하기 (0) | 2024.10.24 |
자바스크립트 (2) | 2024.10.21 |
랜덤 데이터 생성 API (2) | 2024.10.20 |
Express-generator 구조 (2) | 2024.10.02 |