본문 바로가기
C#

속성(Property)의 동작 원리 정리

by Oz Driver 2025. 6. 23.

속성이란 무엇인가?

C# 에서 속성(property) 은 필드처럼 보이지만, 실제로는 메서드처럼 동작하는 기능입니다.
읽기/쓰기 시점에 자동으로 특정 함수를 호출할 수 있게 해주는 문법적인 장치입니다.

public string Name { get; set; }

 

이런 문법은 내부적으로 함수 두 개 (get 과 set) 로 변환됩니다.

 

자동 구현 속성 : { get; set; } 의 정체

아래와 같은 자동 구현 속성이 있다고 할 때,

public string Name { get; set; }

 

컴파일되면 실제로는 다음과 같은 코드로 변환됩니다

private string <Name>k__BackingField;

public string get_Name()
{
    return <Name>k__BackingField;
}

public void set_Name(string value)
{
    <Name>k__BackingField = value;
}

 

즉, 컴파일러가 자동으로 숨겨진 필드와 get / set 메서드를 생성합니다.

 

필드 vs 속성의 차이

• field (name) 

 - 변수 하나

 - 메모리에 직접 접근

 - 단순 저장 / 읽기

 - public string name

 

• 속성 (Name) 

 - get / set 함수로 구현됨

 - 함수 호출을 통해 접근

 - 접근 시, 로직을 추가할 수 있음

 - public string Name { get; set; }

 

속성의 실제 동작 과정

person.Name = "홍길동";         // set
string s = person.Name;        // get

 

위와 같은 코드가 컴파일 된다면, 

person.set_Name("홍길동");
string s = person.get_Name();

 

즉, 속성점(.) 하나로 접근하지만 내부적으로함수 호출이 일어난다는 게 핵심입니다.

 

다시 말해,

xxx.Name = ...;

이 코드는 set_Name() 함수를 호출하도록 C# 컴파일러가 자동으로 바꿔주며,

 

... = xxx.Name;

이 코드는 get_Name() 함수를 호출하도록 C# 컴파일러가 자동으로 바꿔주는 것입니다.  

 

Unity의 속성 : 필드처럼 보이는 속성들

Unity 에서는 다음과 같은 것들이 전부 속성입니다.

transform
gameObject
material
renderer

 

예를 들어 Renderer.material 속성은 실제로 이렇게 생겼습니다.

public Material material
{
    get
    {
        if (IsPersistent())
        {
            Debug.LogError("프리팹에서 접근 금지!");
            return null;
        }
        return GetMaterial();
    }
    set
    {
        SetMaterial(value);
    }
}

 

 

• material 은 필드가 아니라 get / set 이 구현된 속성입니다.

• 내부에서는 복사본을 생성하거나 로직을 실행합니다.

 

material 처럼 소문자로 시작한 속성? 왜?

일반적인 C# 컨벤션은 다음과 같습니다.

속성 : PascalCase → Material, Name

필드 : camelCase 또는 _camelCase → material, _material

 

하지만 Unity 는 아래와 같은 이유로 일부 속성소문자로 시작합니다

Material 은 클래스 이름 (대문자로 시작) 입니다.

따라서 속성 이름도 Material 이 되면 혼동되는 상황입니다.

예) public Material Material 이 되어버림.

그래서 Unity 는 속성 이름을 "소문자 material" 로 설정할 수 밖에 없었을 것입니다.

비록 소문자 이지만, 엄연히 속성입니다. (get / set 함수 포함)

 

마무리 

결과적으로 속성 (Property) 은

 

• get; set; 을 미리 정의해두고

• 외부에서는 점(.) 으로 마치 field 처럼 접근하게 만든 후에,

• 컴파일러에 의해 그것이 get (읽기) 인지, set (쓰기) 인지 판단해서

 

 ... = xxx.Value; 형태라면, get 함수를 호출하고 

 xxx.Value = ...; 형태라면, set 함수를 호출하도록 컴파일시자동으로 변환해주는 기능입니다.