제로의영역

9장 프로퍼티-3.자동구현 프로퍼티 본문

C#

9장 프로퍼티-3.자동구현 프로퍼티

아이큐제로 2019. 6. 28. 19:03

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

프로퍼티는 데이터의 오염에 대해선 메소드처럼 안전하고, 데이터를 다룰 때는 필드처럼 간결하지만, 많은 경우에 중복된 코드를 작성하고 있다는 기분이 들게 함.

public class NameCard				//class 생성
{
	private string name;			//필드 생성1
    private string phoneNumber;		//필드 생성2
    
    public string Name				//프로퍼티 생성
    {
    	get							//get 접근자: 필드로부터 값을 읽어옴
        {
        	return name;
            }
            
        set							//set 접근자: 필드에 값을 할당
        {
        name = value;
        }
    }
    
    public string PhoneNumber		//get 접근자: 필드로부터 값을 읽어옴
    {
    	get
        {
        	return PhoneNumber;
            }
        set							//set 접근자: 필드에 값을 할당
        {
        	phoneNumber = value;
            }
     }

NameCard클래스는 name과 phoneNumber 필드를 읽고 쓰기만함.

C# 3.0부터 이런 경우 코드를 더 단순하게 만드는 자동 구현 프로퍼티(Auto-Implemented Property)를 도입.

( thank you!. 마이크로소프트 ^^)

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

헉! 필드선언(생성), return, value 등을 다 없애고 get, set 뒤에 세미콜론( ; ) 만 붙여줍니다.

C#7.0부터는 자동 구현 프로퍼티를 다음과 같이 수식하면 선언과 동시에 초기화를 수행할 수 있게 되었습니다.

public class NameCard			//클래스 생성
{
	public string Name			//프로퍼티
    {
    	get; set; 				//자동구현 프로퍼티
        } = "Unknown";			//초기화
        
    public string PhoneNumber	//프로퍼티
    {
    	get; set;				//자동구현 프로퍼티
        } = "000-0000";			//초기화

 흠.. "Unknown"과 "000-0000"이 초기화 수식어 같습니다.(책에 설명이 없어서 정확하지는 않지만 초기화 수식어의 형식은 입력되는 변수의 형식과 맞추어야 되지 않을까 생각됩니다.)

 

예제)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex8._6
{
    class BirthdayInfo  			//클래스 생성
    {
        public string Name  		//Name 프로퍼티 생성
        {
            get; set; 				  //자동 구현 프로퍼티
        } = "Unknown";  			//초기화
        public DateTime Birthday    //Birthday 프로퍼티 생성
        {
            get; set;   			//자동 구현 프로퍼티
        } = new DateTime(1, 1, 1);  //초기화
        public int Age  		//Age 프로퍼티 생성:get만 존재하므로 읽기 전용 프로퍼티
        {
            get
            {
                return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
            }
        }
    }
    class MainProgram
    {
        static void Main(string[] args)
        {
            BirthdayInfo birth = new BirthdayInfo();		//birth 생성
            Console.WriteLine($"Name:{birth.Name}");  		//Unknown반환
            Console.WriteLine($"Birthday:{birth.Birthday.ToShortDateString()}");
        //1,1,1 반환
            Console.WriteLine($"Age:{birth.Age}");  		//현재 연도 반환

            birth.Name = "서현"; 							 //Name에 '서현' 입력
            birth.Birthday = new DateTime(1991, 6, 28);
       //Birthday에 1991, 6, 28을 순서대로 입력

            Console.WriteLine($"Name:{birth.Name}");   			 //서현 반환
            Console.WriteLine($"Birthday:{birth.Birthday.ToShortDateString()}");
        //1991,6,28 반환
            Console.WriteLine($"Age:{birth.Age}");  		// 현재 나이 반환
        }
    }
}

출력결과

Name:Unknown
Birthday:0001-01-01
Age:2019
Name:서현
Birthday:1991-06-28
Age:29

'C#' 카테고리의 다른 글

9.5 무명 형식(Anonymous Type)  (0) 2019.07.03
9.4 프로퍼티와 생성자  (0) 2019.07.03
9장 프로퍼티 -1 public 필드의 유혹  (0) 2019.06.28
8장 인터페이스 연습문제  (0) 2019.06.26
8.5 추상 클래스  (0) 2019.06.26