쫑가 과정

참조 타입 - 클래스(class)로 만든 변수 본문

프로그래밍 공부/c#

참조 타입 - 클래스(class)로 만든 변수

쫑가 2021. 11. 12. 21:25

클래스로 만든 변수는 참조(reference) 타입.

참조 타입의 변수는 실체화된 오브젝트가 아니다.

 

Animal 클래스 생성

using UnityEngine;

public class Animal {

    // 변수
    public string name;
    public string sound;

    public void PlaySound()
    {
        Debug.Log(name + ":" + sound);
    }
}

Zoo class 생성

using UnityEngine;

public class Zoo : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Animal cat = new Animal();
        cat.name = "톰";
        cat.sound = "냐옹";

        cat.PlaySound();
    }
}

 

Animal cat = new Animal()을 살펴보자

cat이라는 새로운 Animal 인스턴스를 생성한다고 생각하지만

 

cat은 생성된 Animal 오브젝트를 가리키는 참조값을 저장하는 변수이다.

 

확실하게 예제로 알아보자

    void Start()
    {
        Animal cat = new Animal();
        cat.name = "tom";
        cat.sound = "냐옹";

        Animal mouse = new Animal();
        mouse.name = "jerry";
        mouse.sound = "찍찍";
        
        mouse = cat;
        mouse.name = "navi";

        cat.PlaySound();
        mouse.PlaySound();
    }
/// Console
navi : 냐옹
navi : 냐옹

cat, mouse 둘 다 변경되었다. 

왜 그럴까?

mouse에 할당된 참조값이 cat의 참조값으로 변경되면서 mouse는 그전까지 가리키던 Animal 오브젝트를 가리키지 않고 cat이 가리키던 Animal 오브젝트를 가리킨다.

 

두 변수가 참조값을 통해 가리키던 오브젝트는 하나가 되었다.

mouse를 통해 Animal 오브젝트를 수정하는 것은 cat을 통해 Animal 오브젝트를 수정하는 것과 같다.

따라서, cat.name도 "navi"가 된 것이다.

 

그럼 mouse가 원래 가리키던 Animal 오브젝트는 미아가 돼서 사용할 방법이 없다.

이렇게 아무도 가리키지 않는 오브젝트는 C# Garbage Collector가 자동으로 정리한다.

Comments