개념 정리/모던 자바스크립트 딥다이브

모던 자바스크립트 : 자바스크립트, 변수, 표현식과 문

매진2 2023. 10. 12. 10:49
728x90

1. 프로그래밍

1-1. 프로그래밍이란?

  • 목적 : 요구사항 실현(문제 해결)
  • 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션

1-2. 프로그래밍 언어란?

  • 컴퓨터와 대화(명령에 사용되는 일종의 표현수단
  • 사람과 컴퓨터(컴파일러, 인터프리터) 모두가 이해할 수 있는 약속된 형태의 인공어
  • 구문(syntex)과 의미(sementics)의 조합으로 표현

1-3. 구문과 의미

  • 프로그래밍 언어가 제공하는 문법을 적절히 사용하여 변수를 통해 값을 저장하고 참조하며
  • 연산자로 값을 연산, 평가하고
  • 조건문과 반복문에 의한 흐름제어로 코드의 실행순서를 제어하고
  • 함수로 재사용 가능한 문의 집합을 만들며 객체, 배열 등으로 자료 구조화

⇒ 프로그래밍은 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 후, 그 흐름을 제어하는 것

 

2. 자바스크립트

2-1. 자바스크립트의 성장

자바스크립트의 탄생

넷스케이프 커뮤니케이션즈에서 웹페이지의 보조적인 기능을 수행하기 위해 만들어낸 브라우저에서 동작하는 경량 프로그래밍 언어로 자바스크립트 출시

 

표준화하게 된 과정

자바스크립트 이후 마이크로소프트에서 JScript를 출시

→ 서로 자사 브라우저에서만 동작하는 기능을 경쟁적으로 추가

→브라우저에 따라 웹페이지가 정상적으로 동작하지 않는 크로스 브라우징 이슈 발생

→ 자바스크립트의 표준화 요청 후 ECMAScript로 초판 출시

버전 출시 연도 특징
ES1 1997 초판
ES2 1998 ISO/IEC 16262 국제 표준과 동일한 규격을 적용
ES3 1998 정규 표현식, try...catch
ES5 2009 HTML5와 함께 출현한 표준안.JSON, strict mode, 접근자 프로퍼티, 프로퍼티 어트리뷰트 제어,향상된 배열 조작 기능(forEach, map, filter, reduce, some, every)
ES6(ECMAScript2015) 2015 let/const, class, 화살표 함수, 템플릿 리터럴, 비구조화 할당, 스프레드 문법, rest 파라미터, 심벌, 프로미스, Map/Set, 이터러블, for...of, 제너레이터, Proxy, 모듈 import/export
ES7(ECMAScript2016) 2016 지수(**)연산자, Array.prototype.inclueds, String.prototype.inclueds
ES8
(ECMAScript2017)
2017 async/await, Object 정적 메서드(Object.values, Object.entries, Object.getOwnPropertyDescriptors)
ES9(ECMAScript2018) 2018 Object rest/spread 프로퍼티, Promise.prototype.finally, async generator, for await...of
ES10(ECMAScript2019) 2019 Object.fromEntries, Array.prototype.flat, Array.prototype.flatMap, optional catch binding
ES11(ECMAScript2020) 2020 String.prototype.matchAll, BigInt, globalThis, Promise.AllSettled, null 병합 연산자, 옵셔널 체이닝 연산자, for...in enumeration order

 

자바스크립트의 초창기 

- 웹페이지의 보조적 기능 수행

- 대부분의 로직은 주로 웹서버, 브라우저는 서버로부터 전달받은 HTML, CSS 단순히 렌더링 하는 수준

 

**렌더링

- HTML,CSS 자바스크립트로 작성된 문서를 해석해 브라우저에 시각적으로 출력

- 떄로는 서버에서 데이터를 HTML로 변환해 브라우저에게 전달하는 과정(SSR)

 

Ajax (Asynchronous Javascript and XML) =XMLHttpRequest

Ajax 이전

  • html 태그로 시작해 html태그로 끝나는 완전한 HTML 코드를 서버로부터 다시 전송받아 웹페이지 전체 렌더링
  • 변경항 필요 없는 부분까지 포함된 HTML 코드를 서버로부터 다시 전송받기 떄문에 불필요한 데이터 동신 발생, 변경할 필요 없는 부분도 처음부터 다시 렌더링 해야해서 성능 떨어짐
  • 이로인해 화면 전환됨면 화면이 순간적으로 감박이는 현상 ㅇ

Ajax 이후

  • 자바스크립트를 이용해 서버와 브라우저가 비동기 방식으로 데이터 교환할 수 있는 통신 기능
  • 웹페이지에서 변경할 필요 없는 부분은 다시 렌더링하지 않고 서버로부터 필요한 데이터만 전송받아 변경해야하는 부분만 한정적으로 렌더링하는 방식
  • 웹브라우저에서도 데스크톱 애플리케이션과 유사한 빠른 성능과 부드러운 화면 전환 가능

jQuery

- DOM (document object model)을 더욱 쉽게 제어, 크로스 브라우징 이슈 ↓

 

V8 자바스크립트 엔진

- 빠르게 동작하는 자바스크립트 엔진 → 웹 서버에서 수행되던 로직들이 대거 클라이언트(브라우저)로 이동

 

Node.js

- 구글 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경

- 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크리븥를 브라우저 이외의 환경에서도 동작할 수 있도록 자바스크립트 엔진을 브라우저에서 독립시킨 자바스크립트 실행 환경

- 다양한 플랫폼에 적용할 수 있지만 서버사이드 애플리케이션 개발에 주로 사용

- 필요한 모듈, 파일 시스템, HTTP 등 빌트인 API 제공

- 비동기 I/O를 지원, 싱글 스테드 이벤트 루프 기반으로 동작 → 요청 처리 성능 ↑

- 데이터 실시간 처리하기 위해 I/O가 빈번하게 발생하는 SPA에 적합, 하지만 CPU 사용률 높은 애플리케이션은 권장 ✕

 

⇒ Node.js의 등장으로 자바스크립트는 브라우저 벗어나 서버사이드 애플리케이션 개발에서도 사용할 수 있는 범용 프로그래밍 언어가 됨

 

SPA 프레임워크

높은 성능과 사용자경험, 개발규모와 복잡도 상승

→ 변경에 유연하면서 확장하기 쉬운 애플리케이션 아키텍처 구축 어려움

→ CAD (component based development)방법론을 기반으로 하는 SPA 대중화되면서 앵귤러, 뷰, 리액트, svelte …등장

 

2-2. 자바스크립트와 ECMAScript

ECMAScript

- 자바스크립트의 표준사양인 ECMA-262

- 프로그래밍 언어의 값, 타입, 객체, 프로퍼티, 함수, 표준 빌트인 객체 등 핵심 문법 규정

 

자바스크립트

- ECMAScript와 브라우저가 별도 지원하는 클라이언트 사이드 Web API(DOM, BOM, Canvas, XMLHttpRequest, fetch, requextAnimationFrame, SVG, Web Storage, Web Component, Web Worker 등 )를 아우르는 개념

2-3. 자바스크립트 특징

- HTML, CSS와 함께 웹 구성하는 요소 중 하나

- 개발자가 별도의 컴파일 작업을 수행하지 않는 인터프리터 언어

- 멀티 패러다임 프로그래밍 언어 ← 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍 지원

 

4. 변수

4-1. 변수란?

  • 프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고 저장된 값을 읽어 들여 재사용하기 위해 변수라는 메커니즘 제공
  • 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행
  • 따라서 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요 없이 변수를 통해 안전하게 값 접근
result = 10+20 

// result = 변수명
// 30 = 변수 값

변수란?

  • 프로그래밍 언어에서 데이터를 관리하기 위한 핵심 개념
  • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
  • 프로그래밍 언어에서 값을 저장하고 참조하는 매커니즘
  • 값의 위치를 가리키는 상징적인 이름
  • 할당,대입,저장 assignment : 변수에 값을 저장하는 것
  • 참조 reerence : 변수에 저장된 값을 읽어 들이는 것

식별자 (identifier) 란?

  • 어떤값을 구별해서 식별할 수 있는 고유한 이름 === 변수, 함수, 클래스 등의 이름은 모두 식별자
  • 메모리 공간에 저장되어있는 어떤 값을 구별해서 식별해낼 수 있어야한다 ←이를 위해 식별자는 어떤 값이 저장되어있는 메모리 주소 기억
  • 값이 저장되어있는 메모리 주소와 매핑 관계를 맺으며 이 매핑 정보도 메모리에 저장되어야한다
  • 값이 아니라 메모리 주소를 기억하고 있다 ⇒ 메모리 주소에 붙인 이름

 

4-2. 변수 선언

변수 선언

값을 저장하기 위한 메모리 공간 확보, 변수이름과 확보된 메모리 공간의 주소 연결해서 값 저장하게 준비하라는 것

ex) var, let, const

 

let과 const를 사용하는 추세

var의 경우 블록 레벨 스코프를 지원하지 않고 함수 레벨 스코프 지원 → 의도치않게 전역 변수 선언되어 부작용 발생해서 

 

변수를 사용하려면 무조건 선언 필요

선언하지 않고 변수 참조하면 이전에 다른 애플리케이션이 사용했던 값이 남아 쓰레기 값이 나올 수 있음

=>ReferenceError(참조 에러) 발생 : 식별자 통해 값 참조하려하면 자바스크립트 엔진이 등록된 식별자 찾을 수 없다는 에러

 

변수선언 단계 (선언단계와 초기화 단계가 동시에 이뤄짐)

1. 선언 단계 : 변수 이름 등록해서 자바스크립트 엔진에 변수 존재 알림

2. 초기화 단계 : 값 저장하기 위한 메모리 공간 확보하고 암묵적으로 undefined 할당해 초기화

**초기화 : 변수가 선언된 이후 최초로 값을 할당하는 것

 

변수 선언의 실행시점

변수 선언이 소스코드가 한줄씩 순차적으로 실행되는 시점, 런타임이 아니라 그 전 단계에서 먼저 실행되기때문에 참조 에러 발생

 

호이스팅

변수 선언문이 코드의 선두로 끌어 올려진것처럼 동작하는 자바스크립트 고유의 특징

변수 선언과 값의 할당 실행시점이 다름

var score; //변수 선언은 런타임 이전에 먼저 실행
score =80; //값의 할당은 런타임에 실행되면서 undefined가 80으로 재할당됨
           //재할당마다 새로운 메모리 공간에 저장함

 

값의 할당과 재할당

할당

변수에 값을 주는 것

값은 연산이 끝난후 각 메모리에 저장 되지만 cpu가 연산해서 만들어낸 숫자를 재사용 ✕

-> 연산결과가 저장된 메모리에 직접 접근하는 것은 올바른 방법이 아니고 시스템을 멈추게 하는 오류 발생

 

재할당

이미 값이 할당되어 있는 변수에 새로운 값을 다시 할당하는 것

새로운 메모리를 만들어내 그곳에 값을 저장

 

**가비지 콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더이상 사용되지 않는 메모리를 해제하는 기능, 메모리 누수 방지

4-3. 식별자 네이밍 규칙

  • 식별자는 특수문자 제외한 문자, 숫자, 언더스코어(_), 달러기호($) 포함 가능
  • 특수문자 제외한 문자, 언더스코어(_), 달러기호($) 로 시작, 숫자 시작 안됨
  • 예약어는 식별자로 사용할 수 없음
  • 여러개 한번에 선언 가능
  • 대소문자 구분
  • 네이밍컨벤션 : 카멜케이스, 스네이크 케이스, 파스칼 케이스, 헝가리언 케이스

 

5. 표현식과 문

5-1 값과 리터럴

값 value

표현식이 평가 되어 생성된 결과

값을 생성하는 가장 기본적인 방법은 리터럴을 사용하는 것

 

**평가 : 식을 해석해서 값을 생성하거나 참조하는 것

 

리터럴literal

사람이 이행할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법

 

5-2 표현식

표현식이란?

값으로 평가될 수 있는 문

표현식은 문의 일부일 수있고 그 자체로 문이 될 수도 있음

표현식이 평가되면 새로운 값을 생성하거나 기존값을 참조

 

표현식 구별 방법

변수에 할당해보는 것 -> 할당이 안되면 표현식이 아닌 문

 

5-3. 문

문이란?

문의 집합으로 이뤄진 것이 프로그램, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍

문은 명령문이라고도 부른다 문은 컴퓨터에 내리는 명령

ex) 선언문, 할당문, 조건문, 반복문

 

토큰이란?

토큰 : 문법적으로 더이상 나눌수 없는 코드의 기본요소

ex) 키워드, 식별자, 연산자, 리터럴, 세미콜론, 마침표 등의 특수 기호

 

세미콜론

문의 종료를 나타냄

이프문, 포문, 함수 등의 코드 블록 뒤에는 세미콜론 ✕ → 언제나 문의 종료를 의미하는 자체 종결성을 갖기 떄문

728x90