기존에 Java로 공부를 하다가 C#을 봤는데 매우 흥미로운 기능이 있어서 소개해볼까 한다.
제목에 쓴 property라는 것이다. 프로퍼티란 C#에서 쓰는 메소드인데 쉽게 말하자면, getter와 setter를 가진 변수? 라고 할 수 있겠다. 이것도 어렵다. 그러니까 프로퍼티는 멤버변수(속성) + getter/setter 이다.
흥미를 느낀 이유는 프로퍼티를 사용하면 코드가 매우 간결해진다.
아래 예제를 보여주겠다.
먼저, Person이라는 클래스를 자바로 표현해봤다. 물론, 에디터에서 getter/setter를 간소화해서 보여주는 기능도 있고 자동 생성해주는 기능도 있으나, 뭔가 길다.
public class JavaPerson
{
private int personId;
private string firstName;
private string lastName;
private bool isApproved;
public int getPersonId()
{
return personId;
}
public string getFirstName()
{
return firstName;
}
public string getLastName()
{
return lastName;
}
public bool getIsApproved()
{
return isApproved;
}
public void setPersonId(int personId)
{
this.personId = personId;
}
public void setFirstName(string firstName)
{
this.firstName = firstName;
}
public void setLastName(string lastName)
{
this.lastName = lastName;
}
public void setIsApproved(bool isApproved)
{
this.isApproved = isApproved;
}
}
사실 자바만 쓸 때는 불편한 걸 몰랐다. 하지만 C# 프로퍼티 자동구현을 보고 나니까 자바가 이상하게 보였다. 아래 C#의 프로퍼티로 작성한 Person 클래스를 보자.
public class CSPerson
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsApproved { get; set; }
}
이게 끝이다. 엄청난 축소이지 않은가? 가독성도 뛰어나다. 저 하나하나의 메소드를 변수처럼 사용할 수도 있다. 사실 getter/setter를 사용하는 건데, 모양이 마치 변수를 쓰는 것 같다. 아래와 같이 쓰면 된다.
CSPerson person = new CSPerson();
person.PersonId = "testId"; //setter
string myId = person.PersonId; //getter
아주 특이한 점은 멤버변수를 선언하지도 않았는데, 자동으로 변수가 있다고 생각해주는 것이다.
사실, 위의 C#코드도 컴파일러가 자바코드처럼 다 풀어서 쓴다. 그니까 우리가 보기에만 저렇게 보이고 실제 작동될 때는 큰 차이가 없다는 것이다. 하지만 간단하게 표현되니 가독성에 훨씬 좋은 것 같다.
번외
C#을 공부하며 Visual Studio를 적응해가는 중인데, 프로퍼티와 관련해서 쉽게 코딩하는 방법을 공유한다.
사실 프로퍼티가 간단하긴 한데, 저것도 일일이 다 써주기엔 귀찮다.
그렇다면, VS에서 ① prop을 입력하고 탭을 두번 치면, 자동으로 프로퍼티 기본양식이 생성된다.
그리고 ② 자료형과 변수명을 편집해주면 된다.
이때, ③ 또 탭을 누르면 자료형↔변수명 왔다갔다 할 수 있다.
④ 다 작성했을 때 엔터를 치면 다음 줄로 이동!
'개발 > C#' 카테고리의 다른 글
List - 리스트 (0) | 2020.07.14 |
---|---|
값형식과 참조형식 (0) | 2020.07.13 |
Stack and Heap (0) | 2020.07.13 |
? / ?? - C#의 물음표 (0) | 2020.07.13 |
Delegate - 델리게이트 (0) | 2020.07.11 |
댓글