■ Javascript

[자바스크립트] Javascript를 기초부터 시작해보자! (7)

이번에는 자바스크립트의 함수 메모리 구조에 대해서 살펴보도록 하겠다.
먼저 메소드 오버로딩에 대해서 살펴보겠다.
객체지향언어에서 메소드오버로딩은 같은 메소드명을 가졌지만 시그니쳐중에서, 인자값의 개수나 형이
다른것을 의미한다.
하지만 자바스크립트에서는 메소드오버로딩이 동작하지 않는다.
오히려 그보다 훨씬더 유연하게 개발이 가능하다.
예를 하나 보자.

function add(a, b) {
    var total = 0;
    for (var i = 0; i < arguments.length; ++i) {
        total += arguments[i];
    }
}

먼저 add(10); 이렇게 호출하면 a = 10이 처음 할당되고, b에는 undefined가 할당된다.
즉 파라미터 처음부터 값이 할당되고 호출부분에서 인자수가 부족하다면 나머지 값은 모두 undefined로 채워진다.

다음으로는 선언한적도 없는 arguments라는 배열이 보인다. 하지만 이것은 배열이 아니다. 자바스크립트에서 배열처럼 보이게
만들어준 것일 뿐이다. 따라서 Array객체의 함수들은 사용할수 없고 다면 length나 []연산자를 제공한다.

다시 함수 메모리 구조로 돌아와 보겠다.
먼저 함수의 구조를 살펴보겠다.

함수는 위에서 오버로딩을 설명하면서 이야기했던 arguments와 a,b같은 인자값을 하나의 객체로 들고 있는 호출객체가 있다.
위 코드를 살짝 바꿔보겠다.
add(10)을 호출하는 순간 내부에서는

add({a:10, b:undefined, arguments:[10]});

이렇게 바뀐다. 즉 10만 호출했을 뿐인데 저렇게 하나의 호출객체가 들어간다는 의미이다. 그리고 저 객체는 이름이 없다.
즉 add함수 내부에서는 저 객체가 전역객체 처럼 작용한다.
전역객체란 말이 나왔는데 바꿔말하면 우리가 브라우져스크립팅을 할때 내부에 코드를 작성하면
우린 window란 전역객체가 생긴다. 또한 window는 생략이 가능하다.
console.log(); 이부분도 window.console.log()처럼 될수 있다는 의미이다.

var console = {
    log:function(…){}
};

(function(??){
    console.log(1);
})({console:console});

이런식으로 사용하는것이 생략되었다고도 가정할 수 있다.

현재 메모리구조를 설명하면서 함수의 호출객체에 대해서 설명했다. 즉 함수가 만들어지면 저러한 호출객체가 자동으로 만들어 진다는 의미이다.
다음 구조를 보도록하겠다.
다음으로는 prototype 객체가 하나 만들어진다. 하지만 이것은 일반적인 우리가 알고있는 객체와는 조금 다른 성질을 지녔다.
이부분은 나중에 다시 설명하도록하겠다.

다음구조는 실제 코드가 올라가는 영역이 필요하다.
이부분에서 선언되어진 변수들은 객체지향에서 private메소드, 속성과 대응된다.

마지막 구조는 함수의 속성값을 달수 있다는 부분이다. 함수는 앞에서 말한 일반 객체가 아니다. 그럼에도 불구하고 저렇게 사용할 수 있으며, public 메소드와 대응될수도 있으며, 만약 add를 Addition라고 대문자 명사로 바꾸면서 생성자로서 사용한다고 하면
static 메소드, 속성이 될수도 있다는 의미이다.

add는 함수이다. 하지만 자바스크립트에서 함수는 first class function 즉 일반 객체처럼도 사용이 가능하다는 의미이다.
따라서 add.a = 10; 이렇게 사용이 가능하며 마지막 구조인 “함수의 속성값을 달수있다”라는 부분이 나타난다.

정리하면 함수의 구조는
호출객체, prototype객체, 코드영역, 공개영역 이렇게 나누어진다.

살짝더 정확히 이야기하면 코드영역 즉 private영역에 예외적으로 (자바스크립트엔진에 의해서) prototype을 가르키는 객체가 하나더 있으며 이는 앞서 말한 prototype객체를 참조한다.

다음시간에는 객체 참조 체인에 대해서 알아보도록하겠다.

Standard

댓글 남기기