객체지향 - 캡슐화와 정보 은닉
캡슐화는 올바른 추상화와 정보 은닉을 통해 이루어진다.
추상화는 저번 포스팅에서 다뤄보았다
: 2019/12/12 - [프로그래밍/c#] - [C# / 객체지향] 2. 추상화는 무엇일까
간단히 말해 캡슐 안에는 관련된 정보가 들어 있어야 한다는 뜻이다.
(감기약 캡슐 안에 소화제가 들어 있다면 쓰기가 매우 어려울 것이다.)
추상화가 잘 되고 나면, 남은 것은 정보 은닉인데 정보 은닉은 클래스의 멤버를 외부에 노출시키지 않는 것을 말한다.
당연히 완벽한 정보 은닉은 불가능하다. 애초에 그러면 클래스가 쓸데 없어진다.
노출해야 하는 것은 노출하되, 노출할 필요가 없는 것은 모두 숨겨야 한다.
이전 포스팅에서 사용했던 예제를 들고 와보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Student
{
string name;
public static int CountOfStudents;
static Student()
{
CountOfStudents = 0;
}
public Student(string name)
{
this.name = name;
CountOfStudents++;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
CountOfStudents가 public으로 선언되어 있다.
멤버들은 접근 제한자를 따로 명시하지 않으면 private으로 설정된다.
따라서 정보 은닉을 달성하기 위해 public을 지워서 접근 제한자를 private으로 바꿔주자.
그러면 이런 오류가 날 것이다.
접근 제한자가 private으로 바뀌었기 때문에 다른 클래스에서 CountOfStudents 를 사용할 수 없는 것이다.
따라서 이를 해결하려면 프로퍼티라는 특별한 메서드(프로퍼티)를 이용해야 한다.
프로퍼티(property)
프로퍼티의 구조는 다음과 같다.
[접근 제한자] [타입] [프로퍼티 명]
{
[접근 제한자] get { }
[접근 제한자] set { }
}
이제 예제를 프로퍼티를 사용해 수정해보자.
프로퍼티로 제어하는 멤버가 정적 멤버이기 때문에 static 키워드를 붙여 프로퍼티 역시 정적 멤버로 만들어주자.
물론 이 프로퍼티를 정적 멤버로 만들지 않더라도 인스턴스 멤버를 통해 호출하는 식으로 사용이 가능하긴 하다.
근데 굳이 그럴 필요는 없으니 정적 멤버로 만들자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
using System;
namespace example
{
class Program
{
static void Main(string[] args)
{
Student student1 = new Student("A");
Student student2 = new Student("B");
Student student3 = new Student("C");
Console.WriteLine(Student.NumberOfStudents);
}
}
class Student
{
string name;
static int CountOfStudents;
static Student()
{
CountOfStudents = 0;
}
public Student(string name)
{
this.name = name;
CountOfStudents++;
}
public static int NumberOfStudents
{
get { return CountOfStudents; }
set { CountOfStudents = value; }
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
프로퍼티는 메서드이지만 매개변수를 가질 수 없기 때문에 외부에서 제공하는 정보를 담는데 특별한 예약어 value가 쓰인다.
그런데 생각해보면 인스턴스를 만들 때마다 증가하는 이 변수를 인위적으로 수정할 일은 없어 보인다.
따라서 set 부분을 지워주면 다른 클래스에서는 CountOfStudents 의 값을 읽기만 할 수 있고, 변경할 수 있는 방법은 없다.
이로써 정보 은닉이 이루어지게 되었다.
'C#' 카테고리의 다른 글
[C# / 객체지향] 8. 다형성 - 메서드 오버라이드 (Method Override) (0) | 2019.12.19 |
---|---|
[C# / 객체지향] 7. 클래스 상속 (class inheritance) (0) | 2019.12.17 |
[C# / 객체지향] 5. 네임스페이스(namespace) (0) | 2019.12.15 |
[C# / 객체지향] 4. 정적(Static) 멤버 (0) | 2019.12.14 |
[C# / 객체지향] 3. 추상화와 클래스(Class) (0) | 2019.12.13 |