본문 바로가기
Development

[21.01.22] YDKJSY - Objects

by igy95 2024. 1. 7.

Type

JS 에는 6가지의 주요 타입들이 있다.

  • string
  • number
  • boolean
  • null
  • undefined
  • object

object type(객체 타입) 을 제외한 나머지 타입들은 'primitive type'(원시 타입)이라고 한다. 그렇기에 다른 것들은 일단 넘어가고, 객체 타입에 대해 알아 보자.

이 타입에는 몇몇의 하위 타입들이 존재하는데, function, Array, Built-in Object가 그 예이다. 다른 두 가지에 대해서는 비교적 익숙하니 Built-in Object의 성질을 얘기해 보자면, 일단 이것들은 외형은 class 처럼 보일지 몰라도 JS에서는 그저 함수일 뿐이다. (생성자 '함수' 처럼 말이다.)

  • String
  • Number
  • Boolean

해당 이름을 가진 타입을 객체로 생성하는 것과 원시 타입으로 생성하는 것은 다른 결과를 반환한다. 하지만 우리는 해당 타입을 대부분 원시 타입으로 생성하고 그에 맞는 메소드를 인용해 정제하고 변환하고는 하는데, 이는 그러한 시도가 감지될 때마다 엔진이 원시 타입을 자동으로 객체 타입으로 강제 변환하기 때문이라고 한다.

  • Array
  • Function
  • Object
  • RegExp

어떤 form 으로 생성해도 객체 타입을 가지고 있다.

  • Date

객체 형식을 빌린 form으로만 생성이 가능하다.

  • Error

예외가 발생할 때 자동으로 생성되지만, 가끔씩 임의적으로 예외처리를 설정해줄 때 쓰인다.

Contents

오브젝트는 컨텐츠(value)들을 담는 하나의 박스라고 볼 수 있고, 그러한 컨텐츠들은 '프로퍼티'라는 특정한 장소에 각각 위치하게 된다. 오브젝트 form을 생성하게 되면 그 외형 때문에 프로퍼티와 컨텐츠가 모두 오브젝트 안에 담겨 있다 생각하기 쉽지만, 실상 오브젝트 안에 담겨있는 것은 프로퍼티일 뿐, 프로퍼티가 포인터, 참조 역할을 하기 때문에 가리키고 있는 값을 얻어올 수 있는 것이다.

 

오브젝트의 어떤 값에 접근하기 위해서는 프로퍼티를 사용해야 하는데 여기에는 두 가지 방법이 있다. . 이나 []를 사용하는 것인데 전자는 프로퍼티, 후자는 키 접근법이라고 한다.

Property vs Method

혹자는 객체에서 프로퍼티를 통해 불러온 값이 함수일 때는 그 명칭을 달리 봐야한다고 얘기한다. 다른 언어에서 존재하는 클래스처럼 어떠한 객체에 속해있는 함수이기 때문에 '메소드 접근'이라고 말하는 게 더 정확하다는 것이다.

 

의미상으로 통용하자면 이 의견을 무조건 틀리다고 할 수는 없다. 하지만 이론적으로는 함수는 절대 객체에 속해 있는 것이 아니다. 결국 프로퍼티가 해당 함수를 참조하고 있는 것이고 함수 내부의 this 참조 또한 그 전 챕터에서 다룬 암시적 바인딩의 예시이기 때문에 이것 또한 프로퍼티 접근으로 보는 게 맞다. 심지어 객체 안에서 함수를 선언해줘도 마찬가지이다.

Getters & Setters

객체에는 기본적으로 [[Put]]과 [[Get]] 연산이 내장되어 있고 그것들은 이미 존재하거나 새로운 프로퍼티를 설정할 때, 어떤 값을 가져올 때 각각 쓰인다. ES5 에서는 GetterSetter라는 프로퍼티를 통해 이런 기본 연산을 덮어 쓰는 기능을 제공한다. Getter는 값을 가져오기 위해 숨겨진 함수를 호출하는 것이고, Setter는 값을 설정하기 위해 숨겨진 함수를 호출하는 프로퍼티이다.