본문 바로가기
개념 정리/모던 자바스크립트 딥다이브

모던 자바스크립트 : 객체리터럴

by 매진2 2023. 10. 20.
728x90

1. 자바스크립트에게 객체란?

  • 자바스크립트 : 객체 기반의 프로그래밍 언어이며 자바스크립트를 구성하는 거의 모든 것이 객체
  • 객체지향 프로그래밍 : 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임
  • 원시값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체
  • 객체 타입은 다양한 타입의 값(원시값 또는 다른 객체)을 하나의 단위로 구성한 복잡한 자료구조
  • 원시타입값 : 변경 불가능한 값, 객체 타입의 값 : 변경 가능한 값

2. 객체란?

a. 객체

  • 프로퍼티와 메서드로 구성된 집합체
  • 0개 이상의 프로퍼티로 구성된 집합, 프로퍼티는 키와 값으로 구성

b. 프로퍼티

  • 프로퍼티 : 객체의 상태를 나타내는 값
  • 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값 가능
  • 자바스크립트의 함수는 일급 객체이므로 값으로 취급 가능 -> 함수도 프로퍼티 값으로 사용 가능
  • 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메서드라고 부름

c. 메서드

  • 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작
  • 객체는 상태와 동작을 하나의 단위로 구조화 할 수 있어 유용함
  • 함수로 객체를 생성하기도 하고 함수자체가 객체이기도 함

3. 객체 리터럴에 의한 객체 생성

a. 자바스크립트는 프로토 타입 기반 객체지향 언어로서 다양한 객체 생성 방법 지원

  • 객체 리터럴
  • Object 생성자 함수
  • 생성자 함수
  • Object.create 메서드
  • 클래스(ES6)

b. 객체 리터럴

  • 가장 일반적이고 간단한 방법 -> 자바스크립트의 유연함과 강력함을 대표하는 객체 생성 방식
  • 중괄호({...}) 내에 0개 이상의 프로퍼티 정의
  • 변수가 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체 생성
  • 중괄호 내에 프로퍼티 정의하지 않으면 빈 객체 생성

  • 객체 리터럴은 값으로 평가되는 표현식 -> 코드블록 ✕ -> 중괄호 뒤에 세미콜론을 붙임
  • 객체리터럴 외 다른 방법은 모두 함수를 사용해 객체 생성

4. 프로퍼티

a. 프로퍼티

객체 : 프로퍼티의 집합, 프로퍼티는 키와 값으로 구성

프로퍼티 나열할 땐 쉼표(,)로 구분, 마지막은 생략 가능

b. 프로퍼티 키에 대해서

프로퍼티 키

  • 프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
  • 프로퍼티 값에 접근할 수 있는 이름으로 식별자 역할

프로퍼티 키를 문자열로? 심벌값으로?

  • 심벌값도 프로퍼티 키로 사용할 수 있지만 일반적으로 문자열 사용
  • 문자열일 경우 : "", '' 로 묶어줘야함
  • 심벌값일 경우 : 식별자 네이밍 규칙을 따라야함

계산된 속성명

  • 문자열, 문자열로 평가되는 표현식을 사용해 프로퍼티 키를 동적 생성 가능
  • 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어줌

프로퍼티 키에 문자열, 심벌 값 외 다른걸 사용하면?

  • 암묵적 타입 변환을 통해 문자열로 변환
  • 숫자 리터럴 사용 시 따옴표가 붙진 않지만 내부적으로 문자열로 변환
  • 예약어를 사용해도 에러가 나지 않지만 예상치 못하므로 지양

프로퍼티 키를 중복 선언하면?

  • 나중에 선언한 프로퍼티로 덮어쓰여짐
  • 에러 없음

c. 프로퍼티 값에 대해서

프로퍼티 값

자바스크립트에서 사용할 수 있는 모든 값

 

메서드

자바스크립트의 함수는 객체(일급 객체) -> 함수는 값으로 취급 가능 ->  프로퍼티 값으로 사용 가능

메서드 : 프로퍼티 값이 함수인 경우 -> 객체에 묶여 있는 함수

5. 프로퍼티 접근

a. 접근 방법

  • 마침표 표기법 : 마침표(.) 프로퍼티 접근 연산자 사용
  • 대괄호 표기법 : 대괄호([...]) 프로퍼티 접근 연산자 사용

b. 대괄호 표기법 

대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함

->따옴표 없으면 식별자로 해석하기때문

숫자 리터럴인경우 따옴표 생략 가능

식별자 네이밍 규칙을 준수하지 않는 경우 대괄호 표기법만 사용 가능

 

c. Node.js 환경과 브라우저 환경에서의 에러 차이

  1. person.last-name 실행할 때 자바스크립트 엔진은 먼저 person.last를 평가
  2. person 객체에는 last인 프로퍼티 키가 없기 때문에 undefinde로 평가
  3. => person.last-name은 undefinde-name과 같음
  4. 자바스크립트 엔진이 name을 프로퍼티 키가 아닌 식별자로 찾음
  5. Node.js 환경에는 name 이라는 선언이 없어서 ReferenceError 발생
  6. 브라우저 환경에는 전역객체 window 프로퍼티에 name이 기본값 문자열로 암묵적으로 존재해  undefinde-name과 같아 NaN

6. 프로퍼티 값 추가, 변경, 삭제

a. 프로퍼티 값 갱신

  • 이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값 갱신

b. 프로퍼티 동적 생성

  • 존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당

c. 프로퍼티 삭제

  • delete 연산자를 통해 객체 프로퍼티 삭제 가능
  • 존재하지 않는 프로퍼티 삭제 시 에러 없이 무시

7. ES6에서 추가된 객체 리터럴의 확장 기능

a. 프로퍼티 축약 표현

  • 프로퍼티 값으로 변수 사요하는 경우, 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키 생략 가능
  • 프로퍼티 키는 변수 이름으로 자동 생성

b. 계산된 속성명

  • 문자열, 문자열로 타입변환할 수 있는 값으로 평가되는 표현식 사용해 프로퍼티 키를 동적으로 생성 가능
  • 계산된 속성명으로 프로퍼티 키 동적 생성하려면 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어야함

c. 메서드 축약 표현

메서드 정의 방법

  • ES5 : 프로퍼티 값으로 함수 할당
  • ES6 : 프로퍼티 값으로 함수 할당할 때 function 키워드 생략한 축약 표현 사용 가능

  • 축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작

 

 

 

모던 자바스크립트 딥다이브 책을 보고 정리한 내용입니다!!
728x90