카테고리 없음

C# 접두사 Prefix 정리

wook101118 2026. 5. 28. 07:26

프로그래밍에서 접두사는 이름 앞에 붙는 글자나 단어를 의미한다.
영어로는 Prefix라고 부른다.

예를 들어 다음 변수명을 보자.

 
private int _hp;
 

여기서 _가 접두사처럼 사용되었다.
변수 이름 앞에 붙어서 이 변수가 어떤 성격을 가지는지 알려주는 역할을 한다.

또 다른 예시도 있다.

 
bool isDead;
bool hasItem;
bool canMove;
 

여기서 is, has, can도 접두사처럼 사용된다.
변수 이름만 봐도 이 값이 어떤 의미인지 쉽게 알 수 있다.


1. 접두사란?

접두사는 이름 앞에 붙어서 의미를 추가하는 표현이다.

프로그래밍에서는 변수, 메서드, 클래스, 인터페이스 등의 이름 앞에 붙어서 다음과 같은 정보를 알려줄 수 있다.

 
_isDead
m_hp
s_instance
IPlayer
TItem
 

각각의 접두사는 일정한 의미를 가진다.

예를 들어 IPlayer에서 I는 보통 인터페이스를 의미한다.

 
interface IPlayer
{
}
 

TItem에서 T는 제네릭 타입을 의미하는 경우가 많다.

 
class Inventory<TItem>
{
}
 

즉, 접두사는 이름을 더 이해하기 쉽게 만들어주는 표시라고 볼 수 있다.


2. 접두사를 사용하는 이유

접두사를 사용하는 가장 큰 이유는 코드를 읽기 쉽게 만들기 위해서이다.

예를 들어 다음 코드를 보자.

 
int hp;
 

이 변수만 보면 지역 변수인지, 클래스 안에 있는 필드인지 바로 알기 어렵다.

하지만 다음처럼 쓰면 느낌이 달라진다.

 
private int _hp;
 

_hp라고 쓰면 이 변수가 보통 클래스 내부에서 사용하는 private 필드라는 느낌을 줄 수 있다.

또 다른 예시를 보자.

 
bool dead;
 

이름이 조금 애매하다.

하지만 다음처럼 쓰면 훨씬 자연스럽다.

 
bool isDead;
 

isDead는 “죽었는가?”라는 뜻이 되어 true 또는 false 값을 가진다는 것을 알기 쉽다.


3. 변수에서 자주 쓰는 접두사

1) _ 접두사

C#에서 private 필드에 _를 붙이는 경우가 많다.

 
private int _hp;
private float _moveSpeed;
private string _playerName;
 

이 방식은 클래스 내부의 필드와 지역 변수를 구분하기 쉽게 해준다.

 
class Player
{
    private int _hp;

    public void SetHp(int hp)
    {
        _hp = hp;
    }
}
 

여기서 _hp는 클래스 안에 있는 필드이고, hp는 메서드의 매개변수이다.

 
_hp = hp;
 

왼쪽의 _hp는 객체가 가지고 있는 값이고, 오른쪽의 hp는 메서드로 전달받은 값이다.


2) m_ 접두사

m_은 member variable의 줄임말로 사용되는 경우가 있다.
즉, 클래스의 멤버 변수라는 뜻이다.

 
private int m_hp;
private float m_speed;
 

예전 C# 코드나 C++ 코드에서 자주 볼 수 있는 방식이다.

하지만 요즘 C#에서는 m_보다 _를 사용하는 경우가 더 흔하다.

 
private int _hp;
 

3) s_ 접두사

s_는 static 필드를 나타낼 때 사용되기도 한다.

 
private static int s_count;
private static GameManager s_instance;
 

static은 객체마다 따로 존재하는 값이 아니라 클래스 자체에 속하는 값이다.

 
class Enemy
{
    private static int s_enemyCount;
}
 

이렇게 쓰면 s_enemyCount가 static 변수라는 것을 이름만 보고 어느 정도 알 수 있다.


4) k_ 접두사

k_는 상수 값을 나타낼 때 사용되기도 한다.

 
private const int k_MaxHp = 100;
private const float k_MoveSpeed = 5f;
 

다만 C#에서는 상수 이름을 보통 파스칼 케이스로 쓰는 경우도 많다.

 
private const int MaxHp = 100;
 

따라서 k_는 반드시 써야 하는 규칙은 아니다.


4. bool 변수에서 자주 쓰는 접두사

bool 변수는 true 또는 false 값을 가진다.
그래서 이름을 질문처럼 만드는 경우가 많다.

1) is

is는 “~인가?”라는 뜻이다.

 
bool isDead;
bool isMoving;
bool isGrounded;
bool isAttacking;
 

예를 들어 isDead는 죽었는지 아닌지를 나타낸다.

 
if (isDead)
{
    Console.WriteLine("사망 상태");
}
 

2) has

has는 “가지고 있는가?”라는 뜻이다.

 
bool hasKey;
bool hasItem;
bool hasWeapon;
 

예를 들어 hasKey는 열쇠를 가지고 있는지 나타낸다.

 
if (hasKey)
{
    Console.WriteLine("문을 열 수 있음");
}
 

3) can

can은 “할 수 있는가?”라는 뜻이다.

 
bool canMove;
bool canAttack;
bool canJump;
 

예를 들어 canMove는 이동 가능한 상태인지 나타낸다.

 
if (canMove)
{
    Move();
}
 

4) should

should는 “해야 하는가?”라는 뜻이다.

 
bool shouldSave;
bool shouldAttack;
bool shouldRespawn;
 

어떤 행동을 해야 하는지 판단할 때 사용할 수 있다.


5) use

use는 “사용하는가?”라는 뜻으로 쓰일 수 있다.

 
bool useGravity;
bool useAnimation;
bool useSound;
 

기능을 켜고 끄는 설정값에 사용하기 좋다.


5. 메서드 이름에서 자주 쓰는 접두사

메서드 이름 앞에도 접두사처럼 자주 쓰이는 단어들이 있다.

1) Get

Get은 값을 가져온다는 뜻이다.

 
int GetHp()
{
    return hp;
}
 
 
string GetName()
{
    return name;
}
 

Get으로 시작하는 메서드는 보통 어떤 값을 반환한다.


2) Set

Set은 값을 설정한다는 뜻이다.

 
void SetHp(int value)
{
    hp = value;
}
 
 
void SetName(string value)
{
    name = value;
}
 

Set으로 시작하는 메서드는 보통 값을 변경한다.


3) Try

Try는 시도한다는 뜻이다.

보통 성공 여부를 bool로 반환할 때 많이 사용한다.

 
bool TryOpenDoor()
{
    if (hasKey)
    {
        return true;
    }

    return false;
}
 

C# 기본 문법에도 TryParse가 있다.

 
int result;

bool success = int.TryParse("123", out result);
 

TryParse는 문자열을 숫자로 변환하려고 시도하고, 성공했는지 bool로 알려준다.


4) On

On은 어떤 사건이 발생했을 때 실행되는 메서드에 자주 사용된다.

 
void OnPlayerDead()
{
}
 
 
void OnItemCollected()
{
}
 

Unity에서도 On으로 시작하는 메서드를 많이 볼 수 있다.

 
private void OnCollisionEnter(Collision collision)
{
}
 
 
private void OnTriggerEnter(Collider other)
{
}
 

이런 메서드는 특정 이벤트가 발생했을 때 호출된다.


5) Create

Create는 무언가를 생성한다는 뜻이다.

 
Enemy CreateEnemy()
{
    return new Enemy();
}
 
 
Item CreateItem()
{
    return new Item();
}
 

6) Init

Init은 Initialize의 줄임말이다.
초기화한다는 뜻이다.

 
void Init()
{
    hp = 100;
    speed = 5f;
}
 

객체나 시스템의 초기 상태를 설정할 때 사용한다.


7) Update

Update는 갱신한다는 뜻이다.

 
void UpdateHpUI()
{
}
 
 
void UpdateScore()
{
}
 

값이나 화면 상태를 새롭게 반영할 때 사용한다.


6. 인터페이스의 I 접두사

C#에서는 인터페이스 이름 앞에 I를 붙이는 관습이 있다.

 
interface IMovable
{
    void Move();
}
 
 
interface IDamageable
{
    void TakeDamage(int damage);
}
 

I는 Interface의 앞 글자이다.

그래서 이름만 봐도 이것이 클래스가 아니라 인터페이스라는 것을 알 수 있다.

 
class Player : IMovable, IDamageable
{
    public void Move()
    {
    }

    public void TakeDamage(int damage)
    {
    }
}
 

인터페이스 이름에는 보통 다음과 같은 형태가 많이 사용된다.

 
IRunnable
IAttackable
IDamageable
IInteractable
 

특히 ~able 형태는 “~할 수 있는”이라는 의미를 가진다.

IDamageable은 데미지를 받을 수 있는 대상이라는 의미로 볼 수 있다.


7. 제네릭의 T 접두사

제네릭에서는 타입 이름 앞에 T를 붙이는 경우가 많다.

 
class Box<T>
{
    public T value;
}
 

여기서 T는 Type을 의미한다.

제네릭 타입이 여러 개라면 이름을 더 구체적으로 만들 수 있다.

 
class Dictionary<TKey, TValue>
{
}
 

TKey는 key 타입을 의미하고, TValue는 value 타입을 의미한다.

직접 클래스를 만들 때도 사용할 수 있다.

 
class Repository<TEntity>
{
}
 
 
class ObjectPool<TObject>
{
}
 

이렇게 하면 제네릭 타입이 어떤 역할을 하는지 알기 쉽다.


8. 이벤트와 델리게이트에서 자주 쓰는 접두사

이벤트 메서드에는 On을 많이 사용한다.

 
public event Action PlayerDead;

private void OnPlayerDead()
{
    PlayerDead?.Invoke();
}
 

보통 On이벤트이름 형태는 이벤트를 발생시키는 메서드에 사용된다.

 
private void OnGameStarted()
{
}
 
 
private void OnGameOver()
{
}
 

또한 이벤트 이름 자체는 보통 과거형이나 명사형으로 작성한다.

 
public event Action GameStarted;
public event Action PlayerDied;
public event Action ItemCollected;
 

9. Unity에서 자주 보는 접두사

Unity에서는 메서드 이름에 특정 접두사가 많이 사용된다.

1) Awake

Awake는 오브젝트가 생성될 때 가장 먼저 실행되는 초기화 메서드이다.

 
private void Awake()
{
}
 

2) Start

Start는 첫 프레임이 시작되기 전에 한 번 실행된다.

 
private void Start()
{
}
 

3) Update

Update는 매 프레임마다 실행된다.

 
private void Update()
{
}
 

4) FixedUpdate

FixedUpdate는 일정한 물리 시간 간격으로 실행된다.

 
private void FixedUpdate()
{
}
 

5) OnTriggerEnter

Trigger 충돌이 시작되었을 때 실행된다.

 
private void OnTriggerEnter(Collider other)
{
}
 

6) OnCollisionEnter

일반 충돌이 시작되었을 때 실행된다.

 
private void OnCollisionEnter(Collision collision)
{
}
 

Unity 메시지 메서드는 이름이 정확해야 자동으로 호출된다.
그래서 대소문자까지 정확하게 작성해야 한다.


10. 접두 연산자

접두사는 이름에만 사용되는 것은 아니다.
연산자에서도 접두라는 표현을 사용한다.

대표적으로 ++i와 --i가 있다.

 
int i = 0;

++i;
 

++i는 접두 증가 연산자라고 볼 수 있다.
변수 앞에 ++가 붙어 있기 때문이다.

반대로 i++는 후위 증가 연산자이다.

 
int i = 0;

i++;
 

둘 다 i 값을 1 증가시키지만, 값을 사용하는 순간에 차이가 있다.

 
int a = 0;
int b = ++a;
 

이 경우 먼저 a가 1 증가하고, 그 값이 b에 들어간다.

 
a = 1
b = 1
 

반대로 다음 코드를 보자.

 
int a = 0;
int b = a++;
 

이 경우 먼저 현재 a 값인 0이 b에 들어가고, 그다음 a가 1 증가한다.

 
a = 1
b = 0
 

즉, ++a는 먼저 증가하고 사용하고, a++는 먼저 사용하고 증가한다.


11. 접두사와 접미사의 차이

접두사는 이름 앞에 붙는 것이다.

 
isDead
_hasKey
IPlayer
TItem
 

접미사는 이름 뒤에 붙는 것이다.

 
playerCount
enemyList
itemArray
 

예를 들어 isDead에서 is는 접두사이다.

 
bool isDead;
 

enemyList에서 List는 접미사처럼 사용된다.

 
List<Enemy> enemyList;
 

접두사는 앞에서 의미를 알려주고, 접미사는 뒤에서 자료의 종류나 역할을 알려주는 경우가 많다.


12. 헝가리안 표기법

접두사와 관련해서 헝가리안 표기법이라는 방식도 있다.

헝가리안 표기법은 변수 이름 앞에 자료형이나 의미를 나타내는 접두사를 붙이는 방식이다.

 
int iCount;
string strName;
float fSpeed;
bool bIsDead;
 

여기서 i, str, f, b는 각각 자료형을 나타낸다.

 
iCount = int
strName = string
fSpeed = float
bIsDead = bool
 

하지만 현대 C#에서는 이런 방식은 많이 권장되지 않는다.

왜냐하면 C#은 IDE에서 자료형을 쉽게 확인할 수 있고, 변수의 자료형이 바뀌면 이름까지 바꿔야 하기 때문이다.

예를 들어 iCount가 나중에 long으로 바뀐다면 이름도 바꿔야 한다.

 
long iCount;
 

이렇게 되면 이름과 실제 자료형이 맞지 않게 된다.

그래서 현대 C#에서는 자료형을 접두사로 붙이기보다 의미 있는 이름을 사용하는 것이 더 좋다.

 
int enemyCount;
string playerName;
float moveSpeed;
bool isDead;
 

13. 좋은 접두사 사용 예시

다음은 접두사를 적절하게 사용한 예시이다.

 
class Player
{
    private int _hp;
    private bool _isDead;

    public bool IsDead
    {
        get
        {
            return _isDead;
        }
    }

    public void TakeDamage(int damage)
    {
        if (_isDead)
        {
            return;
        }

        _hp -= damage;

        if (_hp <= 0)
        {
            _isDead = true;
            OnDead();
        }
    }

    private void OnDead()
    {
        Console.WriteLine("사망 처리");
    }
}
 

이 코드에서 _hp와 _isDead는 private 필드라는 것을 나타낸다.

 
private int _hp;
private bool _isDead;
 

IsDead는 외부에서 읽는 프로퍼티이다.

 
public bool IsDead
 

OnDead는 사망 이벤트가 발생했을 때 실행되는 메서드처럼 보인다.

 
private void OnDead()
 

이처럼 접두사를 잘 사용하면 코드의 역할이 더 분명해진다.


14. 나쁜 접두사 사용 예시

접두사를 너무 많이 붙이면 오히려 코드가 지저분해질 수 있다.

 
private int m_i_player_hp_value;
 

이름이 너무 길고 복잡하다.

더 간단하게 쓰는 것이 좋다.

 
private int _hp;
 

또는 더 의미 있게 쓸 수도 있다.

 
private int _currentHp;
 

또한 자료형을 굳이 이름에 넣는 것도 좋지 않은 경우가 많다.

 
string strPlayerName;
int iEnemyCount;
float fMoveSpeed;
 

현대 C#에서는 보통 다음처럼 쓴다.

 
string playerName;
int enemyCount;
float moveSpeed;
 

접두사는 코드를 편하게 읽기 위해 사용하는 것이지, 이름을 복잡하게 만들기 위해 사용하는 것이 아니다.


15. 접두사 사용 시 주의할 점

첫 번째로, 프로젝트 안에서 규칙을 통일하는 것이 중요하다.

어떤 파일에서는 _hp를 쓰고, 다른 파일에서는 m_hp를 쓰면 코드 스타일이 섞인다.

 
private int _hp;
private int m_damage;
 

이런 식으로 섞이면 코드가 지저분해 보일 수 있다.

하나의 프로젝트에서는 한 가지 스타일을 정해서 사용하는 것이 좋다.

 
private int _hp;
private int _damage;
private float _speed;
 

두 번째로, 접두사를 너무 많이 붙이지 않는 것이 좋다.

 
private bool b_is_can_move_flag;
 

이런 이름은 읽기 어렵다.

더 간단하게 쓰는 것이 좋다.

 
private bool _canMove;
 

세 번째로, 접두사보다 이름의 의미가 더 중요하다.

 
int value;
 

이름이 너무 애매하다.

 
int enemyCount;
 

이렇게 쓰면 접두사가 없어도 의미가 명확하다.


16. C#에서 추천할 만한 이름 스타일

C#에서는 보통 다음과 같은 스타일을 많이 사용한다.

클래스 이름

클래스 이름은 파스칼 케이스를 사용한다.

 
class PlayerController
{
}
 
 
class EnemySpawner
{
}
 

메서드 이름

메서드 이름도 파스칼 케이스를 사용한다.

 
void Move()
{
}
 
 
void TakeDamage()
{
}
 

public 프로퍼티 이름

프로퍼티도 파스칼 케이스를 사용한다.

 
public int Hp { get; private set; }
 
 
public bool IsDead { get; private set; }
 

private 필드 이름

private 필드는 _ 접두사와 카멜 케이스를 사용하는 경우가 많다.

 
private int _hp;
private float _moveSpeed;
private bool _isDead;
 

지역 변수 이름

지역 변수는 카멜 케이스를 사용한다.

 
int enemyCount;
float moveSpeed;
bool isDead;
 

17. 접두사를 꼭 써야 할까?

접두사는 반드시 써야 하는 문법은 아니다.
사용하지 않아도 코드는 정상적으로 작동한다.

 
private int hp;
 

이 코드도 문제없이 사용할 수 있다.

하지만 접두사를 사용하면 코드의 의미를 더 쉽게 파악할 수 있다.

 
private int _hp;
 

특히 필드와 매개변수 이름이 비슷할 때 도움이 된다.

 
private int _hp;

public void SetHp(int hp)
{
    _hp = hp;
}
 

접두사를 사용하지 않으면 this를 사용할 수도 있다.

 
private int hp;

public void SetHp(int hp)
{
    this.hp = hp;
}
 

둘 다 가능하다.

 
_hp = hp;
 
 
this.hp = hp;
 

어떤 방식을 사용할지는 프로젝트의 코드 스타일에 따라 정하면 된다.


18. 접두사 정리표

접두사의미예시
_ private 필드 _hp, _moveSpeed
m_ 멤버 변수 m_hp, m_speed
s_ static 필드 s_instance, s_count
k_ 상수 k_MaxHp
is 상태 여부 isDead, isMoving
has 소유 여부 hasKey, hasItem
can 가능 여부 canMove, canAttack
should 해야 하는지 여부 shouldSave
Get 값 가져오기 GetHp()
Set 값 설정하기 SetHp()
Try 시도하기 TryParse()
On 이벤트 발생 처리 OnDead()
I 인터페이스 IDamageable
T 제네릭 타입 TItem, TKey

19. 정리

접두사는 이름 앞에 붙어서 의미를 추가하는 표현이다.

프로그래밍에서는 변수, 메서드, 클래스, 인터페이스 이름에 접두사를 붙여서 그 대상의 역할을 더 쉽게 알 수 있게 한다.

예를 들어 private 필드에는 _를 붙일 수 있다.

 
private int _hp;
 

bool 변수에는 is, has, can 같은 접두사를 자주 사용한다.

 
bool isDead;
bool hasKey;
bool canMove;
 

메서드에는 Get, Set, Try, On 같은 접두사가 자주 사용된다.

 
GetHp()
SetHp()
TryOpenDoor()
OnPlayerDead()
 

인터페이스에는 I, 제네릭 타입에는 T를 붙이는 관습도 있다.

 
interface IDamageable
{
}
 
 
class Box<T>
{
}
 

하지만 접두사는 무조건 많이 붙인다고 좋은 것이 아니다.
너무 많은 접두사는 오히려 코드를 읽기 어렵게 만든다.

중요한 것은 프로젝트 안에서 규칙을 통일하고, 이름만 봐도 역할을 알 수 있게 작성하는 것이다.

결론적으로 접두사는 코드의 의미를 더 빠르게 이해하게 도와주는 이름 작성 방식이라고 정리할 수 있다.