본문 바로가기
프로그래밍 언어

C# 프로퍼티

by do_ng 2024. 3. 3.

public 필드의 유혹

필드를 public으로 선언하면 은닉성이 지켜지지 않기 때문에 접근 한정자를 private로 설정 후 Get/Set 메소드를 따로 만들어서 해당 필드에 접근할 수 있도록 하였다. 

class MyClass
{
    private int myField;

    public int GetMyField()
    {
        return myField;
    }

    public void SetMyField(int myFiled)
    {
        this.myField = myFiled;
    }
}

class Program {
  
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.SetMyField(3);
        Console.WriteLine(myClass.GetMyField());
    }

}

 

Get/Set 메소드를 만들어서 접근하는 방식은 보통 Java에서 사용하지만 C#에서는 프로퍼티 라는 문법을 이용해서 이를 더 쉽게 사용할 수 있도록 도와준다. 

 

프로퍼티 사용법

class MyClass
{
    private int myField;

    public int MyField
    {
        get { return myField; }
        set { myField = value; }
    }
}

class Program {
  
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.MyField = 3;
        Console.WriteLine(myClass.MyField);
    }

}

 

여기서 value는 set 접근자의 암묵적 매개변수(수정할 값)로 간주하기 때문에 컴파일 문제를 일으키지 않는다. 

"=" 할당 연산자를 그대로 사용할 수 있다는 차이가 있다.

class MyClass
{
    private int myField;

    public int MyField
    {
        get { return myField; }        
    }
}

읽기 전용 프로퍼티는 get만 써주면 된다. 

 

자동 구현 프로퍼티

해당 프로퍼티가 단순히 읽고 쓰는 작업을 하는 경우 private 필드와 프로퍼티를 합쳐서 한번에 만들 수 있다.

자동 구현 프로퍼티는 C# 3.0 부터 도입된 문법이다. 

class MyClass
{   
    public int MyField
    {
        get; set;
    }
}

class Program {
  
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.MyField = 3;
        Console.WriteLine(myClass.MyField);
    }

}

 

C# 7.0 부터는 다음과 같이 자동 구현 프로퍼티를 선언함과 동시에 초기화를 수행할 수 있다.

class MyClass
{
    public int MyField 
    {
        get; set;
    } = 1000;
}

class Program {
  
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();        
        Console.WriteLine(myClass.MyField); // 1000
    }

}

'프로그래밍 언어' 카테고리의 다른 글

C# 추상 클래스  (0) 2024.03.05
C# 상수와 열거형  (0) 2024.02.29
C# reflection  (0) 2024.02.28
객체지향 프로그래밍(OOP) 개념정리  (0) 2024.01.25
C# Delegate(대리자)  (0) 2023.11.10