협업을 진행하다보면, 캡슐화가 되지 않은 코드를 볼 수 있다.
캡슐화가 좋다는 것은 알지만, 나도 정확하게 설명할 수 있게 공부를 했다.
객체 지향 프로그래밍의 핵심 원칙 중 하나로, 데이터와 데이터를 조작하는 메서드를 하나의 '클래스'라는 캡슐로 묶는 것을 말한다.
이를 통해 데이터가 외부에서 직접 접근되는 것을 방지하고, 오직 클래스 내부의 메서드를 통해서만 데이터에 접근할 수 있게 한다.
이렇게 함으로써 데이터의 안정성과 유지보수성이 향상된다.
만약 필요한 경우 클래스 내부 구현은 변경할 수 있지만, 외부에 공개된 메서드(인터페이스)는 동일하게 유지될 수 있어 코드 변경에 따른 영향을 최소화할 수 있다.
Unity 게임 개발에서도 C# 언어의 캡슐화 원칙을 활용할 수 있다.
public class Player : MonoBehaviour
{
private int health; // Private variable
// Public method to access the private variable
public int GetHealth()
{
return health;
}
// Public method to modify the private variable
public void SetHealth(int value)
{
if (value < 0)
health = 0;
else
health = value;
}
}
위 코드에서 health 변수는 private으로 선언되었으므로 클래스 외부에서 직접적으로 접근할 수 없다.
대신 GetHealth()와 SetHealth(int value)라는 메서드를 통해서만 체력 정보에 접근하거나 수정할 수 있다.
특히 SetHealth(int value) 메서드에서 입력값이 음수인 경우 체력 값을 0으로 설정하여, 체력 값이 음수가 되는 상황을 방지한다. 이처럼 캡슐화를 통해 데이터의 유효성을 보장하는 로직을 추가할 수 있다.
C#에서는 프로퍼티(Property)라는 기능을 제공하여 필드(Field)에 직접 접근하는 것처럼 보이지만 실제로는 메서드를 통해 접근하도록 하는 방법을 제공한다.
이를 사용하면 GetHealth()와 SetHealth(int value) 메서드를 간결하게 작성할 수 있다.
public class Player : MonoBehaviour
{
private int health; // Private variable
// Property to access and modify the private variable
public int Health
{
get { return health; }
set { health = (value < 0) ? 0 : value; }
}
}
Player player = new Player();
player.Health = 10; // Set health to 10
int currentHealth = player.Health; // Get current health
위와 같이 사용할 수 있으며, 여전히 health 필드에 직접 접근하는 것은 불가능하다.