이번에 유니티를 접하게되서 유튜브에 올라온 강의를 보고 있는데 C# 문법 중 get/set 이라는 처음 보는 문법을 접하게되어 정리해보려고한다.
자바를 접해봤다면 Getter / Setter 에 대해 알고 있을 것이다.
C# 의 get / set 은 자바의 Getter / Setter 랑 비슷한 느낌이라고 생각하면 된다.
get/set 에 대해 알아보기전에 우선 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);
자바스크립트의 화살표 함수랑 별반 다르지 않은 모습을 띄고있다.
https://blog.hexabrain.net/153 - property, get, set관련 내용
https://thebook.io/006890/part02/ch19/13/ - 화살표함수 관련 내용