접근 제한자는 클래스, 변수, 함수(메서드) 등 객체 지향 프로그래밍 요소의 접근 가능 범위를 지정하는 키워드이다.
코드의 특정 멤버가 클래스 내부, 외부, 자식 클래스 등에서 어떤 범위로 접근될 수 있는지 명확하게 제한 한다.
public int health;
private int score;
protected float speed;
캡슐화를 위한 기본 도구이며, 외부 접근을 제한하기 무분별한 외부 참조나 실수를 방지 할 수 있고, 또 다른 사람이 코드를 읽을때 ‘외부에서 사용되는구나’ 하는 가독성 측면에서 장점이 있다. 실제로 타인의 코드를 볼때 전부다 public 으로 되어있으면 시작부터 굉장한 스트레스를 받고 시작하는 경우가 더러 있었다.
캡슐화는 객체 지향 프로그래밍의 4대 특징 중 하나로, 데이터와 그 데이터를 처리하는 메서드를 하나로 묶고,
외부로부터 데이터를 보호(은닉)하는 개념이다.
즉, 내부 구현 내용을 숨기고, 외부에서는 지정된 인터페이스(메서드, 프로퍼티)만을 통해 접근하도록 제한한다.
캡슐화의 목적으로는 주로 다음과 같다.
주로 private 접근 제한자를 사용하여 변수(필드)를 숨기고,
외부에서 값을 읽거나 쓸 필요가 있을 때는 public 메서드(getter/setter) 또는 프로퍼티(property) 를 사용한다.
public class Player
{
private int health; // 직접 접근 불가
// Getter, Setter 메서드
public int GetHealth()
{
return health;
}
public void SetHealth(int value)
{
// 유효성 검사 등의 로직 추가 가능
health = value;
}
// 또는 C# 프로퍼티
public int Health
{
get { return health; }
set { health = value; }
}
}
public class Enemy : MonoBehaviour
{
[SerializeField]
private int hp; // Inspector 노출, 외부 직접 접근 불가
public int Hp // 외부에서 읽기 전용
{
get { return hp; }
}
}
프로퍼티(Property)는 객체 지향 프로그래밍(C#)에서 필드의 값을 안전하게 읽거나 쓸 수 있도록 제공하는 특수한 메서드 집합이다.
즉, 필드(변수)에 직접 접근하지 않고, get/set 접근자를 통해 간접적으로 값에 접근할 수 있는 기능이다
목적
캡슐화 강화: 필드에 대한 직접적인 접근을 막고, 값의 읽기/쓰기를 통제할 수 있습다.
데이터 무결성 유지: 값을 변경할 때 유효성 검사, 로깅, 트리거 등의 부가적인 로직을 삽입할 수 있다.
외부와의 인터페이스 제공: 외부에서 필드를 사용하는 방식은 단순하지만, 내부적으로는 세밀한 제어가 가능하다.
value는 set 접근자 내부에서 대입되는 값을 나타낸다.
private int age; // private 필드
public int Age // 프로퍼티
{
get { return age; } // 값을 읽을 때 실행
set { age = value; } // 값을 쓸 때 실행
}
읽기 전용/쓰기 전용
public int Age
{
get { return age; }
}
// 쓰기 전용
public int Age
{
set { age = value; }
}
자동구현 프로퍼티
간단히 값을 저장하고 반환하는 경우, C#에서는 자동 구현 프로퍼티 문법을 제공한다.
public int Age { get; set; }
활용
프로퍼티를 사용하면, 값의 변경에 제약을 두거나 안전하게 값을 변경 할 수 있다.
private int hp;
public int Hp
{
get { return hp; }
set
{
if (value < 0)
hp = 0; // 0 이하로 내려가지 않도록 제약
else
hp = value;
}
}