[멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 4

2025. 6. 12. 21:38·멋쟁이사자처럼/JavaScript

JavaScript 기초 정리 - 스코프, 모듈, 객체, 조건문, 객체 비교

오늘 수업에서는 JavaScript의 스코프(Scope), 모듈 스코프, 객체(Object)의 구조와 활용,
그리고 조건문, 객체 비교 방식에 대해 배웠다!


스코프

| 블록 스코프 예제

// 전역
let scope = '전역'

{
  let scope1 = '지역'

  {
    let scope2 = '중첩된 지역'
    console.log(1, scope2) // ✅ '중첩된 지역'
  }

  console.log(2, scope1) // ✅ '지역'
}

console.log(3, scope) // ✅ '전역'

 

라인 코드 설명
2 let scope = '전역' 전역 스코프. 어떤 블록이나 함수 밖에 있으므로 어디서든 접근 가능
5~7 let scope1 = '지역' 첫 번째 블록 내부에만 존재. 블록 밖에서는 접근 불가
8~10 let scope2 = '중첩된 지역' 중첩 블록 내부에만 존재
10 console.log(1, scope2) 현재 블록 안이므로 '중첩된 지역' 출력
13 console.log(2, scope1) scope1은 같은 바깥 블록에 있으므로 '지역' 출력
16 console.log(3, scope) 전역에 선언된 변수이므로 '전역' 출력

 

👉 핵심 포인트: let, const는 블록 스코프를 가지므로 선언된 블록 안에서만 유효하다.

 

| 함수 스코프 예제

let name = '전역'
let nickname = '레이'

function 함수() {
  let name = '함수'

  function 중첩된함수() {
    let name = '중첩된 함수'

    console.log(1, name)      // ✅ '중첩된 함수'
    console.log(1, nickname)  // ✅ '레이'
  }

  중첩된함수()

  console.log(2, name)        // ✅ '함수'
}

함수()
console.log(3, name)          // ✅ '전역'

 

라인 코드 설명
1~2 let name, let nickname 전역 스코프
4 function 함수() 함수 스코프 생성
5 let name = '함수' 함수 안에서만 유효한 지역 변수
7 function 중첩된함수() 또 하나의 함수 스코프 생성
8 let name = '중첩된 함수' 이 안에서만 유효
10 console.log(1, name) 가장 가까운 name = '중첩된 함수'
11 console.log(1, nickname) nickname은 전역에서 찾음
14 console.log(2, name) 중첩된 함수 바깥에 있는 '함수' 출력
18 console.log(3, name) 최상단 전역 name인 '전역' 출력

 

👉 핵심 포인트: 함수는 자신만의 지역 스코프를 가지고, 안쪽 함수는 바깥 함수나 전역의 변수도 접근 가능하지만, 바깥은 안쪽 변수에 접근할 수 없다.

| 요약 비교

 

항목 블록 스코프 ({}) 함수 스코프 (function)
적용 대상 let, const var, 함수 내부 전체
바깥에서 접근 ❌ 불가능 ❌ 내부 변수 접근 불가
중첩 접근 ✅ 안쪽은 바깥 참조 가능 ✅ 내부는 외부 참조 가능
전역 변수 접근 ✅ 가능 ✅ 가능

모듈

| 기본 스크립트(type="module" 없이 작성된 스크립트)

  • 파일 안에서 선언된 전역 변수는 전역 객체(window)에 등록된다.
  • 따라서 다른 스크립트나 콘솔 등에서 접근이 가능하다.

| type="module"을 사용한 스크립트

  • 해당 JS 파일은 모듈 스코프를 가지게 된다.
  • 따라서 파일 내부의 전역 변수는 전역 객체(window)에 등록되지 않고 외부에서 접근할 수 없다.

즉, 일반 스크립트는 전역 변수 → window.변수명 으로 접근 가능하지만,
모듈 스크립트는 자체 스코프 안에서만 유효하다.

 


객체 (Object)

변수가 기억할 수 있는 데이터 타입은 아래의 두 가지 뿐.

  • 기본(Primitive, 원시) 데이터 타입
  • 객체(Object) 데이터 타입

| 객체란?

  • 키(key)-값(value) 쌍을 포함하는 데이터
  • 중괄호 {} 안에 쉼표로 구분하여 작성
// 객체 생성자(Constructor)를 사용해 객체 생성
const 우유 = new Object();
우유.이름 = '저지방 우유';
우유.브랜드 = '서울 우유';
우유.용량 = '1000ml';

// 객체 리터럴을 사용해 객체 정의 (쉬운 방법)
const 커피 = {
  용량: '600ml',
  브랜드: '스타벅스',
  이름: '아메리카노',
};

 

객체와 유사한 구조

  • HTML <dl> 설명 목록
  • CSS 스타일 블록

 

나의 노트북을 객체로 만들어 보자!

const labtop = {
  장치_이름: 'JYEON',
  프로세서: 'Intel(R) Core(TM) Ultra 5 125H   3.60 GHz',
  설치된_RAM: '16.0GB(15.6GB 사용 가능)',
  시스템_종류: '64비트 운영 체제, x64 기반 프로세서',
  펜_및_터치: '펜과 10개 터치 포인트 지원',
};

 

| 객체에 포함 가능한 값

  • JavaScript에서 유효한 모든 값 포함할 수 o
const anObject = {
  string: '객체란는 모든 값을 포함할 수 있습니다.',
  number: 2025,
  boolean: true,
  anotherObject: {},
  aFunction: function() {},
  anArray: [],
}

 

| 객체 속성 값 읽기

  • 점 표기법: album.key
  • 대괄호 표기법: album['key']

JavaScript의 속성은 “property"라고 하며, 객체의 key이다.
반면, HTML의 속성은 “attribute”라고 하며, 태그에 정의된 고정된 값이다.

 

  • 대괄호 표기법 사용이 필요한 경우② 변수로 속성을 읽어야 할 경우
  • ① 속성 이름이 따옴표로 묶인 경우 (유효하지 않은 속성 이름은 따옴표로 묶어야 한다.)
// 변수 이름 작성 규칙을 따르지 않는 객체의 속성 이름일 경우
const example = {
'유효하지 않은 속성 이름' : 'value'
}
console.log(example['유효하지 않은 속성 이름']) // value

// 변수를 통해 속성을 읽어야 할 경우
const macbookPro= {
macOS : '2.4 GHz 8코어 Intel Core i9',
}
let propertyName = 'macOS'
console.log(macbookPro[propertyName]) // '2.4 GHz 8코어 Intel Core i9'

 

| 객체 속성 값 쓰기

album.key = '앨범명'
album['key'] = '앨범명'

 

| 객체 속성 삭제

delete album.key
delete album['key']

 

| 객체의 메서드

  • 객체의 속성 중 함수를 값으로 포함하는 속성을 메서드라고 부름
  • 호출 방법: album.method() 또는 album['method']()
  • 메서드에 매개변수 전달 가능

 

| 함수의 타입은?

  • 객체 타입(Object Type)이다!!
  • 객체 타입이기에 객체처럼 속성을 가질 수도 있다.

 

| 함수는 값으로 취급

  • 함수가 값처럼 취급되는 성질: 일급 객체(First-class Object)
  • 함수를 인수로 받거나 반환하는 함수: 고차 함수(Higher-order Function)

결국 함수는 값으로 취급 되고, 인수로 함수를 전달할 수 있다는 이야기다
+ 함수에서 함수를 반환할 수도 있다.

 


조건문 - if…else

  • 특정 상황에서 프로그램의 작동을 조건부로 제어
// 예시
let isActive= true
if (isActive) {
  console.log('활성화 상태입니다.');
} else {
  console.log('비활성화 상태입니다.');
}

// 활성화 상태입니다.

 

| 참, 거짓 평가

  • 모든 조건은 표현식이므로 참(Truthy) 또는 거짓(Falsey)인지 평가한다.

값이 거짓으로 평가되는 것들

  • false (boolean)
  • 0 (number)
  • ''(빈 문자열)
  • null
  • undefined
  • NaN (숫자 + undefined)

 

불리언 타입 변경

  • 값이 거짓으로 평가되는 것들을 제외한 나머지 값은 모두 참으로 평가된다.



 

자동 타입 변경

  • 조건문 내부에서 평가되는 표현식은 자동으로 불리언(Boolean) 타입으로 변경된다.
if (10 - 11) {
  console.log('조건이 참이다.');
} else {
  console.log('조건이 거짓이다.');
}

 

| 비교 연산자

  • 숫자 비교에 사용: >, ≥, <, ≤
  • 각 항을 비교하거나 같거나 다른지 평가에 사용: ==, ===, ≠, ≠=

느슨한 vs 엄격한 비교

1. 느슨한 비교

  • ==, !=
  • 변수의 할당된 값의 타입이 유동적으로 변경될 수 있다.
  • 따라서 타입이 다른 두 값을 비교할 때, JavaScript가 타입을 자동 변환해서 비교하기 때문에 예측과는 다른 평가가 될 수 있다.

모든 타입을 숫자로 자동 변환 시도한다.

 

 

2. 엄격한 비교

  • ===, !==
  • 엄격한 비교를 수행할 때, 두 가지 사항을 확인한다.
    • 변수에 할당된 값의 타입
    • 변수 값
  • JavaScript가 타입을 자동 변환하지 않기 때문에 예측한 대로 평가된다.

| else if 문

  • 조건이 여럿인 경우에는 if, else 외에도 else if문을 사용해 비교하여 처리

 


객체 비교

| 동치 vs 동등 연산자

  • 객체 타입의 비교는 기본 타입의 비교 처리와 다르다.
연산자 비교 방식  의미
=== 엄격한 동치 값과 타입이 모두 같아야 true
== 느슨한 동등 값만 같으면 true (타입 자동 변환)

객체끼리는 ===나 == 모두 참조가 다르면 false!

 

| 객체는 참조로 비교된다.

⇒ “고유 식별자”가 생기는데, 이를 “객체 참조(Object Reference)”라고 한다.

(like 신분증)

  • 객체는 값이 아니라 참조(메모리 주소) 를 비교한다.
  • 아무리 모양이 같아도 참조가 다르면 다른 객체이다.
  • 같은 참조를 가리킬 때만 === 결과가 true

 

| 메모리와 객체

타입 종류 저장 위치 비교 방식
기본(원시) 타입 스택(Stack) 값 자체를 비교
객체(참조) 타입 힙(Heap) 참조(주소)를 비교

 

기본 타입의 값은 = 를 하면 값이 복사된다.
그런데 객체 타입은 값이 복사되는 것이 아니라 참조가 복사된다.
따라서 객체 타입은 값이 비교되는 것이 아니라, 참조가 비교되는 것이다.

 

| 객체 속성·값이 같은지 확인하려면?

  • ===로는 비교 불가 (참조만 비교)
  • 모든 속성과 값을 하나씩 비교해야 함
  • 이를 위해 반복문(루프) 사용해야 한다. → 이건 다음번에 학습!

오늘의 느낀 점 !

오늘 배운 스코프, 모듈, 객체, 조건문, 객체 비교에서 몇 가지는 익숙한 개념들이라 부담 없이 받아들일 수 있었다.

그런데, '일급 객체'라거나 '고차 함수' 같은 용어는 처음 들어봐서 조금 낯설었…지만,

결국 이 용어들이 말하고자 하는 건 결국 함수도 값이다! 라는 개념이라 이해할 수 있었다.

그리고 객체 참조랑 메모리 구조에 관해서 설명을 들을 때는

"아.. 전공 수업 때 배운 내용이네..." 싶은 순간이 있었는데, 그걸 거의 다 까먹은 나 자신이 살짝 미울 뻔했다...^_^

그만큼 더 공부해서 잊어버린 것들을 되찾아야겠다는 다짐을 해본다 💪

 

'멋쟁이사자처럼 > JavaScript' 카테고리의 다른 글

[멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 2  (2) 2025.06.11
[멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 1  (0) 2025.06.11
'멋쟁이사자처럼/JavaScript' 카테고리의 다른 글
  • [멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 2
  • [멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 1
JeonLay
JeonLay
하면 된다, 안되는 건 없다!
  • JeonLay
    개발자의 작은 실험실🧪
    JeonLay
  • 전체
    오늘
    어제
    • Today I Learned (20)
      • QA (1)
      • Front-end (1)
      • 멋쟁이사자처럼 (16)
        • 웹 표준 (1)
        • Markdown (1)
        • HTML (2)
        • CSS (1)
        • JavaScript (3)
        • Emmet (1)
        • CLI (1)
        • Git | Github (4)
        • NPM | live-server (1)
        • Node.js (1)
      • 코딩테스트 (1)
  • 최근 글

  • 인기 글

  • 태그

    javascript
    부트캠프
    문서 계층 구조
    rm --cached
    프론트엔드
    frontend
    systaxprofiles
    공부
    git
    CSS
    마크다운 문법 정리
    CodeSignal
    웹 표준 기술
    웹 접근성
    버그트래킹시스템
    함수
    멋쟁이사자처럼후기
    javascript의 역사
    outline algorithm
    javascript 엔진
    멋사
    멋쟁이사자처럼
    headings map
    자바스크립트
    Web
    javascript 실행 환경
    화살표 함수 표현식
    14기
    멋쟁이사자처럼후기자 #자바스크립트
    HTML
  • hELLO· Designed By정상우.v4.10.3
JeonLay
[멋사 프론트엔드 부트캠프 14기] Learn JavaScript | Day 4
상단으로

티스토리툴바