읽기 전용 및 쓰기 전용 프로퍼티
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 11번째.
때때로 읽기 전용이거나 쓰기 전용인 속성이 필요할 때가 있습니다. 개별 접근자(accessor)에 private을 사용하여 이를 제어할 수 있습니다.
읽기 전용 속성은 공개 게터(public getter)를 갖지만 비공개 세터(private setter)를 갖습니다(또는 세터가 아예 없습니다):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}외부 코드는 Username을 읽을 수 있지만, 클래스 자체만 이를 수정할 수 있습니다. 이는 생성 중에 한 번만 설정되어야 하는 값에 유용합니다.
쓰기 전용 속성은 공개 setter를 가지지만 비공개 getter를 가집니다:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}쓰기 전용 속성은 드물지만, 저장된 값을 노출하지 않고 입력을 받고자 하는 비밀번호와 같은 민감한 데이터에 유용합니다.
또한 게터(getter)만 사용하여 진정한 읽기 전용 속성을 생성할 수도 있습니다:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}get;만 있는 속성은 생성자 또는 선언 시에만 할당될 수 있으며, 객체 생성 후에는 변경 불가능(immutable)한 상태가 됩니다.
챌린지
쉬움민감한 데이터를 보호하기 위해 읽기 전용 및 쓰기 전용 속성을 사용하는 시점을 보여주는 보안 구성 시스템을 구축해 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Config.cs: 서버 구성을 관리하는Settings네임스페이스 내에ServerConfig클래스를 정의합니다. 다음을 포함해야 합니다:- 읽기 전용 속성
ServerName(생성자에서만 설정 가능) - private setter를 가진 읽기 전용 속성
Port(생성자를 통해 설정) - 비밀 키를 내부적으로 저장하는 쓰기 전용 속성
ApiKey - 제공된 키가 저장된 키와 일치하면
true를 반환하는ValidateApiKey(string key)메서드 - 서버 이름과 포트를 매개변수로 받는 생성자
- 읽기 전용 속성
Program.cs: 메인 파일에서 입력 값을 사용하여ServerConfig객체를 생성하고, API 키를 설정한 다음, 테스트 키와 비교하여 유효성을 검사합니다.
네 가지 입력을 받게 됩니다:
- 서버 이름
- 포트 번호
- 저장할 API 키
- 유효성을 검사할 API 키
서버 상세 정보와 유효성 검사 결과를 다음 형식으로 출력하세요:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}예를 들어, 입력값이 MainServer, 8080, secret123, secret123인 경우 출력은 다음과 같아야 합니다:
Server: MainServer, Port: 8080
API Key Valid: True치트 시트
개별 접근자에 private을 사용하여 속성 접근을 제어할 수 있습니다.
private setter가 있는 읽기 전용 속성:
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}외부 코드에서 Username을 읽을 수는 있지만, 클래스 내부에서만 수정할 수 있습니다.
private getter가 있는 쓰기 전용 속성:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}저장된 값을 노출하지 않고 입력을 받고자 하는 민감한 데이터에 유용합니다.
getter만 있는 진정한 읽기 전용 속성:
public class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}get;만 있는 속성은 생성자나 선언 시에만 할당할 수 있으므로, 객체 생성 후에는 변경할 수 없습니다(불변).
직접 해보기
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: serverName과 port를 사용하여 ServerConfig 객체 생성
// TODO: 쓰기 전용(write-only) 속성을 사용하여 API 키 설정
// TODO: API 키를 검증하고 결과 출력
// 형식: Server: {ServerName}, Port: {Port}
// API Key Valid: {True/False}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.