2025.08.05 - [C#/C# 문법] - C# 중급 문법 (2) : 생성자와 캡슐화
C# 중급 문법 (2) : 생성자와 캡슐화
안녕하세요! 지난번에는 C# 객체 지향 프로그래밍의 기본인 클래스, 추상화, 인스턴스화에 대해 알아보았습니다. 클래스라는 설계도로 객체를 만들고, 그 복잡한 내부를 숨기는 추상화의 중요성
jinjin7576.tistory.com
캡슐화
캡슐화란 무엇인가? 한줄요약을 하자면 다음과 같다.
서로 연관있는 속성과 기능들을 하나의 캡슐(Capsule)로 만들어 데이터를 외부로부터 보호하는 것
캡슐화에는 크게 두 가지가 있다.
- 데이터 보호
- 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉
- 내부의 동작을 감추고 외부에는 필요한 부분만 노출
이를 위해 접근제한자와 get과 set을 이용한 프로퍼티화가 필요하고 사용된다고 볼 수 있다.
캡슐화에 대한 설명을 그림으로 나타낸다면 이와 같다.

클래스를 하나의 캡슐처럼 만드는 것이 객체 지향 프로그래밍에서 말하는 캡슐화인 것이다. 필요한 부분만 겉으로 드러나게 하고, 중요한 부분은 숨겨서 다른 클래스가 알지 못하게 만드는 것이다.
객체 간의 결합도
객체 간의 결합도에 대한 이야기는 어디서 들어봤을 것이라 생각한다. 캡슐화는 객체 간의 결합도를 조절하기 위해 필요한 것으로 캡슐화를 이해하려면 객체 간의 결합도에 대해서 이해를 해야한다.
다음 예시를 보자.
Car 클래스의 함수
-StartEngine()
-MoveFront()
-OpenWindow()
Driver 클래스의 함수
-Drive()
객체 간의 결합도가 높은 경우
public class Driver
{
string name;
Car car;
public Driver (string name, Car car)
{
this.name = name;
this.car = car;
}
private Drive()
{
car.StartEngine();
car.MoveFront();
car.OpenWindow();
}
}
위 코드에서는 Dirver가 car의 클래스인 Car의 StartEngine(), MoveFront(), OpenWindow()를 각각 실행시켰다. 이는 Driver 클래스가 Car 클래스의 로직와 내부 구조를 알고 있어야 한다는 것이다.
객체 간의 결합도가 낮은 경우
public class Car
{
private void StartEngin() {}
private void MoveFront() {}
private void OpenWindow() {}
public void Operate()
{
StartEngin();
MoveFront();
OpenWindow();
}
}
public class Driver
{
string name;
Car car;
public Driver (string name, Car car)
{
this.name = name;
this.car = car;
}
private Drive()
{
car.Operate();
}
}
이전 코드와 달라진 점은 다음과 같다. 기존에 호출하던 함수들을 모두 Operate()만 호출하면 모두 호출이 되게끔 바꾸었다.
Operate() 호출 --> StartEngine(), MoveFront(), OpenWindow() 호출
Car 클래스와 관련된 기능들은 온전히 Car 클래스 안에서만 관리되도록 하였고, 불필요한 내부 동작의 노출 최소화
Driver는 Car의 내부 구조를 알고 있지도 않고, 알 필요도 없어졌다는 것이다. 그래서 Car 클래스도 접근제한자도 기존의 public이었던 것을 private으로 변경하여 외부의 접근으로부터 내부의 함수들을 보호하였다.
마무리
이제 캡슐화에 대해 이해를 어느 정도 했을 것이라 생각한다. 클래스의 캡슐화를 통해서 객체 간의 결합도를 낮추어 복잡한 코드를 좀 더 간결하게 표현할 수 있다.
또한, 은닉화를 위해 프로퍼티화하면서 변수의 값을 정하는 set을 protected를 하여 외부 객체가 값을 변경하지 못하고 오직, 내부에서만 접근이 가능하도록 보호할 수도 있다.
이 부족한 글이 캡슐화의 관련성을 이해하는데 이 글이 도움이 되었으면 좋겠다고 생각하며 마무리를 하도록 하겠습니다.
안녕!
'C# > C# 문법' 카테고리의 다른 글
| 객체 지향 프로그램 - 다형성(多形性)이란 (0) | 2025.09.14 |
|---|---|
| 클래스와 구조체의 차이 (0) | 2025.09.13 |
| 추상 클래스와 인터페이스의 차이 (0) | 2025.09.11 |
| C# 중급 문법 (8) : 익명 메서드와 람다식 (0) | 2025.09.02 |
| C# 중급 문법 (7) : 델리게이트와 이벤트 (1) | 2025.08.31 |
