Front_End [JS기반]/자바스크립트

[ 3D Web : Front_JavaScript ] 자바스크립트 중요 개념 간략 모음집.

안다미로 : Web3 & D.S 2024. 11. 1. 16:01

 

 

 

 

 

[ 3D Web : Front_JavaScript ] 자바스크립트 중요 개념 간략 모음집.

 


∇ 자바스크립트 중요 개념


목  차

1. var, let, const
2. 콜백 함수, Promise와 async-await
3. 스코프(Scope)
4. 클로저(Closure)
5. 호이스팅(Hoisting)
6. 원시 타입과 참조 타입
7. 화살표 함수(Arrow Function)
8. " this " 에 대해서
9. call, apply, bind 메서드
10. 실행 컨텍스트
11. " 동기 " & " 비동기 "
12. ES6에 추가 도입된 문법

 

 

 


 

 

1. var,  let ,  const


 

     § 자바스크립트의 변수는 기본적으로,  '선언'이 이루어지고 나서 '할당'에 의해 '초기화' 됩니다. 

 

     § var , let, const의 차이는 '기본 특징' & '스코프 적용' & '재할당 여부' 라는 키워드로 나눌 수 있음

 

 

          ☆ 기본 특징.

                       ● var

                              ○ 선언 후 초기값이 없을 경우자동으로 undefined로 초기화.

                              ○ 선언 라인 이전변수를 참조해도 에러가 발생하지 않음.

 

                       ● let & const

                              ○ 둘 모두 선언 라인 이전에 변수를 참조할 수 없는 " TDZ ( 일시적 사각지대 ) 구간" 을 가짐.

 

                       ● let

                              ○ 초기화 없이 선언만 하는 것이 가능하지만,  var처럼 특정 값으로 자동 초기화되지는 않음.

 

                       ● const

                              ○ 반드시 선언과 동시에 초기화하지 않으면 에러 발생.

 

 

          ☆ 스코프.

 

                       ● var

                              ○ 함수 레벨 스코프

                              ○ 중괄호가 함수일 때만 스코프로 간주.

 

                       ● let & const

                              ○ 블록 레벨 스코프

                              ○ 함수뿐만 아니라 조건문이나 반복문의 중괄호 등도 스코프로 간주.

                              ○ var보다 제약이 많아서 의도치 않게 변수가 바뀔 부작용이 더 적음.

 

 

          ☆ 재할당 여부.

                       ● var

                              ○ 선언 이후에도 재할당 가능.

 

                       ● let & const

                              ○ 기본적으로 재할당 불가능

                                     = > 상수도 값이 메모리에 저장되기 때문에 변수라고 할 수는 있지만,

                                           상수는 '재할당이 금지' 된 변수

 

                              ○ 원시 값의 경우, 재할당으로만 변경 가능해서,

                                 재할당이 불가능한 const에 할당된 원시 값은 어떠한 방법으로도 변경 불가. !

 

                              ○ 객체 값은 재할당이 아닌 주소 값에 연결된 실제 값을 직접 변경 가능해서

                                      객체 값이 const에 할당되면 실제 값을 바꾸는 방법으로 변경 가능 !

                                    = > const에 저장된 주소 값을 바꾸는 것이 아니기 때문에 

                                              const임에도 값을 바꿀 수 있는 것처럼 보임.

 

         

            ☆☆ 권장되는 사용 방식.

                       ◇ 최대한 const를 사용 ( 재할당 불가, 의도치 않은 변수를 사용하는 경우에서의 부작용을 감소 )

                       ◇ 가끔 재할당이 필요한 경우에만 let 사용

                       ◇ var는 최대한 쓰지 않는다.(버려..)

 


 

2. 콜백 함수, Promise와 async-await


 

       § 콜백 함수

               @ 함수의 인자로 들어가는 함수. ( 함수 속 함수 )

               @ 이벤트, 타이머와 같은 '비동기 로직을 처리' 하기 위해서 사용할 수 있음.

               @ 2~3단계만 중첩되어도 가독성이 급격히 떨어지고, 로직 추가나 에러 처리가 어려워지는 '콜백 지옥' 발생.

 

 

       § Promise

              ○ 콜백 지옥을 해결하고, 비동기 작업을 동기 작업처럼 편하게 처리하기 위해서 ES6에서 도입된 개념.

              ○ new Promise로 객체를 생성하여, resolve, reject 메서드를 자체적으로 받음.

              ○ Promise의 콜백 함수 내부의 비동기 로직이

                           - 성공하면 resolve를 실행하고서 then으로 이동.

                           - 실패하면 reject를 실행하고 catch로 이동.

              ○ then/catch 에서는 이전 작업에서 전달 받은 반환 값을 가지고 이후의 로직을 실행.

                          - 성공/실패 여부와 상관 없이 항상 실행되어야 할 로직은 finally

              ○ 에러가 발생하면, 가장 가까운 catch문으로 처리

 

 

       § async - await

              ○ Promise를 더 가독성 있게 만든 syntactic sugar 문법.

              ○ 기존 then/catch도 가독성이 떨어진다는 생각에서 출발,

                         - 단순히 async - await만 붙이고 try/catch 문을 통해서 더 쉽게 비동기 로직을 실행 가능도록 함.

 

              ○ 사용 방법

                           - 비동기 로직을 포함한 함수 앞에 async 키워드를 붙이고,

                           - 함수 내부의 비동기 로직 앞에 await 키워드를 붙임.

                                      - > 해당 비동기 로직이 완전히 실행되어 반환 값이 나온 후에야, 다음 라인 실행

                                      - > 즉, 비동기 로직을 동기 로직 처럼 실행.

 

 


3. 스코프 ( Scope )


       ○ 변수나 함수와 같은 식별자들의 유효 범위

 

       ○ 자바스크립트 함수는 선언된 위치에 따라서 '상위 스코프'가 정적으로 결정.

                      =  정적 스코프  , 렉시컬 스코프

 

       ○ 자바스크립트 변수는 앞에 붙는 키워드에 따라서 스코프가 달라지게 됩니다.

               ★ var : 함수 레벨 스코프

                                 = > 감싸는 중괄호 {}가 함수일 때만 스코프로 간주

               ★ let & const  : 블록 레벨 스코프

                                 = > 함수 뿐만 아니라 조건문, 반복문 등의 모든 중괄호를 스코프로 간주.

               ★제약 정도 :   블록 레벨 스코프 > 함수 레벨 스코프

                                 = > 의도치 않은 변수 재할당 등의 부작용 방지 가능.

 

       ○ 스코프는 중첩 가능  == > 스코프 체이닝 발생.

 

                ● 내부 함수에서 참조하고자 하는 변수를

                      바깥쪽 스코프로 한 단계씩 넓혀 나가면서 찾아나가는 것

 

                ● 찾고자 하는 값이 함수 스코프 내에 없다면,

                          최종적으로 전역 스코프에서 찾게 됩니다.

 


4. 클로저 ( Closure )


 

          ☆ 개념.

                   ●  외부 함수가 종료되어 소멸된 후에도, 내부 함수가 외부 함수의 지역 변수를 여전히 참조할 수 있는 현상.

                              혹은 그 내부 함수 그 자체.

 

         ☆ 가능한 이유.

                   ●  자바스크립트 함수가 선언될 떄, 자신의 상위 스코프 환경을 기억하고 있기 때문. ( 정적 스코프 )

 

         ☆ 장점.

                   ●  내부 함수에서 참조 가능한 스코프를 제한하여,

                           참조할 값이 예측할 수 없는 위치에서 무방비하게 참조되는 것을 방지할 수 있음.

 


5. 호이스팅( Hoisting )


                ● 자바스크립트가 코드를 실행할 때, 코드 검수 과정을 거치는데 ,

 

                ● 선언문인 식별자들을 먼저 실행하는 과정에서

                    선언문이 선두로 끌어 올려져서 실행되는 것처럼 보이는 현상 ( 실행 순서가 끌어올려진다는 것 )

 

                ● 변수 호이스팅과 함수 호이스팅으로 나뉩니다.

 

 

     ◎ 변수 호이스팅.

             

             ○ var는 호이스팅 후에 초기화되어 있지 않을 경우, " undefined"로 자동 초기화되어서,

                           선언 라인 이전에 있는 변수를 참조해도 에러가 발생하지 않습니다.

                                = > 그러나 이로 인해서 변수가  ' 어디에서나 참조 가능한 "전역 스코프"를 가지게 됩니다 '                                        == > 의도치 않은 변수 재할당과 같은 문제점이 발생 가능

 

                      ●해결법 : ES6에서 let과 const 등장.                                          - let선언 후에 호이스팅 되지만, var처럼 따로 초기화는 이루어지지 않으며,                                          - const반드시 선언과 동시에 초기화를 해야지만, 에러가 발생하지 않습니다.                                          - 둘 다 초기화 이전에는 변수를 참조할 수 없는,  " 일시적 사각지대(TDZ) 구간 "을 가집니다.  

 

 

     ◎ 함수 호이스팅.

                - ' function ' 으로 선언된 함수 선언문에서 발생.

                -  runtime 이전에 함수명과 동일한 이름으로 식별자를 생성하고, 함수 몸체를 할당

                     = > 선언 라인 이전에 함수 호출 가능

                - 참고 : 함수 표현식 ( '변수'에 '함수'를 할당한 형태 ) 은 변수 호이스팅을 따릅니다.

 


6. 원시 타입과 참조 타입.


 

    ◎ 자바스크립트의 7가지 데이터 타입.

              ○ ' string ' &  ' number ' &  ' boolean ' &  ' null ' & ' undefined ' & ' symbol ' & ' 객체 ' 

              ○ 이 중에서 객체를 제외한 모든 타입은 원시 타입.

 

 

    ◎ 원시 타입.

              ○  값에 의한 전달 ( pass by value )

                       = > 변수에 할당된 '메모리에 실제 값이 저장'됨.

              ○ 초기화 이후의 값 변경은,  새로운 메모리 공간을 할당하는 재할당으로만 가능.

 

    ◎ 객체 타입.

            ○ 참조에 의한 전달 ( pass by value )

                        - 변수에 할당된 메모리에 실제 값이 아닌, " 객체의 '주소 값'  " 이 저장됨.
            ○ 원시 값은 불변(immutable) 하기 때문에, 처음에 할당된 값을 직접 변경할 수 없지만,

                       ' 주소 값만 저장하는 참조 값은 변경 가능 '

 

            ○ 최근에는 코드 상의 부작용을 차단하기 위해,  '참조 값도 불변성을 유지시키고자 함.

 

                           ● spread 문법을 ( 객체 dept만큼) 사용하거나, lodash의 deepClone 등의 방법들로

                                "깊은 복사"를 시도하고 있음.

                                [ 깊은 복사 = 객체의 실제 값을 복사 /   얕은 복사 = 객체의 참조값(주소값)을 복사

 

                           ● 깊은 복사를 하게 되면,  "원본 값"과 "복사 값" 중 어느 하나를 수정하더라도 

                                    서로에게 영향을 미치지 않음.

 

                           ● 추가 사항 : mpa, filter와 같은 "고차함수"를 통해 완전히 새로운 배열을 반환하게 할 수 있음.

 

 


 

         

7. 화살표 함수 (Arrow Function)


       ○ 형태적인 특징.

                 - function 키워드를 사용하는 대신, 두꺼운 화살표( =>)를 사용해서 선언.

                 - return 문이 1줄일 때 함수 중괄호와 return문 생략 가능.

let sum = (a, b) => {
	return a + b;
}

// 만일 함수가 단순한 리턴문만 있다면 한줄로 더 심플하게 줄일 수 있다
const sum = (a, b) => a + b;

 

       ○ this 특징.

                 - 호출 시점에 'this'가 가리키는 대상이 결정되는 일반 함수의 동적 바인딩과 달리,

                        "무조건 상위 스코프에 바인딩되는 정적 바인딩"

 

       ○ 익명 함수로만 사용 가능.

                 - 화살표 함수에 이름을 붙여 기명 함수로 쓰고 싶다면,

                       ' 변수에 함수를 할당하는 함수 표현식 형태 ' 로 사용해야 합니다.

 

 

 


8.  " this "에 대해서


     ○ 자바스크립트의 'this'는 동적으로 바인딩 됩니다.

            - > 어떤 환경에서 '호출'되는냐에 따라서 'this'가 가리키는 것이 달라지게 됩니다.

 

     ○ this 바인딩 4가지 방식.

 

            - > 기본 바인딩 : 단독 함수 안에 있는 this의 경우, " 전역 객체 "에 바인딩.

 

            - > 암시적 바인딩 : 객체 내부의 메서드 안에 있는 this는 '해당객체'에 바인딩

 

           - > 명시적 바인딩 : call, apply, bind 등의 메서드를 가지고 this가 가리키는 대상을 개발자가 명시적 지정

 

            - > new 바인딩 : new 키워드를 붙여서 생성된 인스턴스 안에 있는 this의 경우 해당 인스턴스에 바인딩.

 

 


9.   call, apply, bind 메서드


 

         -  셋 다 this를 명시적으로 바인딩하는 메서드.

 

 

         - bind는 this 바인딩 후에 실행은 하지 않기 때문에,  실행을 하려면 뒤에 따로 소괄호를 붙여서 함수 호출 해줘야 함.

 

         - call과 apply는 this를 특정 값과 바인딩한 후에 실행까지 진행.

 

          -  call과 apply의 차이점 :

                       -  call은 인수를 하나씩 컴마로(,) 넘기고

                       -  apply는 배열형태로 한꺼번에 넘김.

 

 


10.   실행 컨텍스트


 

     ※ 정의

 

              - 자바스크립트 코드를 실행하는 데 필요한 환경 정보를 담고 있는 객체.

 

 

 

     ※ 동작 과정.

        

            1. 전역 컨텍스트 생성.

                   - 코드가 실행되면서 '전역 실행 컨텍스트'가 호출 스택에 가장 먼저 쌓임.

                          = > "전역 실행 컨텍스트 " : 전역 스코프에 선언된 변수와 함수를 정의.

 

            2. 함수 컨텍스트 생성.

                   - 함수가 호출되면 해당 함수의 실행 컨텍스트를 생성하여 호출 스택에 쌓음.

                          = > " 함수 실행 컨텍스트 " : 전역 스코프에 선언된 변수와 함수를 정의.

 

            3. 전체 코드 실행 및 컨텍스트 제거.

                   - 콜 스택의 가장 맨 위에 있는 실행 컨텍스트부터 차례대로 호출하여,

                            함수나 메서드를 실행하고 제거.

                   - 맨 아래에 있는 전역 실행 컨텍스트까지 제거되면, 전체 코드의 실행 종료.

 

 

       ※ 특징

 

               1. 평가 단계.

 

                         - 실행 컨텍스트가 생성되고 나서 현재 스코프에서 사용 가능한 식별자들을 등록하는 과정.

                             - > 이때 호이스팅 발생.

                                    (미리 등록된 선언문 식별자들이 코드 실행 시에 선두에 있는 것처럼 동작하는 것) 

 

               2. 실행 단계.

                       - 코드 실행 중에, 식별자들이 참조할 값을 실행 컨텍스트에서 찾아내어 코드 실행.

                       - 코드 실행 과정에서 수정된 참조 값실행 컨텍스트에 다시 등록.

 


 

11.   " 동기 " & " 비동기 "


       

           ○ 동기 방식.

 

                     ● 한 작업이 완료된 후 다른 작업이 시작됨.

                     ● 순서는 보장할 수 있으나, 하나를 하는 동안 다른 걸 할 수 없는 블로킹 현상 발생.

                                 ex:   DB에서 데이터를 조회한 후, 그 결과를 사용하여 다음 작업을 수행하는 경우

                                            = > 데이터 조회가 완료될 때까지 다음 작업 대기

 

 

           ○ 비동기 방식.

 

                     ● 한 작업이 완료 여부와 상관 없이 다른 작업 진행.

                     ● 여러 작업을 동시에 진행할 수 있으나, 작업 순서는 보장할 수 없음.

                                 ex:  서버로부터 데이터를 받아오는 동안 화면 UI의 다른 곳에서 사용자 입력을 받는 것

                                            = > 데이터를 받아오는 것보다 사용자 입력이 먼저 시작될 수 있음.

 


12.   ES6에서 추가 도입된 문법


 

     

1. let, const 키워드

  • var와의 차이: 블록 스코프 / 재선언 불가
  • let은 재할당 가능, const는 재할당 불가
  • 재선언, 재할당 모두 불가능 상수 선언 키워드 const 추가
  • 기존의 var보다 제한이 많아져서 의도치 않은 변수 재선언 및 재할당과 같은 부작용 방지

 

2. Promise

  • 기존에 콜백 함수를 중첩하면 발생하는 콜백 지옥 현상 해결
  • 비동기 로직을 마치 동기처럼 쉽게 작성할 수 있게 됨
  • then/catch 형태 후속 처리 메서드를 통해 로직 추가와 에러 처리를 효과적으로 할 수 있음

 

3. 화살표 함수

  • 함수 정의 시 기존의 function 키워드 대신 두꺼운 화살표(‘⇒’)로 간략하게 선언
  • this 사용이 수월해짐 (무조건 상위 스코프에 바인딩)

 

4. 객체/배열 구조 분해 할당

  • 따로 변수에 담아서 꺼낼 필요 없이 내부 값들을 해체해서 꺼낸 요소들을 바로 사용 가능

 

5. 템플릿 리터럴

  • 백틱(``) 문자열 안에 ${ }로 자바스크립트 변수를 넣어서 동적인 문자열을 가독성 있게 표현 가능