2 분 소요

이 글은 한빛미디어의 이것이 C#이다를 보고 헷갈리는 부분 위주로 정리한 글입니다.

클래스의 멤버 변수의 은닉성을 지키기위해 Get, Set 메소드를 만들어 멤버 변수를 다루는 것은

정말 귀찮다.

이를 위해 편의성과 은닉성을 동시에 가질 수 있는 기능이 있다.

프로퍼티Permalink

프로퍼티는 다음과 같이 필드 하나를 만들고 그 필드를 감싸줄 프로퍼티를

선언한다.

    class 클래스_이름
    {
        데이터_형식 필드_이름;
        접근_한정자 데이터_형식 프로퍼티_이름
        {
            get { return 필드_이름; }
            set { 필드_이름 = value; }
        }
    }

프로퍼티는 Get Set 메서드를 사용하는 것의 은닉성과

public으로 필드를 사용할때의 편리성의 섞은 것이다

은닉성은 일반적인 Get 메소드, Set 메서드를 사용하면 다음과 같지만.

class propertyClass
{
    int num;

    public int GetNum()
    {
        return num;
    }
    public void SetNum(int value)
    {
        num = value;
    }
}

사용할 때는 다음의 public필드와 같다.

class propertyClass
{
    public int num;
}

프로퍼티로는 간단하게 구현이된다.

class propertyClass
{
    int m_num;
    public int num
    {
        get { return m_num; } 
        set { m_num = value; }
    }
}

static void Main(string[] args)
{
    propertyClass p  = new propertyClass();
    p.num = 1;  //사용은 public필드처럼 사용할 수 있다
    Console.WriteLine(p.num);
}

여기서 value는 p.num = 1; 부분의 1과 같다.

= 을 통해 넣어주는 값이 자동으로 value로 들어가 set 기능이 사용된다.

또한 외부에서 읽기 전용으로 사용하고 싶다면 set을 그냥 빼버리면 된다.

class propertyClass
{
    int m_num = 5;
    public int num
    {
        get { return m_num; } 
    }
}

static void Main(string[] args)
{
    propertyClass p  = new propertyClass();
	Console.WriteLine(p.num); // 값을 읽는것은 가능
    p.num = 1; // 에러 발생      
}

자동구현 프로퍼티Permalink

프로퍼티가 메소드처럼 작용하지않고 단순히 값을 읽고 쓰기만 하면

자동구현 프로퍼티로 편리하게 구현할 수 있다.

class propertyClass
{
    public int num { get; set; }
}

프로퍼티와 생성자Permalink

프로퍼티를 초기화 하는것은

객체를 생성할때 생성자 뒤에 {} 안에서 초기화해주면 된다

클래스_이름 인스턴스 = new 클래스_이름()
{
	프로퍼티1 = , // ;가 아니라 , 다
	프로퍼티2 = ,
	프로퍼티3 = 
} 

초기화 전용 자동 구현 프로퍼티 C# 9.0Permalink

get만 가능한 프로퍼티는

생성자를 통한 초기화가 불가능하여 초기화를 위해서는

메소드를 추가로 만들어야 한다.

그를 해결해 주는것이 바로 init 접근자다.

init은 초기화만 가능하게 해주는 set과 같다.

class propertyClass
{
    int m_b;
    public int b
    {
        get { return m_b; }
        init { m_b = value * 50; }
    }
}

internal class Program
{
    static void Main(string[] args)
    {
        propertyClass p  = new propertyClass() {b = 50}; // 초기화는 가능
        Console.WriteLine(p.b);
        p.b = 5; // 에러 발생
    }
}

프로퍼티 초기화를 강제하는 required 키워드Permalink

init이 초기화만 가능하도록 해준다면, required 키워드는 초기화가 필요한 프로퍼티를 실수로 초기화 하지 않는 실수를 방지할 수 있게 해줌

class propertyClass
{
    public required int i{get; set;}
}

internal class Program
{
    static void Main(string[] args)
    {
        propertyClass p = new propertyClass(); // 오류 발생
    }
}

무명 형식Permalink

선언과 동시에 인스턴스를 할당

var myInstance = new {Name = "이름", Age = "20"};
// 중괄호 사이에 임의의 프로퍼티 이름을 적고 값을
// 할당하면 그대로 새 형식의 프로퍼티가 됨

Console.WriteLine(myInstance.Name);
Console.WriteLine(myInstance.Age);

무명 형식의 프로퍼티에 할당된 값은 변경불가능하다.

즉, 초기화 후 읽기만 가능하다.

인터페이스의 프로퍼티Permalink

인터페이스는 메소드뿐 아니라 프로퍼티와 인덱서도 가질 수 있다.

프로퍼티나 인덱서를 가진 인터페이스를 상속하는 클래스가 반드시 구현해야 하는 것은 같다.

당연하겠지만 인터페이스의 프로퍼티는 구현을 갖지 않음.

여기서 발생하는 문제가 인터페이스의 프로퍼티 선언은 자동 구현 프로퍼티 선언과 모습이

interface IPropertyInterface
{
    int propertyField{ get; set;}
}
class propertyClass : IPropertyInterface
{
    public int propertyField{ get; set; }
}

태그:

카테고리:

업데이트:

댓글남기기