Menu
CoddyTech

캡슐화를 위한 프로퍼티

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 32번째.

속성은 C#에서 캡슐화를 구현하는 주요 도구입니다. 필드를 직접 노출하는 대신, 데이터에 접근하고 데이터를 수정하는 방식을 제어하는 속성으로 필드를 감쌉니다.

이 패턴은 접근자에 유효성 검사나 로직이 포함된 공개 속성과 비공개 필드를 결합합니다:

public class Temperature
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set
        {
            if (value < -273.15)
                celsius = -273.15;  // 절대 영도 하한값
            else
                celsius = value;
        }
    }
}

이제 외부 코드에서 불가능한 온도를 설정할 수 없습니다. 이 속성은 문지기 역할을 하여 객체가 항상 유효한 상태를 유지하도록 합니다. 이것이 바로 캡슐화의 실제 적용입니다. 내부 데이터는 보호되면서도 제어된 인터페이스를 통해 계속 접근할 수 있습니다.

속성을 사용해 값을 계산하거나 부수 효과를 일으킬 수도 있습니다.

public double Fahrenheit
{
    get { return celsius * 9 / 5 + 32; }
    set { celsius = (value - 32) * 5 / 9; }
}

외부에서는 두 개의 속성을 보지만, 내부적으로는 필드가 하나뿐입니다. 속성을 사용하면 클래스를 사용하는 코드를 깨뜨리지 않고 구현 세부 사항을 변경할 수 있습니다. 이는 적절한 캡슐화의 핵심적인 이점입니다.

challenge icon

챌린지

쉬움

속성을 사용해 데이터 무결성을 보호하는 제품 재고 관리 시스템을 만들어 봅시다. 가격이 음수가 될 수 없고 수량이 항상 유효한 범위 안에 유지되는 클래스를 만들면서, 속성이 데이터의 문지기 역할을 하는 방식을 살펴보겠습니다.

코드를 두 개의 파일로 나누어 작성합니다.

  • Product.cs: Inventory 네임스페이스에 속성을 통해 유효성을 검사하며 제품 정보를 관리하는 Product 클래스를 만듭니다. 제품에는 다음이 필요합니다.
    • 비공개 필드 price (decimal)와 가격이 절대 0 미만이 되지 않도록 하는 공개 Price 속성. 음수 가격을 설정하려고 하면 대신 0으로 저장해야 합니다.
    • 비공개 필드 quantity (int)와 값을 0에서 1000 사이로 유지하는 공개 Quantity 속성. 0보다 작은 값은 0이 되고, 1000보다 큰 값은 1000이 됩니다.
    • 공개 자동 구현 속성 Name (string)
    • Price * Quantity를 반환하는 계산된 읽기 전용 속성 TotalValue
    이름, 가격, 수량을 순서대로 받는 생성자를 포함하고, 유효성 검사가 적용되도록 모든 값을 속성을 통해 설정합니다.
  • Program.cs: 메인 파일에서 입력값을 사용해 Product를 만듭니다. 그런 다음 유효하지 않을 수도 있는 추가 입력값으로 가격과 수량을 변경해 봅니다. 속성이 데이터를 어떻게 보호하는지 확인할 수 있도록 생성 후와 각 변경 후에 제품의 상태를 출력합니다.

다섯 개의 입력값을 받습니다.

  • 제품 이름
  • 초기 가격 (decimal)
  • 초기 수량 (정수)
  • 설정할 새 가격 (decimal, 음수일 수도 있음)
  • 설정할 새 수량 (정수, 범위를 벗어날 수도 있음)

다음 형식으로 출력을 출력합니다.

After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}

예를 들어 입력값이 Laptop, 999.99, 50, -100, 1500이라면 출력은 다음과 같아야 합니다.

After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0

음수 가격이 0이 되고 수량 1500이 1000으로 제한된 것을 확인하세요. 속성이 객체를 유효하지 않은 상태로부터 보호하고 있습니다. 이것이 바로 캡슐화의 작동 방식입니다!

직접 해보기

using System;
using Inventory;

class Program
{
    public static void Main(string[] args)
    {
        // 입력값 읽기
        string name = Console.ReadLine();
        decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
        int initialQuantity = Convert.ToInt32(Console.ReadLine());
        decimal newPrice = Convert.ToDecimal(Console.ReadLine());
        int newQuantity = Convert.ToInt32(Console.ReadLine());

        // TODO: 초기값을 사용해 Product 생성하기
        
        // TODO: 생성 후 제품 상태 출력하기
        Console.WriteLine("After creation:");
        // 출력 형식: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
        
        // TODO: 새 값으로 가격과 수량 변경하기
        
        // TODO: 변경 후 제품 상태 출력하기
        Console.WriteLine("After modifications:");
        // 출력 형식: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
    }
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 C# 컴파일러