2010년 7월 28일 수요일

C#에서 Encapsulation을 위한 방법

Encapsulation 즉 캡슐화는 말 그대로
캡슐안에 넣는다는 뜻이다.
C#은 객체지향언어인데, 객체지향의 특징에는

캡슐화encapsulation
상속inheritance
다형성polymorphism

가 있다.

그 중 encapsulation에 대해 설명하겠다.

객체의 캡슐화를 가능하게 하는 방법을 알아보자.
객체의 캡슐화란 : 외부에서 직접 멤버 변수에 접근하는 것을 막기 위해 멤버 변수의 접근지정자를 private로 선언하고, 멤버함수(메서드)를 public으로 선언하여, 이 메서드를 사용하여 private인 멤버변수에 접근하는 것을 말한다.

Class Test
{
    public int x;
    public int y;

    public void MyMethod()
    {
        
    }
}

위와 같은 Test 클래스가 m이라는 객체로 생성되었다면
m.x = 100;
int x = m.x;
이렇게 사용할 수 있다. 즉, 멤버 변수인 x, y, 멤버 함수인 MyMethod()가 모두 public이기 때문에 외부에서 직접접근이 가능하다.

이것을 
Class Test
{
    private int x;
    private int y;

    public void SetX(int x)
    {
        this.x = x;
    }
    public int GetX()
    {
        ruturn this.x;
    }
}
이렇게 고치면
m.SetX(100);
int x = m.GetX();
이렇게 멤버 변수인 x와 y에 접근하기 위해서는 SetX()와 GetX()를 사용해야 한다.
이렇게 사용하기 위해 매번 SetX()와 GetX()를 만들어야 하는 불편함을 없애기 위해 Property(속성)가 존재한다. - 속성Property의 존재이유
Property 란 : 멤버 변수를 읽고 쓸수있는 특별한 메소드인 get과 set으로 이루어져있다.
속성의 형식은 다음과 같다.
public 데이터형 속성 이름
{
    get{ return 멤버 변수;}
    set{ 멤버 변수 = value; }
}

실제 사용예를 보면 다음과 같다.
using System;
namespace MyTest
{
    class MyClass
    {
        private int x;
        private int y;
        
        // x에 값을 넣는 set메서드, x를 읽는 get메서드 
        public int p_x
        {
            // get과 set의 경우는 메서드 이지만, 뒤에 ()를 안써도 된다.
            get { return x;}
            // set메서드 안에 여러가지 로직을 넣어서 허용되지 않는 문자(!@#$%)등을
            // 제거할 수 있고, 최대 길이나 대소문자 규칙을 검사할 수 있다.
            // 즉, 받고 싶은 값의 규칙을 만들 수 있고, 그 값만 입력 받을 수 있다.
            set { x = value;}
        }
    class Class1
    {
        static void Main(string[] args)
        {
            MyClass m = new MyClass();

            //속성을 통하여 접근
            //x와 y에 객체의 set메서드를 통해서 값을 할당함.
            // 따로 구분하지 않아도. 입력하는 부분에서는 set메서드가 동작한다.
            m.p_x = 100;
            

           //다음줄의 주석을 풀면 에러가 난다. private인 x와 y에 직접접근했기 때문이다.
           //m.x = 100;



            //마찬가지로 출력할 부분에서는 get 메서드가 동작한다.
            Console.WriteLine("x값은 {0}", m.p_x);
        }
    }
}

사용자의 입장에서 봤을 때 변수에 값을 set할 때 set메서드가 동작하고, 변수의 값을 get 하고 싶을때 get메서드가 동작한다.
이렇게 하면 멤버 변수에 직접적으로 접근하지 않고 메서드를 통해서 접근했다.
변수는 존재하는데, 그 변수에 읽기제한, 쓰기제한을 할 수 있다. get만 있으면 쓰기제한(읽기전용)이고, set만 있으면 읽기제한(쓰기전용)이다.

댓글 없음:

댓글 쓰기