set, get

 - set, get접근자는 각각 속성을 읽거나, 새 값을 할당할 때 사용됩니다. 정보은닉(information hiding)을 위해 클래스 내부에서만 사용할 수 있도록 private로 접근을 제한해 버립니다.


정보은닉이란

 - 간단히 설명하자면 클래스 내부의 필드나 메소드와 같이 객체가 가지고 있는 것들을 외부에서 접근하지 못하도록 숨기는 것을 말합니다. 우리가 클래스 설계를 할때 private나 public 등과 같은 접근 제한자를 통하여 특정 멤버를 공개할 것인지 공개하지 않을 것인지 지정해 줄 수 있습니다. 

왜 이런 작업을 하는 것일까요?

우리가 클래스 설계를 할때 수십에서 수백개에 달하는 필드(field) 프로퍼티(property)가 존재할 수 있습니다.

그러나 이러한 정보들을 외부로 모두 노출시켜버리면 우리가 설계한 클래스를 사용하는 사람의 입장에서는 상당히 곤록스러울 것입니다. 이럴때는 필요한 정보만을 외부로 노출시킬 필요가 있습니다. 또 다른 이유로는 안정성을 위해서 입니다. 객체 내부에서만 사용되는 필드나 메소드는 외부로 공개하면, 외부에서 이를 수정할 수 있기 때문에 안정성이 깨질 우려가 있기 때문입니다. 


public class Person

{

public String name;

public int age;

 

public Person() 

{

          // ...

      }

    // ...

}


위와 같이 Person이란 클래스가 있다면, 외부에서 name과 age를 수정할 수 있습니다. 

접근 제한자가 public으로 지정되어 있기 때문입니다. 그럼 우리는 name이나 age의 값을 신뢰할 수 있을까요? 

그렇기 때문에 name과 age필드의 접근 범위를 private로 제한해줍니다. 그럼 외부에서 이 속성을 변경할 수 없겠죠? 

그런데 프로그램을 만들다 보면, 내부에 있는 변수를 수정해야 할 상황이 벌어질 수도 있습니다. 

그럴때 쓰이는 것이 set, get 접근자입니다. get접근자만 존재한다면 읽을 수만 있으며, set접근자만 존재하면 쓸 수만 있으며, 

두 접근자가 모두 존재하면 읽을 수도 있고 쓸 수도있게됩니다.


using System;

 

namespace ConsoleApplication14

{

    public class MyClass

    {

        private string name = "John";

 

        public string Name

        {

            get

            {

                return name;

            }

            set

            {

                name = value;

            }

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            MyClass mc = new MyClass();

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

 

            mc.Name = "Bree";

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

        }

    }

}


mc.Name : John

mc.Name : Bree


Name이란 이름으로 get/set 접근자를 통해 name에 접근할 수 있으며, get 영역 내에서는 name의 값을 반환하고, set 영역 내에서는 name 속성에 value값으로 초기화 시킵니다. 여기서 value은 Name으로 넘어온 값이라고 생각하시면 됩니다. mc.Name이 아직까지는 John이었다가, 이름이 Bree로 바뀌고, 바뀐 이름을 출력하게 됩니다.


'Programing > C#' 카테고리의 다른 글

아이디 등록시 특수문자 체크  (0) 2018.09.18
[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28

+ Recent posts