C# Property, get/set

Lenny·2022년 6월 14일
0

이번에 유니티를 접하게되서 유튜브에 올라온 강의를 보고 있는데 C# 문법 중 get/set 이라는 처음 보는 문법을 접하게되어 정리해보려고한다.

자바를 접해봤다면 Getter / Setter 에 대해 알고 있을 것이다.

C# 의 get / set 은 자바의 Getter / Setter 랑 비슷한 느낌이라고 생각하면 된다.

get/set 에 대해 알아보기전에 우선 property 라는것의 개념 부터 알아보자.

Property

class Person
{
  private string age; // field
  public string Age   // property
  {
    get { return age; }
    set { age = value; }
  }
}

위 코드를 뜯어보면서 이해해볼것이다.

우선 C#에서는 프로퍼티라는 개념이 존재한다.

프로퍼티라는 개념이 무엇인지 설명하기전에 먼저 위 코드를 자바 코드로 한번 표현해보도록 하겠다.

class Person {
	private string age;
    
    public int getAge () {
    	return this.age;
    }
    
    public void setAge (int age) {
    	this.age = age;
    }
}

이런식으로 표현이 될 것이다.

위에 C# 코드와 똑같은 의미이다.

똑같은 의미지만 좀 더 코드를 깔끔하게 작성할 수 있게 등장한 개념이 바로 프로퍼티이다.

아래 코드가 프로퍼티의 기본 생김새이다.

class Person
{
	    데이터타입 필드명;
        접근 한정자 데이터타입 프로퍼티명
        {
            get
            {
                return 필드명;
            }
            set
            {
                필드명 = value;
            }
        }
}

그리고 보통 프로퍼티명은 필드명을 참고하여 작성한다.
예를들어 필드명이 age 이면 프로퍼티명은 Age,
필드명이 name 이면 프로퍼티명은 Name 이런느낌으로...

그러면 get/set은 뭘까?

위에서 언급했듯이 getter/setter를 의미한다.
get은 현재 객체의 필드를 리턴하는 함수이고, set은 현재 필드에 값을 할당하는 함수인것이다.

실제 간단한 예제를 보면 다음과 같다.

class Person
{
  private string age; // field
  public string Age   // property
  {
    get { return age; }
    set { age = value; }
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person personObj = new Person();
    Console.WriteLine("personObj.Age 값 설정 전 : " + personObj.Age);
    personObj.Age = "29";
    Console.WriteLine("personObj.Age 값 설정 후 : " + personObj.Age);
  }
}
// 소스 출처 : https://developer-talk.tistory.com/39

Program 클래스의 메인함수에서 먼저 Person의 객체를 만들었다.
그런데 바로 아랫줄에서 personObj.Age 이런식으로 Person객체의 프로퍼티를 호출하고있다.
이 때 결과는 아직 age 값이 초기화 되지 않았으므로 아무 값도 뜨지 않을것이다.

근데 여기서 신기한점은 그냥 personObj.Age 이런식으로 프로퍼티를 호출했을 뿐인데 자바의 getter 함수를 호출한 것 과 같은 효과를 볼 수 있다는 것이다.
아마 자바였으면 personObj.getAge() 이렇게 호출했을것이다.

그런데 C#의 프로퍼티를 활용하면 그냥 personObj.Age 이런식으로 작성하는것만으로 같은 효과를 볼 수 있다.

personObj.Age = "29" 이 부분도 마찬가지다.

이런식으로 대입연산자로 바로 값을 set 할 수 있다.

자바 코드로 작성한다면 personObj.setAge("29") 이런식으로 작성 했을 것이다.

personObj.Age = "29" 이후에 personObj.Age 를 한다면 29가 출력될 것이다!

화살표 함수?

C#에서도 자바스크립트와 마찬가지로 화살표 함수라는게 존재한다.

그리고 이 화살표 함수를 이용하여 다음과 같이 작성할 수 있다.

class Person
{
  private string age; // field
  public string Age   // property
  {
    get { return age; }
    set { age = value; }
  }
}

위 코드에 화살표 함수를 활용한다면

class Person
{
  private string age; // field
  public string Age   // property
  {
    get => age;
    set { age = value; }
  }
}

이런식으로 표현할 수 있을것이다.

이게 가능한 이유는 get도 생김새는 다르지만 아마 함수의 일종이라 가능한 것 같다!

get => age;

위 코드를 정석적인 함수의 형태와 비교해본다면 다음과 같을것이다.

public string getAge () {
	return this.age;
}

get도 함수의 일종이라고 추론한 이유는 C#의 화살표 함수 예제에서 다음과 같이 표현되고 있었기 때문이다.

    static void Hi() => Console.WriteLine("안녕하세요.");
    static void Multiply(int a, int b) => Console.WriteLine(a * b);

자바스크립트의 화살표 함수랑 별반 다르지 않은 모습을 띄고있다.


profile
🧑‍💻

0개의 댓글