티스토리 뷰
반응형
캡슐화란?
- 연관된 속성(property)과 행위(method)를 하나의 클래스로 묶고 실제 구현 내용을 외부에 노출되지 않도록 감추는 것입니다.
- 외부 객체는 캡슐화된 객체 내부의 구조를 알지 못하며, 그 객체가 제공하는 public 속성과 메소드만을 이용할 수 있습니다.
- 속성과 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 앟도록 하는데 목적이 있습니다.
- C#에서는 public, protected, private 등의 접근 제한자를 이용해서 구현합니다.
설계 원칙
캡슐화는 특히 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계입니다.
소프트웨어는 클래스와 클래스의 연결점이 많으면 문제가 발생하기 쉽기 때문에 캡슐화를 이용해서 정보를 숨기게 됩니다.
캡슐화를 하지 않았을 경우 하나의 클래스를 수정했을 때 의존성이 있는 다른 클래스도 함께 수정을 해야하는 문제를 미리 해결할 수 있기 때문입니다.
캡슐화가 필요한 예제
/// <summary>
/// 배열 스택
/// </summary>
internal class ArrayStack
{
public int[] ItemArray;
public int StackSize;
public int Top;
public ArrayStack(int stackSize)
{
StackSize = stackSize;
ItemArray = new int[StackSize];
Top = 0;
}
public bool IsEmpty()
{
return Top == 0;
}
public bool IsFull()
{
return ItemArray.Length == Top;
}
public int Peek()
{
return ItemArray[Top];
}
public int Pop()
{
var returnValue = Peek();
--Top;
return returnValue;
}
public void Push(int item)
{
++Top;
ItemArray[Top] = item;
}
}
internal class Program
{
private static void Main(string[] args)
{
var stack = new ArrayStack(10);
stack.ItemArray[++stack.Top] = 20;
Console.WriteLine(stack.ItemArray[stack.Top]);
}
}
위의 코드에서 ArrayStack과 Main()은 강력한 결합이 발생합니다.
ArrayList 클래스는 배열로 Stack 구조를 구현하고 사용하기 위해 만들었는데, 그 목적을 무시하고 ItemArray속성과 Top속성을 직접 사용하면, 추후 ArrayList 클래스의 내용이 수정이 되면 Main()에서 오류가 발생할 수 있습니다.
ArrayList 클래스를 캡슐화 한다고하면, 중요한 속성인 ItemArry, Top는 private으로 변경하고, StackSize는 읽기 전용으로 만들면 외부 클래스에서 속성을 직접 접근할 수 없기 때문에 반드시 Push, Pop, Peek 메소드를 통해서만 사용할 수 있도록 만드는 것이 중요합니다.
캡슐화를 완료한 코드
/// <summary>
/// 배열 스택
/// </summary>
internal class ArrayStack
{
private readonly int[] _itemArray;
private int _top;
public int StackSize => _itemArray.Length;
public ArrayStack(int stackSize)
{
_itemArray = new int[stackSize];
_top = 0;
}
public bool IsEmpty()
{
return _top == 0;
}
public bool IsFull()
{
return _itemArray.Length == _top;
}
public int Peek()
{
return _itemArray[_top];
}
public int Pop()
{
int returnValue = Peek();
--_top;
return returnValue;
}
public void Push(int item)
{
++_top;
_itemArray[_top] = item;
}
}
internal class Program
{
private static void Main(string[] args)
{
ArrayStack stack = new ArrayStack(10);
stack.Push(20);
Console.WriteLine(stack.Pop());
}
}
참고
반응형
'.NET 5, 6, 7' 카테고리의 다른 글
WinUI 3 - WebView 2 컨트롤 사용하는 데스크탑 앱 만들기 (0) | 2021.04.12 |
---|---|
WinUI 3 - Project Reunion 0.5 안정화 버전 출시 (0) | 2021.04.09 |
Separation of concerns (관심사의 분리) (2) | 2021.04.06 |
Announcing .NET 6 Preview 1 (2/2) (0) | 2021.03.19 |
Announcing .NET 6 Preview 1 (1/2) (0) | 2021.03.12 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- #uwp
- dotNETconf
- WPF
- uno-platform
- windows 11
- Behavior
- MVVM
- kiosk
- .net 5.0
- IOT
- Bot Framework
- uno platform
- visual studio 2019
- #prism
- Microsoft
- Always Encrypted
- #MVVM
- UWP
- Build 2016
- PRISM
- C#
- LINQ
- XAML
- .net
- ef core
- Windows 10
- #Windows Template Studio
- Visual Studio 2022
- Cross-platform
- ComboBox
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함