JAVA SCRIPT/NEXACRO

[JAVA SCRIPT] Number 함수의 동작 방식(객체의 형변환)(nexacro.Decimal에 대한 고찰)

울면서개발하기 2023. 8. 30. 13:23

nexacro.Decimal 객체에 대한 고민하다가 Number 함수의 동작 방식을 알게 되어 기록을 남긴다 ㅜㅜ

최하단에도 결론이 있지만 결론부터 정리하자면

 

1. Number 함수는 객체일경우 valueOf(), 그리고 toString() 메소드를 순서대로 호출한 값을 형변환하여 리턴한다.

2. if (v instanceof nexacro.Decimal) v = v*1; 처럼 객체에 * 1을 연산해서 형변환을 하는 경우도 valueOf(), toString() 의 존재유무와 순서를 따른다.

 

 

nexacro.Decimal에 대해 설명을 하자면...

 

1. 투비소프트의 nexacro에서 nexacro.Decimal 라는 객체가 있다.

 

2. 이 객체는 Dataset 컬럼의 타입이 BIGDECIMAL일때, getColumn 메소드를 통해서 값을 가져온다면 볼 수 있는 객체이다.

    아래 데이터셋은 A라는 컬럼이 있고

    0번째 ROW에 1

    1번째 ROW에 1이 있다.

넥사크로 스튜디오의 Design 탭에서 데이터셋을 만들었다.

 

3. 2.의 데이터셋을 getColumn 해보면 nexacro.Decimal이 리턴 된다.

넥사크로의 trace를 통해서는 제대로 파악이 불가능하다.

   브라우저에서 console.log를 통해서 확인 할 수 있다.

   trace를 통해서 확인하면 문자열이 리턴 되는데, 객체의 타입까지는 파악 할 수 없다.(trace는 문자열만 리턴한다.)

   이 글에서 문자열이 리턴되는 메커니즘을 파악해볼 수 있다.

 

4. nexacro.Decimal는 객체이므로, 0번째 ROW와 1번째 ROW의 값을 가져와서 비교한다면 false가 나온다.

    (둘다 실제 값은 1이지만, 객체간의 비교이므로 주소가 다르기 때문에 false)    

 

5. 이때는 형변환을 통해 의도하는 비교를 할 수가 있다.

    (아래는 의도적으로 한쪽만 형변환 한 건데, 자바스크립트는 원시값(primitive)과 객체를 비교할때 객체를 원시값으로 바꾼다.)

 

 

 

근데, nexacro.Decimal는 어떻게 Number로 형변환이 가능한건가?

 

1. 자바스크립트의 Number함수는 아래와같은 메커니즘으로 동작한다고 한다.

    ① 문자열이 들어오는 경우 : 숫자로 변환

    ② 객체가 들어오는 경우 : valueOf()를 호출, 이어서 toString()을 호출한 값을 변환한다.

    브라우저 개발자도구 콘솔에 아래 스크립트를 실행하면 1을 리턴하는 것을 확인 할 수 있다.

Number({
    valueOf  : function(){return 1;}
  , toString : function(){return 3;}
});
// 1 리턴

위 스크립트를 브라우저 개발자도구 콘솔 탭에 붙여 넣으면 확인 할 수 있다.

 

2. 실제로 nexacro.Decimal 객체를 확인해보니 toString이라는 메소드를 가지고 있었다.

  (넥사크로 프로젝트를 브라우저에서 실행 했을때, 콘솔탭에서 nexacro.Decimal.prototype.toString을

   쳐보면 확인 할 수 있다.)

 

 

nexacro.Decimal는 왜 쓰는걸까?

 

1. 자바스크립트에서는 0.1 + 0.2를 계산하면 0.3이 나오지 않는다.

구글링 키워드 : 자바스크립트 부동소수점 연산

 

2. 다른 상용화된 툴에도 비슷한 개념의 객체들이 존재하는데 정확한 숫자 연산을 위해서가 아닐까 싶다.

    상단의 예제에서

    0번째 ROW에 0.1

    1번째 ROW에 0.2 를 넣고 getSum 메소드를 사용하면 의도한 값이 계산 된다.