속성

상태
완료
담당자
날짜
숫자
0
속성(properties)은 클래스나 구조체에서 필드의 접근을 제어하는 중요한 기능입니다. 객체의 상태를 저장하고, 수정하며, 검증하는 데 매우 유용하게 사용되죠. 이번에는 속성이란 무엇인지 어떻게 활용되는지 자세히 알아보겠습니다.

속성이란?

속성은 필드(Field)와 메서드(Method)의 기능을 결합한 것으로, 객체의 필드에 대한 접근을 제어하고 데이터의 유효성을 검사하거나 변형할 수 있도록 하는 메커니즘입니다.
필드를 직접 접근하는 것보다 속성을 사용하면 데이터의 접근을 제어할 수 있으며, 데이터 검증과 변경에도 용이합니다.
속성은 getset 접근자를 통해 필드의 값을 읽거나 쓸 수 있게 해줍니다. 이를 통해 데이터에 대한 접근을 제어하고, 필요에 따라 추가적인 로직을 삽입할 수 있습니다. 예를 들어, 게임 캐릭터의 체력 속성을 설정할 때, 체력의 최대 값을 초과하지 않도록 제어할 수 있습니다.

get 접근자

get 접근자는 속성의 값을 읽어오는 기능을 제공합니다. 이를 통해 속성의 내부 필드에 저장된 값을 외부에서 접근할 수 있습니다. get 접근자는 속성 값의 반환을 책임지며, 반환할 값의 데이터 형식은 속성의 데이터 형식과 일치해야 합니다.

set 접근자

set 접근자는 속성의 값을 설정하는 기능을 제공합니다. 외부에서 속성에 값을 할당할 때 호출됩니다. set 접근자는 할당된 값을 속성의 내부 필드에 저장하거나, 필요한 검증 및 변형을 수행할 수 있습니다. set 접근자는 value 라는 암시적 매개변수를 통해 할당된 값을 받습니다

value

속성의 set 접근자에서 value는 속성에 대입된 값을 자동으로 받아오는 역할을 합니다. C# 컴파일러가 이 value를 자동으로 생성해주며, 이를 통해 속성에 새로운 값을 설정할 수 있습니다.

get과 set 접근자의 결합

속성은 getset 접근자를 모두 가질 수 있으며, 각 접근자의 존재 여부에 따라 다음과 같은 조합이 가능합니다:
읽기 전용 속성 (get만 사용)
속성 값은 읽을 수 있지만, 외부에서 값을 설정할 수 없습니다.
예: public string Name { get; }
쓰기 전용 속성 (set만 사용)
속성 값을 설정할 수 있지만, 외부에서 값을 읽을 수 없습니다.
예: public int Age { set; }
읽기 및 쓰기 속성 (get과 set 모두 사용)
속성 값을 읽고, 외부에서 값을 설정할 수 있습니다.
예: public string Name { get; set; }
아래의 코드는 게임 캐릭터의 체력을 관리하는 코드입니다.
using System; public class GameCharacter { private int _health; // 체력 값을 저장하는 private 필드 // 체력 속성 public int Health { get { // 체력을 반환하는 get 접근자 return _health; } set { // 체력을 설정하는 set 접근자 if (value < 0) // 체력이 음수로 설정되지 않도록 검사 { _health = 0; } else if (value > 100) // 체력이 100을 초과하지 않도록 검사 { _health = 100; } else { _health = value; } } } // 생성자 public GameCharacter(int initialHealth) { Health = initialHealth; // 생성 시 체력 초기화 } public void PrintHealth() { Console.WriteLine($"Character's current health: {Health}"); } } class Program { static void Main() { GameCharacter character = new GameCharacter(50); // 체력이 50인 캐릭터 생성 character.PrintHealth(); // 현재 체력 출력 character.Health = 120; // 체력을 120으로 설정하려고 시도 character.PrintHealth(); // 최대 체력 100으로 제한되어 출력됨 character.Health = -10; // 체력을 -10으로 설정하려고 시도 character.PrintHealth(); // 최소 체력 0으로 제한되어 출력됨 } }
C#
복사
필드와 속성: GameCharacter 클래스는 _health라는 private 필드를 가지고 있습니다. 이 필드는 Health 속성을 통해 접근됩니다. 속성은 getset 접근자를 사용하여 필드 값을 읽고 설정하는 기능을 제공합니다.
데이터 검증: set 접근자에서는 체력이 음수로 설정되거나 100을 초과하지 않도록 검사하는 로직을 추가했습니다.
생성자와 메서드: 생성자에서 Health 속성을 초기화하고, PrintHealth 메서드를 통해 현재 체력을 출력합니다. 체력 값의 제한이 set 접근자에서 적용되므로, 체력이 120이나 -10으로 설정되더라도 유효한 범위로 자동 조정됩니다.

자동 구현 속성

자동 구현 속성은 C#에서 속성을 정의할 때 필드와 접근자를 별도로 구현하지 않고, 간결하게 정의할 수 있도록 해주는 기능입니다. 자동 구현 속성을 사용하면, C# 컴파일러가 내부적으로 private 필드를 자동으로 생성하고, 해당 필드에 대한 getset 접근자 메서드를 자동으로 생성해 줍니다. 그럼 밑의 코드 예제를 보며 어떻게 사용하는지 보겠습니다.
using System; public class Player { // 자동 구현 속성: Health 속성은 자동으로 내부 private 필드를 생성하고, // 기본적인 읽기 및 쓰기 기능을 제공합니다. public int Health { get; set; } // 생성자: Player 객체를 생성할 때 초기 체력을 설정합니다. public Player(int initialHealth) { Health = initialHealth; // 자동 구현 속성에 초기 체력을 설정합니다. } } public class Program { public static void Main(string[] args) { // Player 객체를 생성하고 초기 체력을 100으로 설정합니다. Player player = new Player(100); // 플레이어의 초기 체력을 출력합니다. Console.WriteLine("Initial Health: " + player.Health); // 플레이어의 체력을 80으로 업데이트합니다. player.Health = 80; // 업데이트된 체력을 출력합니다. Console.WriteLine("Updated Health: " + player.Health); } }
C#
복사
이처럼 자동 구현 속성을 사용하면 코드를 간결하고 명확하게 유지할 수 있으며, 내부 필드를 명시적으로 정의하지 않고도 속성의 기본적인 동작을 쉽게 설정할 수 있습니다.
하지만 자동 구현 속성은 기본적인 읽기 및 쓰기만 가능하며, 추가적인 로직을 삽입할 수 없습니다. 반면, 직접 필드와 속성은 getset 접근자에서 로직을 추가하거나 유효성 검사를 할 수 있습니다. 따라서, 자동 구현 속성은 단순한 데이터 저장 및 접근이 필요한 경우 적합하고, 직접 필드와 속성은 데이터 유효성 검사가 필요하거나, 더 복잡한 로직이 필요한 경우에 적합합니다.

속성의 장점

1.
데이터 무결성 보장
속성의 set 접근자를 사용하면 필드에 대한 값을 설정할 때 유효성 검사를 수행할 수 있습니다. 이를 통해 잘못된 데이터가 필드에 저장되는 것을 방지할 수 있습니다. 예를 들어, 체력이 음수가 되는 것을 막을 수 있습니다.
2.
유지보수 용이성
속성을 사용하면 필드의 접근 방식을 변경해야 할 때, 속성의 getset 접근자만 수정하면 되므로 코드의 유지보수가 쉬워집니다. 필드 접근 방식에 대한 변경 사항이 중앙에서 관리되므로 코드 수정이 용이합니다.
3.
코드 가독성 향상
속성을 사용하면 클래스의 필드에 대한 접근이 명확해져 코드의 가독성이 높아집니다. getset 접근자를 통해 필드의 값을 읽고 쓸 때의 동작을 분리하여 코드의 의미를 명확히 할 수 있습니다.

결론

속성은 C#에서 객체의 상태를 관리하는 데 매우 유용한 도구입니다. 게임 개발에서는 캐릭터의 상태를 안전하고 효과적으로 관리하기 위해 속성을 활용할 수 있습니다. 위의 예제처럼 속성을 사용하면 필드 값에 대한 접근을 제어하고 데이터의 무결성을 유지하며, 코드의 안정성과 가독성을 높일 수 있습니다. 게임을 개발하며 객체를 관리할 때, 속성을 적절히 활용하여 코드 작성 시 도움이 되었으면 좋겠습니다.