Skip to main content

Object

자바스크립트는 객체(object) 기반의 언어로서 원시 타입(Primitives)을 제외한 나머지 값들은 모두 객체이다.

그러므로 객체에 대한 이해가 아주 중요하다고 생각한다.

프로그래밍에서의 객체

프로그래밍에서 객체(Object)는 관련된 데이터(프로퍼티)와 동작(메서드)을 포함하는 논리적인 단위?이다.

객체를 생성하는 방법은 언어마다 다르다.

  1. 그냥 생성
    • C,C++(struct), js(객체 리터럴), python(딕셔너리로 흉내는 가능)
  2. Class로 생성
    • C++, java, js(ES6), python
  3. prototype으로 생성
    • js

객체 내부구조 및 그에 관한 생각

객체는 해시테이블의 개념을 넘어서기에 객체가 해시테이블이라고 할수는 없다.

다만 JS에서 객체는 해시테이블 기반으로 구현된다고 한다. 그러면 타 언어는 어떨까

python은 내부의 딕셔너리(해시테이블)기반으로 객체를 구현한다고 한다.

자바에서는 객체는 class의 인스턴스라고 가르친다. 객체를 생성할 방법이 class 밖에 없기 때문이다.

자바, 파이썬, 자바스크립트에서의 객체는 heap영역에 저장되지만, c++에서는 stack영역에도 저장 될 수 있다.

이는 자바, c++은 컴파일단계에서 해당 클래스의 인스턴스의 메모리 사이즈를 알 수 있기 때문이다.

여기서 자바는 왜 객체가 컴파일 시점에 필요한 메모리 사이즈를 알 수 있음에도 heap 영역에 저장되는건지 궁금한데, 가비지콜렉터를 고려해서 그렇게 설계한 것으로 추정된다.

여러 가변 자료구조를 들고 있는 객체가 스택에 저장되어 호출 후 제거 될 때, 가변 자료구조들은 heap 영역에 흩어져서 남아있을 텐데,

객체가 heap에 저장되고 참조 되지 않은 시점에서 다같이 제거하기 위해서가 아닐까 추측해본다.

어쨌든 자바와 c++에서의 객체는 연속된 메모리 공간을 할당받으며, 해당 객체의 프로퍼티에 대한 접근을 포인터 연산으로 처리할 것이다.

이 때문에, 동적으로 객체에 대한 프로퍼티의 추가 및 제거가 안되는 것이다.

반면에 자바스크립트와 파이썬에서는 객체가 해시테이블(딕셔너리)로 구현 된다. 객체 생성 시점에서 해당객체가 필요한 메모리 사이즈를 알 수가 없기에,

해시테이블로 데이터에 대한 주소값을 관리하는 것이다. 그렇기에 동적으로 프로피티에 대한 추가 제거가 가능하다.