🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • var
  • 함수레벨 스코프
  • 블록레벨 스코프
  • let vs const
  • 중복선언 해결
  • 마무리
  1. 프론트
  2. Java Script
  3. ES6+

let , const , var

ES6버전에서 등장한 let과 const의 특징에 대해서 알아보는 페이지

var

수업때 사용한 var변수는 ES5에서 사용하던 변수로 다음과 같은 문제점들을 가지고 있다.

  1. 함수 레벨 스코프

  2. 변수명 중복 허용

  3. 호이스팅

이 모든 문제점을 해결하기 위해 ES6버전에서 등장한 변수가 let과 const이다.

함수레벨 스코프

스코프(scope)는 변수의 유효범위를 의미한다. 즉 함수레벨 스코프라 함은 함수단위로 유효한 범위를 가진 변수를 의미한다. 아래 코드를 보자.

function testScope(){
    var foo = 1; // poo, bar는 이 위치까지 끌어올려진다.
    if(foo === 1){
        var poo = 2;
    }
    for(var bar = 3;true;){
        break;
    }
    console.log(foo,poo,bar); // 1, 2, 3     
}

그 후 함수내에서라면 어느위치에서든 사용 가능하기 때문에 var는 함수 스코프를 가지고 있다고 표현한다.

블록레벨 스코프

var 처럼 함수 스코프를 가지고 있는 변수는 프로그래밍을 함에 있어서 혼동을 야기할 수 있다. 그 이유는 대부분의 프로그래밍 언어가 블록레벨 스코프를 가지고 있기 때문이다. 블록레벨 스코프를 가진 변수들은 생성된 블록에서만 유효하기 때문에 실행흐름을 읽기에 더 편하고 메모리 성능도 함수레벨 스코프보다 더 뛰어나다. 따라서 ES6에서는 블록레벨 스코프를 지원하는 let과 const가 추가되었다.

function testScope(){
    const foo = 1; 
    if(foo === 1){
        const poo = 2; // if 블럭 내부에서 생성후 소멸
    }
    for(let bar = 3;true;){ // for 블럭 내부에서 생성후 소멸
        break;
    }
    console.log(foo); // 1
    console.log(poo); // error
    console.log(bar); // error
}
.....
ReferenceError: poo is not defined

let vs const

let과 const는 둘다 블록레벨 스코프를 가진 변수이다. 둘 사이의 차이점은 한번 담아준 값을 바꿀 수 있느냐 없느냐이다.

let은 한번 담아준 값을 자주 바꿔 줘야하는 변수에 사용하는 가변(mutable)변수 키워드 이고

const는 한번 담긴 값이 바뀌면 안되는 변수에 사용하는 불변(immutable)변수 키워드이다.

const a = 1;
a = 2; // error

let b = 1;
b = 2; // ok

중복선언 해결

var 변수는 변수명이 중복되어도 에러를 발생시키지 않고 마지막으로 선언한 변수를 가르킨다.

var a= 1; // a == 1
var a= 2; // a == 2
var a= 3; // a == 3
console.log(a); // 3

위 코드를 단순히 자바스크립트의 유연함으로 치부하고 넘어갈 수도 있지만, 대규모 어플리케이션으로 개발시 이러한 문제점은 치명적으로 다가올 수 있다.

극단적인 예시로 라인수가 100~1000줄정도의 js파일을 관리한다면 변수명을 앞선 코드에서 이미 사용중인지 아닌지 충분히 파악이 가능하겠지만 10000~100000줄의 코드를 관리해야 한다면 해당 js파일에 변수가 뭐가 있는지 조차 파악하기 힘들 것이다.

따라서 이러한 문제를 해결해주는 let과 const를 사용하는게 좋다.

// 개발자 KH수달이 작성한 코드
var testScope = function(){
...
}

// 개발자 KH짱구가 작성한코드
var testScope = function(){
...
}
testScope(); // 정상
// 변수명이 중복되어도 에러를 발생시키지 않기 때문에 추후 비지니스 로직에서 문제가 발생할 수 있음

// 개발자 KH수달이 작성한 코드
const testScope = function(){
...
}

// 개발자 KH짱구가 작성한코드
const testScope = function(){ // 선언불가.
...
}
testScope(); 

// 출력결과
SyntaxError: Identifier 'testScope' has already been declared

마무리

그 밖에도 선언된 위치보다 더 높은 곳으로 끌어 올려지는 호이스팅 기능도 let과 const에는 적용이 안된다. 이는 코드의 흐름을 읽기 쉽게 만들어 유지보수를 용이하게 만들어 준다.

결론은

변수의 중복선언을 피하기 위해서 변수는 var 가 아닌 let,const 둘 중 하나만 사용하도록 하고

그중에서도 값이 바뀌면 안되는 핵심 함수나 값들은 전부 const를 사용하여 받아주고,

그 밖에 값이 바뀌어야 하는 경우는 let을 사용하도록 하자.

PreviousNode.js로 자바스크립트 실행NextDestructuring문법

Last updated 10 months ago

위처럼 변수가 이상한 방식으로 동작하는 이유는 호이스팅과 관련이 있다. var 변수는 에 의해 test과정에서 함수 최상단 으로 끌어올려 진다.

Execution Context