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만 있으면 읽기제한(쓰기전용)이다.
댓글 없음:
댓글 쓰기