반응형
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
'프로그래밍 > C#' 카테고리의 다른 글
C# 실무에서 사용하는 전역 JSON 옵션 설정 (0) | 2025.04.28 |
---|---|
C# record에 대해서 알아보자 (0) | 2025.04.26 |
Entity Framework에서 [NotMapped] 속성 (0) | 2025.04.26 |
C# is 패턴 매칭(Pattern Matching)에 대해서 알아보자 (0) | 2025.04.26 |
JWT를 활용해서 C# 서버에서 사용자 인증 처리하기 (0) | 2025.04.23 |
댓글