getter와 setter는 여러 프로그램 언어에서 사용하는 개념인데

사용하는 첫번째 이유는 class의 확장성이 증가된다.

물론 모든 필드에 public 키워드를 사용하되면 어디서든 사용할수 있기야 하겠지만

그렇게되면 불필요하거나 예상하지 못한 값들이 생성되거나 출력될수 있다.

그렇기에 get, set의 가장 큰 의미는 클래스 내부 필드들의 캡슐화 및 은닉성을 위해서 사용합니다.

public class Sample
{
    public string name;
    private int age;
    // public string gender;
    private string gender;

    // constructor
    public Sample(string _name, int _age, string _gender)
    {
        this.name = _name;
        this.setAge(_age);
        this.setGender(_gender);
    }

    // get
    public int getAge()
    {
        return this.age;
    }

    // set
    public void setAge(int _age)
    {
        if (_age >= 1 && age <= 120)
        {
            this.age = _age;
        }
        else
        {
            this.age = 0;
        }
    }

    // get gender
    public string getGender()
    {
        return this.gender;
    }

    // set gender
    public void setGender(string _gender)
    {
        if (_gender == "male" || _gender == "female")
        {
            this.gender = _gender;
        }
        else
        {
            this.gender = "invalid value";
        }
    }
}

위의 Sample 클래스를 보면 name의 경우는 public 접근 제한자로 어디서든지 접근이 가능하지만

각각 age와 gender의 경우는 private 제한자로 다른곳에서 접근이 어렵습니다.

물론 위에 이야기했던것처럼 age와 gender의 경우에도 접근제한자를 public으로 하면 접근이 가능하겠지만

그 경우 age에 99999같은 숫자가 들어온다던가 gender에 Dog나 Cat같은 예상하지 못한 값들이 생성될수있습니다.

 

이런 문제들의 해결과 Sample 클래스 자체의 정보 은닉을 위해서

age와 gender에 각각 getter와 setter를 만들어줍니다.

 class Program
 {
     static void Main(string[] args)
     {
         // public으로 필드를 만들어두면 person 객체를 생성할때 gender에 예상하지 못한값이 들어갈수있다.
         // Sample person = new Sample("Kim", 15, "Dog");
         // Console.WriteLine(person.gender); // gender는 male 또는 female만 들어게 해야한다.

         // set를 통해서 정상적인 값이 아닌경우는 예외처리를 해줄수있을 뿐만아니라
         // 무분별하게 값을 가져오거나 생성하는것을 막아준다.
         Sample person2 = new Sample("Kim", 15, "Cat");
         Console.WriteLine(person2.getGender());
     }
 }

 

또한 c# 언어에서는 이런 getter와 setter를 더 간편하게 만들수있는 기능도 제공한다.

// 단축키는 prop + tab tab
class Sample2
{
    public int MyProperty { get; set; }
    public string MyProperty2 { get; set; }
    public bool MyProperty3 { get; set; }
}

나머지 getter와 setter는 상황에 맞게 변경해주면 된다.

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

접근 제한자 (Access Modifier)  (0) 2021.02.14
this  (0) 2021.02.13
구조체 (struct)  (0) 2021.02.06
정적 생성자 (static constructor)  (0) 2021.02.02
Environment.NewLine  (0) 2020.12.06