C# 톺아보기 - 프로퍼티(Property)

Yujun Cho·2022년 5월 31일
0

C# 톺아보기

목록 보기
1/1

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 이동!");
  }
}

maxHealthhealth를 필드로 가지고, Move()를 메서드로 가지는 간단한 PlayerMonster 클래스입니다. 플레이어와 몬스터가 있으면 서로 싸워야겠죠? 프로퍼티를 이용해 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# 개발에서 꼭 빼놓을 수 없는 프로퍼티! 적재적소에 사용하면 좋은 코드를 작성할 수 있습니다.
읽어주셔서 감사합니다.

profile
Whatever I want.

0개의 댓글