[C#] 클래스의 소유와 참조 / 역참조와 상호 참조 / 자기 참조

2023. 8. 10. 17:21C#

728x90
반응형

소유와 참조

public class Test : MonoBehaviour
{
    public class Father
    {
        public Child child; public int x;
    }
    public class Child
    {
        public int y;
    }
    void Start()
    {
        Father f = new Father();
        Child c = new Child();

        f.child = c;
        f.child.y = 20;
        c.y = 10;
        print(f.child.y);
    }
}

위 코드의 클래스는 Father와 Child 두 개이다. Father 클래스는 Child 클래스의 인스턴스 child와 int x를 가지며, Child 클래스는 int y를 가진다. 변수 f와 c로 각각 해당 클래스의 메모리를 선언하였고 f.child가 c를 참조한다.

여기서 Father는 Child 클래스를 소유하고 있고 f.child.y와 c.y는 같은 데이터를 가리킨다.

 

 


 

 

역참조와 상호 참조

위의 예시에서 Child 인스턴스가 되려 Father의 참조를 가지는 것. 이렇게 상호참조가 될 수 있다.

public class Test : MonoBehaviour
{
    public class Father
    {
        public Child child; public int x;
    }
    public class Child
    {
        public Father father; public int y;
    }
    void Start()
    {
        Father f = new Father();
        Child c = new Child();

        f.child = c;
        c.father = f;

        f.x = 10; c.y = 20;

        print(c.father.x);
        print(f.child.y);
    }
}

Father가 Child 인스턴스를 참조했던 것과 마찬가지로 Child 클래스에서 Father 인스턴스를 참조하면 된다.

 

 


 

 

자기 참조

자신의 레퍼런스를 소유한다. 아래 예시를 보면 해당 클래스말고 다른 클래스에서 접근하기 위해서 만들어두는 변수 myself가 있다. 코드를 외부에 노출하지 않은 채 myself 변수로만 접근이 가능하게 할 수 있다. 소문자 gameObject 변수가 이런 형식이다.

public class Test : MonoBehaviour
{
    public class MYGameObject
    {
        public MYGameObject myself;
        public MYGameObject()
        {
            myself = this;
        }
        public string name;
    }
    void Start()
    {
        MYGameObject m = new MYGameObject();
        m.name = "이름";
        print(m.name);
        print(m.myself.name);
    }
}

자기 자신을 참조하는 myself 변수를 선언했다. 이를 생성자에서 this를 대입받았다. 메모리 m은 myself와 name을 레퍼런스로 하는 변수이다.

 

 

gameObject

public class Test : MonoBehaviour
{
    public GameObject obj1;
    void Start()
    {
        name = "Cube1";
        gameObject.name = "Cube1";

        obj1.name = "Cube2";
        obj1.gameObject.name = "Cube2";
    }
}

gameObject가 붙든 안붙든 같은 동작이지만 붙어있는 것이 가독성이 훨씬 좋다.

728x90
반응형