티스토리 뷰

.NET 5, 6, 7

Encapsulation (캡슐화)

kaki104 2021. 4. 7. 10:00
반응형

캡슐화란?

  • 연관된 속성(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());
        }
    }

 

참고

Web Club :: 객체지향 프로그래밍의 캡슐화, 상속, 다형성 (tistory.com)

[객체지향 설계] 캡슐화(Encapsulation) (velog.io)

반응형
댓글