본문 바로가기
프로그래밍/C#

C# get-only 속성에 대해서 알아보자

by bantomak 2025. 4. 28.
반응형

C#에서 get-only 속성(Property)란?

  • 값을 읽을 수만 있고, 외부에서 값을 변경할 수 없음
  • 초기화 시점(선언 또는 생성자)에만 값을 세팅할 수 있음
public class Player
{
    public int Level { get; } // get-only 프로퍼티

    public Player(int level)
    {
        Level = level; // 생성자에서만 값 할당 가능
    }
}

static void Main(string[] args)
{
    var player = new Player(2);
    player.Level = 3; // error
}

get-only 프로퍼티 선언 방법

  • 선언 + 생성자 초기화 : public int value { get; } > 이후 생성자에서 할당
  • 선언 + 초기값 할당 : public int value { get; } = 10; > 선언과 동시에 초기화

왜 get-only 프로퍼티를 쓸까?

  • 불변성(Immutable) 유지 : 객체 생성 이후 값 변경 방지
  • 안정성 강화 : 외부에서 잘못된 값 변경을 막음
  • 명확한 의도 표현 : "이 값은 생성 시 정해져서 변하지 않는다"를 코드로 보여줌
  • 테스트 편의성 : 예상 가능한 동작 보장 (변경될 걱정 없음)

get-only 프로퍼티가 참조 타입이라면?

get-only 프로퍼티 자체는 수정 불가지만 만약 프로퍼티 타입이 참조 타입(reference type)이라면 참조 대상의 내부 값은 수정할 수 있다.

public class WrapperItemResult
{
    public class ItemResult
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public List<int> ints { get; set; } = new List<int>();

        public void AddReward(int id)
        {
            ints.Add(id);
        }
    }

    public ItemResult itemResults { get; } = new ItemResult();
    public int age { get; set; }
}

static void Main(string[] args)
{
    var temp = new WrapperItemResult();
    temp.itemResults.AddReward(1); // 참조 타입의 내부 값은 변경 가능
    temp.itemResults.AddReward(2);

    temp.itemResults = new WrapperItemResult.ItemResult(); // 참조 대상 변경 불가
}

C# 9.0부터는 init 키워드를 써보자

  • init은 초기화 전용 setter를 의미한다.
  • 생성자뿐 아니라 object initializer에서도 세팅 가능
public class Player
{
    public int Level { get; init; }
}

// 사용
var player = new Player { Level = 5 }; // OK
// player.Level = 10; // 초기 설정 이후 수정 불가

정리하자면

  • get-only 속성 : 생성자나 선언 시 초기화만 가능, 이후 수정 불가
  • init-only 속성 : 생성자나 object initializer로 초기화 가능, 이후 수정 불가
  • init은 object initializer를 지원한다는 점이 다름

함께 읽으면 좋은 글

 

C# record에 대해서 알아보자

record 사용 예제C# 9.0에서 추가값 중심의 불변성(Immurable) 객체public record GiveItemRequest(int itemId, int itemCount);C# 레코드(record) 타입 문법을 사용한 불변(Immutable) 데이터 모델을 정의한다.간단히 말하자

jettstream.tistory.com

 

C# String은 참조 타입(Reference type)이면서 불변(Immutable)하다.

string vs StringBuilder 예를 들어, int의 경우를 살펴보자. int는 값 타입(value type)이면서 가변(mutable)이다. 값 타입은 데이터 변경 시에 새로운 메모리 할당이 일어나지 않는다. 이미 생성된 메모리의

jettstream.tistory.com

댓글