JavaScript 기본

순환 참조

밀하우스 마나스톰 2022. 10. 25. 19:13

옛날에 C++ 공부할 때 경험했던 순환 참조는 위와 같이 두 개의 헤더 파일이 서로를 include 했을 때 발생하는 문제였다.

 

이런 경우에는 주로 헤더파일 include 없이 참조하려는 클래스를 전방 선언하는 방법으로 해결했다.

 

최근에 타입스크립트에서도 비슷한 문제를 겪게 되었다.

 

 

A-Script.ts

import { B } from "B-Script";
export class A {}
class Main {
    nodeA: A;

    constructor() {
        this.nodeA = new B();
    }
}

 

B-Script.ts

import { A } from "A-Script";
export class B extends A {}

 

이러한 구조에서 컴파일을 하니 코코스 크리에이터 에디터에서 아래와 같은 에러가 출력됐다.

 

load script [B-Script] failed : TypeError: Object prototype may only be an Object or null: undefined

 

 

위 에러는 사실 순환 참조를 정확히 지적하는 에러는 아니다.

 

class Main의 생성자에서 this.nodeA = new B() 부분에서 클래스 B를 참조할 수 없어서 undefined가 할당되었다는 얘기다.

 

이 현상은 자바스크립트가 자체적으로 순환참조를 감지하고서 의도적으로 undefined 객체를 반환한 것이다.

 

 

자바스크립트에서 순환 참조에 대해서 알아보면 꽤나 복잡하지만 간단히 해결방법을 정리하자면

 

export class A {}
class Main {
    nodeA: A;

    constructor() {
        this.nodeA = new B();
    }
}
import { B } from "BScript";

B 클래스 import를 늦추는 것이다.