카테고리 없음

🌟 C# 필드(Field)와 프로퍼티(Property) 😋 🌟

minsoungdev 2026. 7. 31. 23:17

안녕하세요. 박민성입니다. 🤗

 

오늘은 C#에 필드(Field)와 프로퍼티(Property)에 대해서 글을 쓰고자 합니다. 🤔

오늘도 그냥 어떤 것을 공부해 보지...? 하다가 필드와 프로퍼티 차이라는 것을 보고

"공부해 보고 이 주제로 블로그 쓰면 되겠다!" 하고 쓰게 되었습니다.

 

1. 필드란?

필드는 클래스나 구조체 안에 선언되어 데이터를 직접 저장하는 변수입니다.

public class Player
{
    public int health;
}

health는 Player 객체의 상태를 저장하는 필드입니다.

필드는 값을 직접 저장하고 클래스나 구조체 내부에 선언합니다.

또한 접근 제한자를 붙일 수 있습니다. (당연히 public 필드면 외부에서 수정 가능합니다.)

Player player = new Player();
player.health = 100;

 

2. 프로퍼티란?

프로퍼티는 필드처럼 보이지만 실제로는 값을 읽고 쓰는 방법을 제어하는 멤버에 불과합니다.

public int Health
{
    get
    {
        return health;
    }

    set
    {
        health = value;
    }
}
사용은 필드와 비슷하게 사용합니다.
player.Health = 100;
Debug.Log(player.Health);

하지만 내부적으로 get과 set을 통해 접근합니다.

get은 값을 읽을 때 실행되고

set은 값을 넣을 때 실행,

value는 프로퍼티에 대입된 값입니다.

여기서 필드와 프로퍼티의 차이는

public int health;
public int Health { get; set; }

필드는 데이터를 직접 저장하고 프로퍼티는 그 데이터에 접근하는 방법을 제어합니다.

 

3. 프로퍼티가 필요한 이유

필드를 public으로 공개하면 외부에서 어떤 값이든 넣을 수 있습니다.

public int health;
player.health = -100;

체력에 음수가 들어가도 막을 수 없습니다.

 

프로퍼티를 사용하면 값을 검사할 수 있기 때문에 이러한 상황을 막을 수 있습니다.

private int health;

public int Health
{
    get
    {
        return health;
    }

    set
    {
        health = Mathf.Max(0, value);
    }
}

프로퍼티는 단순히 값을 감싸는 문법이 아니라 잘못된 값이 들어오는 것을 막는 역할도 할 수 있습니다.

 

4. 자동 구현 프로퍼티

private int health;

public int Health
{
    get
    {
        return health;
    }

    set
    {
        health = value;
    }
}

매번 이렇게 프로퍼티를 작성하는 건 번거롭습니다.

 

이때 자동 구현 프로퍼티를 사용할 수 있습니다.

public int Health { get; set; }

이런 식으로 작성 시에 컴파일러가 내부적으로 값을 저장할 숨겨진 필드를 만들어줍니다.

자동 구현 프로퍼티는 컴파일러가 만든 숨겨진 필드에 값을 저장합니다.

 

자동 구현 프로퍼티를 사용할 때

public int Health { get; private set; }

값은 외부에서 읽을 수 있지만 수정은 클래스 내부에서만 허용하고 싶을 때 

요런 식으로 set에 private를 따로 붙일 수 있습니다.

 

또한 get만 사용하고 싶을 때에는

public int MaxHealth
{
    get
    {
        return 100;
    }
}

이렇게 작성할 수 있지만 간단하게 표현식 본문으로도 작성할 수 있습니다.

public int MaxHealth => 100;

 

set에 private를 붙이는 것은 클래스 내부에서 수정할 수 있지만

읽기 전용은 진짜 클래스 내부에서도 읽기만 가능합니다.

 

5. Unity Inspector와 프로퍼티

Unity Inspector는 기본적으로 직렬화된 필드를 보여줍니다.

[SerializeField] private int health;

public int Health { get; private set; }

health는 필드이므로 [SerializeField]를 통해 Inspector에 노출 가능합니다.

하지만 Health는 프로퍼티이므로 일반적으로 그대로는 Inspector에 표시되지 않습니다.

 

자동 구현 프로퍼티는 값을 어디에 저장할까요?

public int Health { get; private set; }

핵심적으로 프로퍼티는 get과 set을 제공하는 멤버이고

자동 구현 프로퍼티는 직접 저장 필드를 작성하지 않습니다.

대신 컴파일러가 보이지 않는 백킹 필드를 자동 생성합니다. (백킹 필드는 간단히 프로퍼티의 실제 값을 저장하는 필드입니다)

실제 값은 그 숨겨진 백킹 필드에 저장됩니다.

 

field:는 무엇일까요?

field:는 C#의 특성 대상 지정자입니다.

[field: SerializeField] public int Health { get; private set; }

 

대괄호 안의 특성이 어디에 적용될지를 지정합니다.

field:는 해당 특성을 필드에 적용하라는 의미입니다.

여기서는 프로퍼티 자체가 아니라 컴파일러가 만든 숨겨진 백킹 필드가 대상으로 합니다.

 

[field: SerializeField]는 프로퍼티 자체를 직렬화하는 것이 아니라 자동 구현 프로퍼티의 숨겨진 백킹 필드에 SerializeField를 적용하는 것입니다.

 

[field: SerializeField]를 사용하면 어떻게 될까요?

[field: SerializeField] public int Health { get; private set; } = 100;

 

이런 예제 코드가 있다면

백킹 필드가 Unity 직렬화 대상이 됩니다.

그러면 Unity Inspector창에서 값을 수정할 수 있게 됩니다.

 

Inspector에서 값을 바꾸는 것은 Unity 직렬화 시스템이 백킹 필드 값을 편집하는 것이라고 생각하시면 됩니다.

 

 

오늘은 C#에 필드(Field)와 프로퍼티(Property)에 대해서 알아보았는데요~!

무심코 사용했던 것들이 파고들어가보면 막 백킹 필드, 특성 대상 지정자 등 여러 가지

새로운 것들이 나오는 것 같습니다. 새로운 것들이 나올 때마다 내부 동작을 이해하게 되고

더욱 지시에 폭이나 깊이가 더 깊어지는 것 같습니다. ☺️

 

글을 마치기 전에 요즘 새벽감성 느낌으로 즐겨 듣는 노래가 있습니다. ㅎㅎ

pupsies - misery라는 노래입니다. ㅎㅎ

 

내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다. 

봐주셔서 감사합니다. ☺️