속성이란 무엇인가?
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 함수를 호출하도록 컴파일시에 자동으로 변환해주는 기능입니다.
'C#' 카테고리의 다른 글
=> 에 대한 진실과 오해 : 이것은 람다일까 아닐까? (0) | 2025.06.23 |
---|---|
C# 다형성(Polymorphism) 정리 (0) | 2025.06.23 |
구조체를 초기화하는 몇 가지 방법들 (0) | 2025.06.03 |
접근 제한자가 없는 struct, class 는 public 일까? private 일까? (0) | 2025.05.31 |
new() 의 완벽한 이해 (0) | 2025.05.20 |