---
title: $ref & $unref
slug: world-sdk-guide-kr/dollarref-and-dollarunref
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

그 `ref` 및 `out` 키워드는 C#에서 변수를 메서드에 전달할 때 참조를 전달하는 데 사용됩니다.

TypeScript에서는 이러한 키워드를 사용할 수 없지만, ZEPETOScript에서는 다음을 사용하여 유사한 기능을 구현할 수 있습니다: `$ref` 및 `$unref`.

| 함수                | 설명                          |
| ----------------- | --------------------------- |
| $ref(x?\:T):$Ref  | 매개변수에 대한 참조를 생성합니다.         |
| $unref(x:$Ref)\:T | 매개변수의 참조를 해제하고 원래 값을 반환합니다. |



예를 들어, 다음과 같이 장면을 설정해 보겠습니다:

- 장면에 3D 객체인 큐브를 추가합니다.

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-NdO0i7dLaDpFX1zUPm-6p-20240904-102412.png" size="52" width="592" height="742" position="center" darkWidth="592" darkHeight="742" showCaption="false"}



- 추가된 큐브의 검사기에서 "구성 요소 추가"를 클릭하고 Rigidbody를 추가합니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-px7dpEvf7j1af6Dfb2oBc-20240904-102413.png)



- 장면에 빈 GameObject 추가하기.
- 아래의 RefSample 스크립트를 작성하고 3단계에서 생성한 GameObject에 추가하세요.

```typescript
import { GameObject, Rigidbody } from 'UnityEngine'
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import TestScript from './TestScript';
 
export default class RefSample extends ZepetoScriptBehaviour {
 
    Start() {   
        // "Cube"라는 이름의 GameObject 가져오기
        const testObject = GameObject.Find("Cube");
         
        // "Cube" 객체에서 Rigidbody 컴포넌트 가져오기
        const testComponent = GameObject.Find("Cube").GetComponent<Rigidbody>();
         
        // "Cube" 객체에서 TestScript 컴포넌트 가져오기
        const testScript = GameObject.Find("Cube").GetComponent<TestScript>();
 
        // 컴포넌트와 객체에 대한 참조 생성하기
        let tempObj = $ref(testObject);
        let tempComponent = $ref(testComponent);
        let tempScript = $ref(testScript);
 
        // Rigidbody 컴포넌트가 null이 아닌지 확인하기
        if(tempComponent != null) {
            // 해당 참조의 실제 값에 접근하기
            let component = $unref(tempComponent);
            console.log(`컴포넌트 이름 : ${component}`);
        }
 
        // TestScript 컴포넌트가 null이 아닌지 확인하기
        if(tempScript != null) {
            // 해당 참조의 실제 값에 접근하기
            let script = $unref(tempScript);
            script.DoTest();
        }
 
        // GameObject 참조가 null이 아닌지 확인하기
        if(tempObj != null) {
            // 해당 참조의 실제 값에 접근하기
            let objName = $unref(tempObj);
            console.log(`tempObj 이름 : ${objName.name}`);
        }
    }
}
```



- 다른 ZEPETOScript를 생성하고 아래의 TestScript를 작성하세요.

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
 
export default class TestScript extends ZepetoScriptBehaviour {
 
    DoTest() {   
        console.log(`TestScript의 DoTest()가 실행되었습니다.`);
    }
}
```



- TestScript를 Cube의 Inspector에 드래그하여 연결하세요.
- 결과를 관찰하기 위해 \[▶︎(재생)] 버튼을 클릭하세요.
- 콘솔 로그 창에서 객체 참조, Rigidbody 구성 요소 및 ZEPETOScript 구성 요소의 성공 여부를 확인할 수 있습니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-HVCJXiBnwDumPbg9gfyim-20240904-102413.png)

