Menu
Coddy logo textTech

읽기 전용 및 쓰기 전용 프로퍼티

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)한 상태가 됩니다.

challenge icon

챌린지

쉬움

민감한 데이터를 보호하기 위해 읽기 전용 및 쓰기 전용 속성을 사용하는 시점을 보여주는 보안 구성 시스템을 구축해 보겠습니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • 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}
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨