접근 제한자 종류
변수(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에서Player의hp확인
- 예:
- 자식 클래스(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 함수 호출
}
}
}