[C#] 5. 캡슐화

C#에서는 프로그램 목적에 맞게 사용자가 형식을 정의할 수 있습니다. C#에서 사용자가 형식을 정의하기 위한 문법으로 클래스와 구조체, 열거형 등을 제공하고 있는데 열거형에 대해서는 앞에서 다루었으며 여기에서는 클래스와 구조체에 대해 알아봅시다.

클래스와 구조체는 여러 개의 멤버를 하나의 형식으로 묶어 하나의 형식으로 정의할 수 있습니다. 이와 같은 작업을 캡슐화라고 하는데 C언어에서는 구조체만 제공하고 있으며 캡슐화 대상도 멤버 필드(멤버 변수)로 한정되어 있었습니다.

C++언어에서는 클래스를 제공하고 구조체와 클래스에 캡슐화 대상이 멤버 필드뿐만 아니라 멤버 메서드도 캡슐화 대상입니다. 그리고 C언어는 캡슐화된 멤버에 접근 지정자를 제공하고 않아서 모든 멤버에 접근할 수 있습니다. 이는 정보 은닉이 필요한 멤버들을 충분히 은닉하지 못하게 되어 데이터의 신뢰성이 낮아집니다. 하지만 C++과 C#에서는 캡슐화하는 멤버에 접근 지정할 수 있어 데이터의 신뢰성을 높일 수 있습니다. 특히, C#에서는 서로 다른 모듈 사이에서의 접근 지정자를 지정하기 쉽게 되어 있어 컴포넌트 기반의 프로그램을 제작하는 경우에 더욱 높은 신뢰성을 추구할 수 있습니다.

그리고 C#에서는 다른 클래스를 기반으로 파생 클래스를 정의할 수 있도록 상속을 제공합니다. 상속을 사용하면 여러 형식의 공통적인 부분을 기반 형식에서 정의하고 이를 기반으로 파생 형식에서는 다른 부분만 정의할 수 있습니다. 또한, 기반 형식의 변수로 파생된 개체를 참조할 수 있고 파생 클래스에서 기반 클래스에 정의한 멤버 메서드를 재정의할 수 있습니다. 이러한 OOP의 특징을 다형성이라 합니다. 이번 장에서는 캡슐화에 대해서만 다루고 상속과 다형성은 다음 장에서 설명할게요.

C#에서 캡슐화에 대한 문법 사항은 크게 캡슐화할 수 있는 대상은 무엇인가에 대한 사항과 정보의 신뢰성을 유지하기 위해 접근 한정자 그리고 정적 멤버와 비 정적 멤버가 있습니다. 이번 장에서는 이러한 캡슐화에 대한 문법과 참조 형식인 클래스와 값 형식인 구조체를 사용할 때 차이에 대해서 간략하게 다루겠습니다.

그리고 C#에서 캡슐화 문법은 구조체와 클래스가 대부분 같거나 유사하므로 여기에서는 클래스를 예로 설명하겠습니다. 물론, 서로 다른 문법이 있을 때는 별도로 언급할게요.