접근제한자 : 클래스, 변수, 메서드 등 접근의 범위를 제안하는 용어
public : 제한없이 어디서든 모든 클래스에서 접근 가능하다. (인스펙터창에서 보인다)
private : 자신의 클래스에서만 접근 가능하다. 타 클래스나 외부에서는 절대 접근할 수 없다.(기본값, 인스펙터창에서 보이지 않는다)
즉,
같은 스크립트에 여러 개의 클래스가 있어도 private 변수는 해당 클래스 내부에서만 사용 가능
ex)
Player.cs
public class Player : MonoBehaviour
{
public int health = 100; // 다른 스크립트에서 접근 가능, 인스펙터에서 노출
private int speed = 10; // 다른 스크립트에서 접근 불가능, 인스펙터 가림
void Start()
{
Debug.Log("초기 체력: " + health);
Debug.Log("속도: " + speed); //같은 클래스 내부이니 접근가능
}
public class Inventory
{
void CheckSpeed()
{
Debug.Log(speed); //오류 발생
//(Inventory 클래스는 Player 내부지만, Player의 private 변수에 접근 불가능)
}
}
}
Enemy.cs
Enemy.css```
public class Enemy : MonoBehaviour
{
void Attack(Player player) //플레이어 호출
{
player.health -= 10; // 다른 클래스에서도 접근 가능
Debug.Log("플레이어 공격! 남은 체력: " + player.health);
}
void CheckSpeed(Player player) //플레이어 호출
{
Debug.Log(player.speed); // 오류 발생 (Enemy에서는 접근 불가능)
}
protected
자신에 해당하는 클래스와 그 클래스를 상속받은 클래스에서만 접근 가능하다.
즉, private처럼 외부 클래스에서는 보이지 않지만, 상속받은 자식 클래스에서는 사용할 수 있다
protected는 같은 스크립트 안에 있든 없든 상관없이, "상속받은 자식 클래스"에서만 접근할 수 있다.
같은 하나의 스크립트에 있다고 해서 모든 클래스가 protected 변수에 접근할 수 있는 건 아니다.
반드시 상속(:)을 받은 클래스에서만 사용 가능하다.
한 스크립트 안에 protected가 있으면 모든 클래스에서 접근 가능하다? NO!
잘못된 예시)
public class Player
{
protected int health = 100; // protected 변수
}
public class Enemy //Player 상속받지 않음
{
void Attack(Player player)
{
Debug.Log(player.health); // 오류 발생
//(Enemy는 Player를 상속받지 않아서 접근 불가능)
}
}
같은 스크립트 안에 있어도
Enemy는 Player를 상속받지 않았으므로 protected 변수 health에 접근할 수 없다.
상속받은 클래스에서는 접근이 가능하다.
public class Player
{
protected int health = 100; // 상속받은 클래스에서만 접근 가능
}
public class Warrior : Player // Player 상속받음
{
void ShowHealth()
{
Debug.Log("전사의 체력: " + health); // 접근 가능
//(protected이므로 접근 가능)
}
}
Player를 상속받았기 때문에 Warrior는 'health' 사용 가능하다.
즉,
protected는 "같은 스크립트에 있느냐"가 중요한 게 아니라, "상속을 받았느냐"가 중요하다