접근제한자에 대해

옙권·2025년 3월 23일

접근제한자 : 클래스, 변수, 메서드 등 접근의 범위를 제안하는 용어

자주 쓰이는 접근제한자 용어

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 변수에 접근할 수 있는 건 아니다.

반드시 상속(:)을 받은 클래스에서만 사용 가능하다.

내가 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에 접근할 수 없다.

올바른 protected 사용법

상속받은 클래스에서는 접근이 가능하다.

public class Player
{
    protected int health = 100;  // 상속받은 클래스에서만 접근 가능
}

public class Warrior : Player  //  Player 상속받음
{
    void ShowHealth()
    {
        Debug.Log("전사의 체력: " + health);  // 접근 가능 
        									//(protected이므로 접근 가능)
    }
}

Player를 상속받았기 때문에 Warrior는 'health' 사용 가능하다.

즉,
protected는 "같은 스크립트에 있느냐"가 중요한 게 아니라, "상속을 받았느냐"가 중요하다

0개의 댓글