캡슐화를 위한 프로퍼티
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; }
}외부에서는 두 개의 속성을 보지만, 내부적으로는 필드가 하나뿐입니다. 속성을 사용하면 클래스를 사용하는 코드를 깨뜨리지 않고 구현 세부 사항을 변경할 수 있습니다. 이는 적절한 캡슐화의 핵심적인 이점입니다.
챌린지
쉬움속성을 사용해 데이터 무결성을 보호하는 제품 재고 관리 시스템을 만들어 봅시다. 가격이 음수가 될 수 없고 수량이 항상 유효한 범위 안에 유지되는 클래스를 만들면서, 속성이 데이터의 문지기 역할을 하는 방식을 살펴보겠습니다.
코드를 두 개의 파일로 나누어 작성합니다.
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}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C# 컴파일러