본문 바로가기
C#

속성은 컴파일 단계에서 변수를 자동 생성합니다

by Oz Driver 2025. 4. 28.

 

C# 어플리케이션에서 Property(속성)을 보면, 단순히 변수처럼 값을 저장하고 불러오는 것처럼 보입니다.
하지만 실제로 속성은 변수와는 다릅니다.

속성은 컴파일 단계에서 숨겨진 변수를 자동으로 생성하고, 이 변수에 값을 저장하거나 가져오는 메소드 형태로 동작합니다. Property는 데이터를 저장하는 것처럼 보이지만, 실제로는 값을 저장하고 읽어오는 메소드가 결합된 구조입니다.

 

예시

public int Score { get; private set; }
 

겉으로 보기에는 Score라는 변수가 하나 있는 것처럼 보입니다.
하지만 컴파일 시점에서는 다음과 같이 변환됩니다.

[CompilerGenerated] 
private int <Score>k__BackingField; 

public int Score 
{ 
    [CompilerGenerated]
    get { return this.<Score>k__BackingField; }
    
    [CompilerGenerated] 
    private set { this.<Score>k__BackingField = value; } 
}

 

* <Score>k__BackingField는 Score 속성을 위해 컴파일러가 자동으로 생성한 숨겨진 필드입니다.

* 이 이름은 사용자가 직접 접근하거나 수정할 수 없도록 보호됩니다.

따라서, C#에서의 속성(Property)은 숨겨진 필드와 get/set 메소드가 결합된 구조로 만들어져 있습니다.

 

속성을 사용하는 이유

* 변수를 외부에서 직접 수정하는 것을 방지할 수 있습니다.

* 값을 읽거나 쓸 때 추가 로직을 쉽게 삽입할 수 있습니다.

* 코드의 일관성과 데이터 보호를 강화할 수 있습니다.

이러한 이유로 C#에서는 필드(변수)와 속성을 구분하여 관리합니다.

 

속성에는 자동 구현 속성과 일반 속성이 있습니다

C#에서는 속성을 작성할 때 두 가지 방법을 사용할 수 있습니다.
바로 자동 구현 속성과 일반 속성입니다.

이 둘은 코드 형태뿐만 아니라, 내부에서 처리되는 방식에도 명확한 차이가 있습니다.

자동 구현 속성

자동 구현 속성은 개발자가 별도로 변수를 선언하지 않아도 됩니다.
속성만 선언하면, 컴파일러가 내부적으로 숨겨진 변수를 자동으로 만들어줍니다.

예를 들어,

public int Score { get; private set; }
 

이렇게만 작성해도, 컴파일러가 자동으로 Score라는 속성을 위한 숨겨진 필드를 생성하고, 값을 저장하고 읽는 기능까지 함께 만들어줍니다.

따라서 특별한 추가 처리가 필요 없고, 코드가 짧고 간단해지는 장점이 있습니다.
단순히 값을 저장하거나 읽기만 하면 될 때 편리하게 사용할 수 있습니다.

일반 속성

일반 속성은 자동 구현 속성과 다르게, 개발자가 직접 변수를 선언해야 합니다.

private int _score; 

public int Score 
{ 
    get { return _score; } 
    private set 
    { 
        if (value < 0) 
            _score = 0; 
        else _score = value; 
    } 
}
 

이처럼, 숨겨진 변수가 아닌 명시적으로 작성한 변수(_score)를 사용합니다.
그리고 값을 가져오거나 설정할 때 자유롭게 로직을 추가할 수 있습니다.

예를 들어, 값이 0 미만이면 강제로 0으로 설정하는 유효성 검사 같은 것도 set 블록 안에서 처리할 수 있습니다.

일반 속성은 이렇게 데이터 검증이나 값 보정 같은 추가 처리가 필요한 상황에 적합합니다.

 

마무리

* 자동 구현 속성은 변수를 따로 선언하지 않고, 속성만 작성하면 컴파일러가 내부에 숨겨진 필드를 만들어줍니다.

* 일반 속성은 개발자가 직접 변수를 선언하고, 값을 주고받을 때 원하는 로직을 자유롭게 삽입할 수 있습니다.

* 단순한 데이터 저장에는 자동 구현 속성이 편하고, 복잡한 데이터 관리가 필요한 경우에는 일반 속성이 적합합니다.