C# Practicing(static & property)

2023. 10. 24. 14:56Game Develop/C# Programming

Static이란


일반적으로 클래스 내의 데이터(변수)나 기능(메서드)들은 new를 통해 객체를 생성했을때 객체가 가진다.

하지만 클래스 내의 static은 객체가 아닌 클래스가 자체적으로 가지고 있는 저장 공간, 메서드라고 할 수 있다.

static으로 표시된 데이터나 메서드는 프로그램이 시작할 때부터 존재한다.


property란


property가 가진 많은 의미 중에 속성이라는 의미가 있다.

프로퍼티는 메서드지만 마치 변수인 것처럼 쓰인다.

다음은 가장 기본적인 property의 형태다

[접근 제어 지시자] [데이터 형식] [프로퍼티의 이름]

{

        [접근 제어 지시자] get

        {

                실행문들

                return [반환 값]

        }

        [접근 제어 지시자] set

        {

                실행문들

        }

}

property 내의 get과 set의 접근 제어 지시자는 무조건 property의 접근 제어 지시자보다 더 제한적이여야 한다.

예를들면 property의 접근 제어 지시자가 public이면 protected와 private만 쓸 수 있다, private일 경우 get, set의 접근 제어 지시자에는 아무것도 쓸 수 없다.

흔히 클래스내에서 선언하는 변수는 대개 private인 경우가 많다. 따라서 프로그램이 실행되는 main에서 클래스의 변수에 직접 접근할 수 없기 때문에 메서드를 통해 간접적으로 접근해야한다.

예를 들어 클래스 내의 name이란 변수가 있는데 접근 제어 지시자를 private을 갖고있다.

객체를 생성하고 이 객체의 이름을 지정, 사용하기 위해선 메서드 작성은 불가피하다.

따라서 이름을 쓰고 읽어올 수 있는 메서드 2개를 만들어 주어야한다.

using static System.Console;

internal class Program
    {
        static void Main(string[] args)
        {
            Human human = new Human();
            human.SetName("홍길동");
            WriteLine($"이름 : {human.GetName()}");
        }
    }

    public class Human
    {
        private string name;

        public void SetName(string name)
        {
            this.name = name;
        }

        public string GetName()
        {
            return name;
        }
    }

이런식으로 변수에 접근하려면 메서드를 2개는 만들어줘야 하는 상황이 자주 나오기 때문에 property를 사용하여 좀 더 편리하게 작성할 수 있다.

다음은 property를 사용한 경우이다.

using static System.Console;

internal class Program
{
    static void Main(string[] args)
    {
        Human human = new Human();
        human.Name = "홍길동";
        WriteLine($"이름 : {human.Name}");
    }
}

public class Human
{
    private string name;

    public string Name
    {
        set
        {
            name = value;
        }
        get
        {
            return name;
        }
    }
}

가장 큰 차이점은 main을 보면 분명 property는 분명 메서드라고 하였지만, human.Name = "홍길동"과 같이 마치 변수 처럼 사용하는 것을 확인할 수 있다.

대입 값이 있으면 set이 실행되어 값(value)를 name에 대입해주고, 반환을 해야하면 get을 실행하여 name을 리턴해준다.

위의 Name 프로퍼티는 입력 값을 받아 변수에 대입하고 다시 반환만 하는 기능만을 가지고 있기 때문에 이는 자동 프로퍼티로 쓸 수도 있다.

private string name;
public string Name
{
     set
     {
          name = value;
     }
     get
     {
          return name;
     }
}

옆의 Name 프로퍼티와 public string Name { get; set; } 은
내부적으로 완전이 동일하다고 볼 수 있다.

 

 public string Name { get; set; } 이를 자동 프로퍼티라고 부른다.

 

using static System.Console;

internal class Program
{
    static void Main(string[] args)
    {
        Human human = new Human();
        human.Name = "홍길동";
        WriteLine($"이름 : {human.Name}");
    }
}

public class Human
{
    public string Name { get; set; }
}

이렇게 프로퍼티를 사용하면 코드 라인을 많이 줄일 수 있다.

오늘 C#을 배운 이후 처음으로 배운 내용을 복습 차원에서 일기 형식으로 써보았다.

부디 오늘 내딛은 한 발자국이 훗날의 발자취로 남아있길 바라며,

다음에는 poperty를 사용하여 나이를 입력 받고 이 사람이 성인인지 아닌지를 판단해주는 예제로 돌아오겠다.