접근 제한자 심화

C#의 접근 제한자(public, private)를 학습합니다. 각 제한자를 언제 사용하는지와 그 차이점을 이해합니다.

접근 제한자 종류

변수(variable)나 함수(function) 앞에 붙여서 어디서 사용할 수 있는지 정하는 키워드입니다.

public (공개)

  • 설명: 어디서든 접근 가능
  • Unity Inspector: 보이고 수정 가능
  • 다른 클래스(class): 접근 가능
public class Player : MonoBehaviour
{
    public string playerName = "플레이어";  // Inspector에서 보임, 다른 클래스에서 접근 가능
    public int hp = 100;                    // Inspector에서 수정 가능
    
    public void Attack()  // 다른 클래스에서 호출 가능
    {
        Debug.Log(playerName + "이(가) 공격합니다!");
    }
}

// 다른 클래스에서 사용
public class CombatSystem : MonoBehaviour
{
    public Player player;
    
    void Start()
    {
        player.playerName = "용사";  // public이므로 접근 가능
        player.hp = 150;              // public이므로 접근 가능
        player.Attack();              // public이므로 호출 가능
    }
}

private (비공개)

  • 설명: 같은 클래스(class) 안에서만 사용 가능
  • Unity Inspector: 보이지 않음
  • 다른 클래스(class): 접근 불가능
  • 상속(inheritance)받은 클래스(class): 접근 불가능
public class Player : MonoBehaviour
{
    public int hp = 100;
    
    private int maxHp = 100;        // Inspector에서 안 보임, 다른 클래스에서 접근 불가
    private int experience = 0;     // 내부에서만 관리
    
    public void TakeDamage(int damage)
    {
        hp -= damage;
        CheckDeath();  // private 함수는 같은 클래스 내에서만 호출 가능
    }
    
    private void CheckDeath()  // 다른 클래스에서 호출 불가
    {
        if (hp <= 0)
        {
            Die();
        }
    }
    
    private void Die()
    {
        Debug.Log("플레이어가 사망했습니다.");
        // 게임 오버 처리 등
    }
}

// 다른 클래스에서 사용 시도
public class Enemy : MonoBehaviour
{
    public Player player;
    
    void Attack()
    {
        player.TakeDamage(10);  // ✅ public 함수는 호출 가능
        
        // player.maxHp = 200;  // ❌ 에러! private 변수는 접근 불가
        // player.CheckDeath();  // ❌ 에러! private 함수는 호출 불가
    }
}

접근 제한자 생략 시

  • 변수(variable)나 함수(function) 앞에 아무것도 안 쓰면: private과 동일하게 동작
  • C#의 기본값: 접근 제한자를 생략하면 자동으로 private이 됨
public class Human : MonoBehaviour
{
    int myAge;        // private과 동일 (생략 시)
    float myHeight;   // private과 동일 (생략 시)
    
    void PowerPush() {  // private과 동일 (생략 시)
        Debug.Log("싼다");
    }
}

접근 제한자 비교표

접근 제한자 같은 클래스(class) 자식 클래스(class) 다른 클래스(class) Unity Inspector
public ✅ 보임
private ❌ 안 보임
생략 ❌ 안 보임

언제 무엇을 사용할까?

public 사용

  • Unity Inspector에서 값을 설정하고 싶을 때
    • 예: public int maxHp = 100; - Inspector에서 체력 조정
  • 다른 스크립트에서 접근해야 할 때
    • 예: CombatSystem에서 Playerhp 확인
  • 자식 클래스(class)에서 사용해야 할 때
    • 예: Enemy 클래스(class)를 상속(inheritance)받은 Goblin에서 부모의 변수(variable) 사용

게임 개발 예시:

public class Player : MonoBehaviour
{
    public int hp = 100;           // Inspector에서 설정 가능
    public string playerName;     // 다른 스크립트에서 접근 가능
    public Transform target;      // Inspector에서 드래그 앤 드롭 가능
}

private 사용

  • 클래스(class) 내부에서만 사용하는 변수(variable)/함수(function)
    • 예: 내부 계산용 변수(variable), 헬퍼 함수(function)
  • 외부에서 접근하면 안 되는 중요한 데이터
    • 예: 비밀번호, 내부 상태 변수(variable)
  • 코드의 안전성을 높이고 싶을 때
    • 예: 직접 수정하면 안 되는 변수(variable)는 private으로 보호

게임 개발 예시:

public class Player : MonoBehaviour
{
    public int hp = 100;
    
    private int maxHp = 100;        // 내부에서만 사용
    private bool isDead = false;    // 외부에서 직접 변경하면 안 됨
    
    private void CalculateDamage()  // 내부 계산 함수
    {
        // 복잡한 데미지 계산 로직
    }
    
    public void TakeDamage(int damage)
    {
        if (!isDead)  // private 변수로 상태 확인
        {
            hp -= damage;
            CalculateDamage();  // private 함수 호출
        }
    }
}

← 목차로 돌아가기