학창 시절 C++ 시간에 배웠던 OOP, 그중에서도 Class의 강점에 대해 귀에 박히도록 들었던 말은...
'은닉성'
Encapsulation이라고도 하는 그놈이다.
은닉성을 가장 쉽게 구현하는 방법은 class의 멤버는 외부에서 직접 접근 가능하지 못하도록 private 또는 protected로 선언하고 class에서 지정한 방법으로만 접근 가능하도록 public 함수를 두는 것이다.
그러면 외부 사용자는 class의 멤버 변수들을 원하는 방식으로 조작할 수 없을 것이고, 그로 인한 장애나 버그도 발생할 일이 없을 것이다.
class에 선언된 멤버 변수에 대해 값을 설정하고, 또 값을 얻어오는 setter와 getter에 대한 함수를 class 내부에 별도로 선언해 놓는 것이 일반적이다.
class Test
{
private int value;
...
public void setValue(int value)
{
if(value > 0)
this.value = value;
}
public int getValue()
{
return this.value;
}
}
integer 멤버 변수 value에 대해 setter와 getter가 선언된 OOP적인(?) class의 모습이다.
물론 C#에서도 위 형태의 class 사용이 가능하나...만약 class 내부에 변수가 30개면 어떻게 될까....?
setter와 getter가 각각 30개씩...엄청난 노가다와 가독성(readability)이 현저히 떨어질 것이다.
그래서 C#에서는 속성(Property)라는 아주 좋은 기능을 제공한다.
C# Property
같은 기능을 하도록 Property를 사용해 보자. 아래처럼 변경하게 되면, 사용 방법이 바뀌는데 구조체 사용하듯이 사용하면 된다.
class Test
{
private int value;
public int _value
{
get { return value; }
set { this.value = value; }
}
}
void main()
{
Test test = new Test();
test.value = 10;
Console.WriteLine(test.value);
}
훨씬 간결해 지고 간단해졌다.
C# 자동구현 Property
C#에서 제공하는 정말 간결하게 하는 방법이 있다.
이 Property의 단점을 꼽자면...바로 '접근 제한자'가 public이어야 한다는 것 같다.
class Test
{
public int value { get; set; }
}
void main()
{
Test test = new Test();
test.value = 10;
Console.WriteLine(test.value);
}
MS Visual Studio에서는 Property 작성을 쉽게 할 수 있는 방법을 제공한다.
[prop]을 입력하고 [Tab] 키를 두 번 누르면 자동구현 Property 코드가 입력된다.
[propfull]을 입력하고 [Tab] 키를 두 번 누르면 C# Property 코드가 입력된다.
namespace WinFormTest
{
public partial class Form1 : Form
{
// prop + Tab 두번
public int MyProperty { get; set; }
// propfull + Tab 두번
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
}
입력된 코드의 class 명, 변수명만 원하는 값으로 변경해서 사용하면 끝.
'C#' 카테고리의 다른 글
[C#] Form Close에 따른 Disposed Exception (0) | 2023.03.29 |
---|---|
[C#] Collection, Generic Collection, ArrayList (0) | 2020.08.17 |
[C#] 클래스 배열, 객체 배열, Null Reference Exception (0) | 2020.08.13 |
[C#] 다른 파일, 다른 클래스 값/함수 사용 (1) | 2020.06.28 |
[C#] delegate, 폼 간의 DATA 공유 (2) | 2020.06.20 |