본문 바로가기

C# 공부/C# 기본 문법

프로퍼티 - 1 (구현과 사용법, 자동구현 프로퍼티, 프로퍼티와 생성자, 무명형식)

A. 프로퍼티의 구현과 사용법

자바에서는 private 필드를 접근할수있도록 하기위해 아래와 같이 GetXXX(), SetXXX() 메소드를 구현해서 사용했었다.

class MyClass
{
    private int myField;
    public int GetMyField(){return myField;}
    public void SetMyField(int NewValue){myField=NewValue;}
}

하지만, C#에서는 접근자(accessor)라는 더 나은 구현법 ( get{}, set{} ) 을 제공한다.

class MyClass
{
    private int myField;
    public int MyField //접근한정자 데이터형식 프로퍼티명
    {
    	get
        {
            return myField;
        }
        
        set
        {
            myField=value; //여기서  value는 선언한적이 없지만 C#컴파일러는 set 접근자의 암묵적 매개변수로 간주한다.
        }
    }
}

//사용시
static void Main(string[] args)
{
    MyClass obj=new MyClass();
    obj.MyField=3;  //이제 MyClass객체는 '=' 연산자를 통해 myField에 데이터를 저장하거나 읽어올수있다.
    Console.WriteLine(obj.MyField);
}

+) private필드가 변경되지 않기를 원한다면 프로퍼티에서 get접근자만 구현하면 된다.

    그러나, get접근자가 아닌 set접근자만 구현하게된다면 코드관리를 어렵게 만드는 원인이 될 수 있으므로 주의필요.

* public 필드와 프로퍼티의 차이점?

-> 프로퍼티는 public 의 편의성과 get(),set()의 선택적 구현을 통해 은닉성을 지킬수있다.

B. 자동 구현 프로퍼티(Auto-Implemented Property)

C# 3.0 이후 도입되었으며, 필드를 선언할 필요도 없고, get, set 접근자 뒤에 세미콜론만 붙여줌으로써 구현된다.

public class NameCard
{
    public string Name{ get; set; }
    public string PhoneNumber{ get; set; }
}

+) C# 7.0 부터는 다음과같이 자동 구현 프로퍼티를 선언과 동시에 초기화를 수행할 수 있게했다. 이 기능으로 자동 구현 프로퍼티에 초기값이 필요할때 생성자에 초기화 코드를 작성할 필요가 없어졌다.

public class NameCard
{
    public string Name{get; set;} = "Unknown";
    public string PhoneNumber{get; set;} = "000-0000";
}

사용 예시)

class BirthdayInfo
{
    public string Name { get; set; } = "Unknown";
    public DateTime Birthday { get; set; } = new DateTime(1, 1, 1);
    public int Age
    {
        get
        {
            return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
        }
    }
}

class MyClass
{
    static void Main(string[] args)
    {
        BirthdayInfo birth = new BirthdayInfo();
        Console.WriteLine($"Name : {birth.Name}");
        Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
        Console.WriteLine($"Age : {birth.Age}"); //Age 프로퍼티의 get 을 가져온다

        birth.Name = "GT";
        birth.Birthday = new DateTime(1994, 7, 8);

        Console.WriteLine($"Name : {birth.Name}");
        Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
        Console.WriteLine($"Age : {birth.Age}");
    }
}

 

C. 프로퍼티와 생성자

객체 생성시 프로퍼티를 이용한 초기화가 가능하다.

class BirthdayInfo
{
    public string Name { get; set; } = "Unknown";
    public DateTime Birthday { get; set; } = new DateTime(1, 1, 1);
}

BirthdayInfo birth2 = new BirthdayInfo()
{
    Name = "GT2",
    Birthday = new DateTime(2020, 7, 26)
};

 

D. 무명 형식 (Anonymous Type)

C#에는 int, double, string, MyClass등 형식에는 이름이있다.

하지만 무명형식은 형식의 이름을 지정하지 않으며, 인스턴스를 만들고 다시는 사용하지 않을때 유용함. (형식의 선언과 동시에 인스턴스를 할당) - 생소한 형식

var myInstance = new {Name="박상현", Age="17"}; //괄호 {와 }사이에 임의의 프로퍼티 이름을 적고
                                               //값을 할당하면 그대로 새 형식의 프로퍼티가 된다.

주의점으로는, 무명 형식의 프로퍼티에 할당된 값은 변경이 불가능하다. 즉, 읽기만 가능하다.

class MainApp
{
	static void Main(string[] args)
    {
    	var a = new{Name = "박상현", Age=123};
        Console.WriteLine($"Name:{a.Name}, Age:{a.Age}");
        
        var b = new{Subject = "수학", Scores = new int[] {90,80,70,60}};
        
        Console.Write($"Subject:{b.Subject}, Scores: ");
        foreach(var score in b.Scores)
        	Console.WriteLine($"{score} ");
    }
}

* 튜플과의 무명형식의 차이는, 튜플은 new(인스턴스 생성)이 필요없지만, 무명형식은 인스턴스생성이 필요하다.

+) 무명형식은 LINQ와 함께 유용하게 사용된다.