옛날에 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를 늦추는 것이다.
'JavaScript 기본' 카테고리의 다른 글
Key와 Value 쌍의 컬렉션 (0) | 2023.02.27 |
---|---|
Call By Sharing (0) | 2022.04.22 |
함수 리스트 (Delegate) (0) | 2022.04.12 |
Array 함수 #6. 기타 (0) | 2022.03.08 |
Array 함수 #5. sort (0) | 2022.03.03 |