자바스크립트로 처음 뭔가를 만들어보는 중이다.
일단 쓰고 막히면 검색해보는 식으로 작업하다 보니
개념적인 부분이 달라서 헷갈리는 경우가 종종 있었다.

자바스크립트는 기본 자료형(number,string,boolean) 변수의 경우
값을 함수인자나 클래스 생성자로 넘기면 값만 전달이 된다.

하지만 딕셔너리나 리스트 등의 자료형을 넘기면 해당 변수의 주소가 전달된다.

다음과 같은 경우다.

var 그냥숫자 = 1;
var 그냥문자 = "가나다";
var 딕셔너리 = {"숫자":1, "문자":""};

class Test {
    constructor(그냥숫자, 그냥문자, 딕셔너리) {
        this.그냥숫자 = 그냥숫자;
        this.그냥문자 = 그냥문자;
        this.딕셔너리 = 딕셔너리;
    }
    printNum() {
        console.log(`그냥숫자 : ${this.그냥숫자}`);
        console.log(`그냥문자 : ${this.그냥문자}`);
        console.log(`딕셔너리 숫자 : ${this.딕셔너리.숫자}`);
        console.log(`딕셔너리 문자 : ${this.딕셔너리.문자}`);
    }
}

var test = new Test(그냥숫자,그냥문자, 딕셔너리);

console.log("변수 출력");
test.printNum();

그냥숫자 = 2;
딕셔너리.숫자 = 2;
딕셔너리.문자 = "라마바";

console.log("");
console.log("값 변경");
console.log("");
console.log("바뀐 변수 출력");
test.printNum();

// Console===================================
"변수 출력"
"그냥숫자 : 1"
"그냥문자 : 가나다"
"딕셔너리 숫자 : 1"
"딕셔너리 문자 : 일"
""
"값 변경"
""
"바뀐 변수 출력"
"그냥숫자 : 1"
"그냥문자 : 가나다"
"딕셔너리 숫자 : 2"
"딕셔너리 문자 : 라마바"

위의 경우 처럼 클래스에 초기 인자값을 넣을 때
변수가 기본 자료형일 경우는 값만 복사되어 원래 값을 바꿔도 전달된 값은 변화가 없고
딕셔너리의 경우 주소가 전달 되어 바뀐 값이 적용되는 것을 볼 수 있다.

자바스크립트의 이런 점을 모르고 그냥 쓰다보니 예상치 못한 곳에서 버그가 생기고
왜인지 이유를 알 수 없는 경우가 생겼었다.

C의 경우 단순히 값을 전달할 것 인지 변수의 포인터나 레퍼런스를 전달 할지
명시가 되어 이런 혼동이 없는데 개인적으로는 C방식이 좀더 명확해서 좋다고 생각한다.

어쨌든 그냥 값 대신 변수의 포인터를 넘기고 싶을 경우에
저렇게 딕셔너리에 넣어서 전달하면 된다.

Leave a comment