C#은 객체 지향 언어입니다. 객체 지향 언어에 클래스가 빠질 수 없겠죠?
C#도 마찬가지로 클래스 안에 필드와 메서드가 존재합니다.
class Player
{
private int maxHealth;
private int health;
public Player()
{
maxHealth = 100;
health = maxHealth;
}
public Move()
{
Console.WriteLine("Player 이동!");
}
}
class Monster
{
private int maxHealth;
private int health;
public Monster()
{
maxHealth = 100;
health = maxHealth;
}
public Move()
{
Console.WriteLine("Monster 이동!");
}
}
maxHealth
와 health
를 필드로 가지고, Move()
를 메서드로 가지는 간단한 Player
와 Monster
클래스입니다. 플레이어와 몬스터가 있으면 서로 싸워야겠죠? 프로퍼티를 이용해 Attack()
메서드를 작성해 보겠습니다.
class Player
{
private int maxHealth;
private int health;
public int Health
{
get
{
return health;
}
set
{
health = Math.Clamp(value, 0, maxHealth);
}
}
public Player()
{
maxHealth = 100;
health = maxHealth;
}
public void Move()
{
Console.WriteLine("Player 이동!");
}
public void Attack(Monster target)
{
target.Health -= 10;
}
}
class Monster
{
private int maxHealth;
private int health;
public int Health
{
get
{
return health;
}
set
{
health = Math.Clamp(value, 0, maxHealth);
}
}
public Monster()
{
maxHealth = 100;
health = maxHealth;
}
public void Move()
{
Console.WriteLine("Monster 이동!");
}
public void Attack(Player target)
{
target.Health -= 10;
}
}
Attack()
메서드를 보시면, health
필드는 private
으로 선언되어 있어 클래스 외부에서 접근할 수 없지만, Health
프로퍼티를 이용하여 health
의 값을 변경했습니다.
public int Health
{
get
{
return health;
}
set
{
health = Math.Clamp(value, 0, maxHealth);
}
}
프로퍼티 선언 부분을 자세히 보겠습니다.
프로퍼티 이름은 필드 이름의 첫 글자만 대문자로 바꿔 정합니다.
프로퍼티의 본문은 get
접근자와 set
접근자로 구성되어 있습니다.
get
접근자 안의 실행문은 필드의 값을 반환할 때 실행되며, 실행문 안에 반환문이 들어갑니다.
set
접근자 안의 실행문은 필드에 값을 할당할 때 실행되며, value
키워드로 할당할 값을 가져옵니다.
private int power = 10;
public int Power
{
get
{
return power;
}
set
{
power = value;
}
}
위와 같은 기본적인 코드는 다음과 같이 간단하게 정의할 수도 있습니다.
public int Power
{
get;
set;
} = 10;
아래는 Power
프로퍼티까지 적용한 Player
클래스입니다.
Class Player
{
private int maxHealth;
private int health;
public int Health
{
get
{
return health;
}
set
{
health = Math.Clamp(value, 0, maxHealth);
}
}
public int Power
{
get;
set;
} = 10;
public Player()
{
maxHealth = 100;
health = maxHealth;
}
public void Move()
{
Console.WriteLine("Player 이동!");
}
public void Attack(Monster target)
{
target.Health -= this.Power;
}
}
또한, 프로퍼티에 get
접근자만 구현하면 반환만 가능하고 할당이 안되도록, set
접근자만 구현하면 할당만 가능하고 반환이 안되도록 할 수 있습니다.
public string Name
{
get;
} = "Diana";
// 오류!
Player.Name = "Clare";
지금까지 프로퍼티를 사용하여 단계별로 코드를 작성해 보았는데요, 프로퍼티의 장점은 다음과 같습니다.
1. 클래스의 데이터를 직접 접근하지 않으므로 객체의 은닉성을 지킬 수 있습니다.
2. getter
, setter
메서드를 일일히 구현하는 것에 비해 코드가 간결합니다.
3. 함수를 호출하는 방식이 아니라 일반적인 변수를 사용하는 것처럼 작성이 가능하여 코드가 친숙하고 가독성이 좋습니다.
C# 개발에서 꼭 빼놓을 수 없는 프로퍼티! 적재적소에 사용하면 좋은 코드를 작성할 수 있습니다.
읽어주셔서 감사합니다.