배워서 남주는 개발자 :)

JS

[ JS 딥다이브 ] 7주차 : 객체 리터럴

핏짜보이 2023. 3. 10. 23:06
반응형

1. 객체란

JS는 객체 기반의 프로그래밍 언어이다.

원시값을 제외한 나머지 값(함수, 배열, 정규식 등)은 모두 객체다.

원시 타입은 하나의 값만 나타내지만, 객체는 다양한 타입의 값(원시 값 또는 다른 객체)을 하나의 단위로 구성한 복합적인 자료구조이다.

또한 원시 값은 변경이 불가능하지만, 객체는 변경이 가능하다.

 

➡️ 객체는 0개 이상의 프로퍼티로 구성된 집합이고, 프로퍼티는 key - value로 구성되어 있다.

let person = {
  firstName: 'Jason',  // <- 프로퍼티
  lastName: 'Kim',  
  age: '20'            // age: key, 20: value 
}

JS에서 사용가능한 모든 값은 value가 될 수 있다.

JS의 함수는 1급 객체이기 때문에, 값으로 취급할 수 있다. 👉🏾 따라서 함수도 value로 사용할 수 있다.

*(프로퍼티의 value가 함수일 경우, 일반 함수와 구분하기 위해서 매서드라고 부른다.)

let calculator = {
  defaultNum: 0,                 // 프로퍼티
  calcSum: function(a, b) {      // 메서드
    a + b;
}

이처럼 객체는 프로퍼티와 메서드로 구성되어 있다.

⚫️ 프로퍼티 : 객체의 상태를 나타내는 (Data)

⚫️ 매서드 : 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(Behavior)

 

➡️이처럼 객체는 프로퍼티매서드를 포함할 수 있기 때문에 상태동작을 하나의 단위로 구조화할 수 있다는 점에서 유용하다.

 

 

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

C++나 자바 같이 클래스기반객체 지향 언어클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 객체를 생성한다.

(*인스턴스 : 클래스에 의해 생성되어 메모리에 저장된 실체)

 

JS프로토타입기반객체 지향 언어로서 클래스기반객체 지향 언어와 다르게 다양하게 객체를 생성하는 방법을 지원한다.

1) 객체 리터럴

2) Object 생성자 함수

3) 생성자 함수

4) Object.create 메서드

5) 클래스

 

이중에서 가장 일반적이고 간단한 방법은 객체 리터럴을 사용하는 방법이다.

객체 리터럴은 중괄호({}) 내에 0개 이상의 프로퍼티를 정의한다.

변수에 할당되는 시점에 JS엔진은 객체 리터럴을 해석해 객체를 생성한다.

let person = {
  lastName: 'kim',
  sayHi: function() {
    console.log(`Hello! My name is ${this.name}.`)
    }
  }
  
  console.log(typeof person) // object
  console.log(person) // {name: 'kim', sayHi: f}

 

 

 

 

3. 프로퍼티

객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.

let person = {
  name: 'kim',  // key: name, value: 'kim'
  age: 20       // key: age, value: 20
}

⚫️ 프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값

⚫️ 프로퍼티 값 : JS에서 사용할 수 있는 모든 값

 

프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할을 한다.

심벌 값도 프로퍼티 키로 사용할 수 있지만 일반적으로 문자열을 사용한다.

이때 프로퍼티 키는 문자열이므로 따옴표로 묶어야 한다. 

 

‼️ 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.

이때 에러가 발생하지 않는다는 점을 주의해야한다.

let dog = {
  age: 10,
  age: 15
}

console.log(dog) // {age: 15}

 

 

4. 메서드

프로퍼티의 value가 함수일 경우, 일반 함수와 구분하기 위해서 매서드라고 부른다.

즉, 메서드는 객체이 묶여있는 함수를 의미한다.

 

 

5. 프로퍼티 접근

프로퍼티에 접근하는 방법은 2가지 이다.

  1) 마침표 프로퍼티 접근 연산자(.)를 사용하는 마침표 표기법

  2) 대괄호 프로퍼티 접근 연산자([...])를 사용하는 대괄호 표기법

let person = {
  name: 'Kim'
}

// 마침표 표기법에 의한 프로퍼티 접근
console.log(person.name)        // Kim

// 대괄호 표기법에 의한 프로퍼티 접근
// 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함
// 감싸지 않으면 JS엔진은 식별자로 인식함
console.log(person['name'])     // Kim


let nextPerson = {
  name: 'Lee'
}

console.log(person[name])     // ReferenceError: name is not defined
                             // 대괄호 연산자 내의 따옴표로 감싸지 않은 식별자 name을 평가하기 위해 
                             // 선언된 name을 찾았지만 찾지 못했기 때문에 에러 발생함

‼️객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환한다.

이때 ReferenceError가 발생하지 않는데 주의해야 한다.

 

 

 

6. 프로퍼티 값 갱신

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

let person = {
  name: 'kim'
}

person.name = 'Lee'

console.log(person.name)      // {name: 'Lee'}

 

 

7. 프로퍼티 동적 생성

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

let person = {
  name: 'Kim'
}

// person 객체에는 age 프로퍼티가 존재하지 않는다.
// 따라서 person 객체에 age 프로퍼티가 동적으로 생성되고 값이 할당된다.
person.age = 20

console.log(person)  // {name: 'Kim', age: 20}

 

 

8. 프로퍼티 삭제

delete 연산자는 객체의 프로퍼티를 삭제한다. 

이때 delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다.

만약 존재하지 않는 프로퍼티를 삭제하면 아무런 에러 없이 무시된다.

let person = {
  name: 'Kim'
}

// 프로퍼티 동적 생성
person.age = 20

// person 객체에 age 프로퍼티가 존재함
// 따라서 delete 연산자로 age 프로퍼티 삭제 가능
delete person.age

// person 객체에 weight 프로퍼티가 존재하지 않음
// 따라서 delete 연산자로 weight 프로퍼티 삭제 불가능. 하지만 에러가 발생하지 않음
delete person.weight

console.log(person)   // {name: 'Kim'}

 

 

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

ES6에서는 객체 리터럴의 확장 기능을 제공한다.

 1) 프로퍼티 축약 표현 : 키와 값이 동일하면 축약 가능

const a = 1
const b = 2

// ES5
let obj1 = {
  a: a,
  b: b,
}

// ES6
let obj2 = {a, b}

console.log(obj1)    // {x: 1, y: 2}
console.log(obj2)    // {x: 1, y: 2}

 

 2) 계산된 프로퍼티 이름

const prefix = 'prop'
let i = 0

// ES5
let obj1 = {}

//계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성
obj[prefix + '-' + ++i] = i
obj[prefix + '-' + ++i] = i
obj[prefix + '-' + ++i] = i


// ES6

//객체 리터럴 내부에서 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성
const obj2 = {
  [`${prefix} - ${++i}`]: i,
  [`${prefix} - ${++i}`]: i,
  [`${prefix} - ${++i}`]: i
}

console.log(obj1)      // {prop-1: 1, prop-2: 2, prop-3: 3}
console.log(obj2)      // {prop-1: 1, prop-2: 2, prop-3: 3}

 

 

3) 메서드 축약 표현 - 메서드 작성시, 키 - 값을 하나로 축약해서 표현

// ES5
let obj1 = {
  name: 'Kim',
  sayHi: function() {
    console.log('Hey! ' + this.name)
  }
}

// ES6
let obj2 = {
  name: 'Lee',
  sayHi() {                        // 메서드 축약 표현
    console.log('Hi! ' + this.name)
  }
}

obj1.sayHi()   // Hey! Kim
obj2.sayHi()   // Hi! Lee
728x90