제로의영역

9장 프로퍼티- 2.메소드보다 프로퍼티 본문

카테고리 없음

9장 프로퍼티- 2.메소드보다 프로퍼티

아이큐제로 2019. 6. 28. 17:35

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

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

 

프로퍼티 선언 문법을 알아보겠습니다.

 

1. 프로퍼티 구성 키워드

 (1) get{...}과 set{...}을 접근자(accessor)라고 함.

  1) get 접근자: 필드로부터 값을 읽어 옴.

  2) set 접근자: 필드에 값을 할당

 (2) value 키워드: 선언하지 않아도 C# 컴파일러가 set 접근자의 암묵적 매개 변수로 간주

 

2. 사용법

 

 class 클래스 이름

{

   데이터 형식 필드이름;

   접근한정자 데이터형식 프로퍼티이름

   {

      get

     {

         return 필드이름;

      }

 

      set

      {

       필드이름 = value;

      }

   }

}

 

 사용예)

class MyClass
{
	private int myField;					//객체 선언
    
    public int GetMyField()					//메소드
    {
    	return myField;						//호출자에게 반환
    }
    
    public void SetMyField( int NewValue )	//int NewValue값을 매개변수로 갖는 메소드
    {
    	myField = NewValue;					//myField에 NewValue값을 대입
    }

이 메소드를 프로퍼티로 바꿔 보겠습니다.

class MyClass
{
	private int myField;		//필드 선언
    
    public int MyField			//프로퍼티: 접근 한정자 + 데이터형식 + 프로퍼티명
     {
    	get						//get 접근자: 필드로부터 값을 읽어옴
        {
        	retrun myField;		//호출자에게 myfield값 반환
        }
        
        set						//set 접근자: 필드에 값을 할당
        {
        	myField = value;	//value와 '='할당 연산자를 통해 myFeild 필드에 데이터를 저장 
        }
    }
}

( 메소드와 프로퍼티를 어떻게 구분하는지 언급이 없습니다만 '( )'의 유무로 구분을 할 수 있나 생각이 됩니다.

메소드는 필드(객체)에 접근하기위해 두 개의 메소드를 만들어서 메소드2에서 변수를 받아 선언한 객체로 넘기고 메소드1에서 반환하고 있습니다.

프로퍼티는 set에서 value값으로 받아서 객체로 넘기고 get으로 반환하고 있네요.

소스가 짧아져서 좋아하는 초보 입니다. ^^)

 

그리고 set 접근자를 구현하지 않으면 프로퍼티는 쓰기 불가, 읽기 전용이 됩니다.

 

예제)

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

namespace ex8._5
{
    class BirthdayInfo                                                        //클래스 생성
    {
        private string name;                                        //문자열 name 필드 생성
        private DateTime birthday;                          //DateTime형 birthday 필드 생성

        public string Name                      //프로퍼티1 생성: 한정자+데이터형식+프로퍼티명
        {
            get                                           //get접근자: 필드로부터 값을 읽어옴
            {
                return name;                                   //name 필드를 호출자에게 반환
            }
            set                                              //set접근자: 필드에 값을 할당
            {
                name = value;                                    //name 필드에 입력값을 대입
            }
        }
        public DateTime Birthday                //프로퍼티2 생성: 한정자+데이터형식+프로퍼티명
        {
            get                                          //get 접근자: 필드로부터 값을 읽어옴
            {
                return birthday;                            //birthday 필드를 호출자에게 반환
            }
            set                                                 //set접근자: 필드에 값을 할당
            {
                birthday = value;                              //birthday 필드에 입력값을 대입
            }
        }
        public int Age                           //프로퍼티3 생성: 한정자+데이터형식+프로퍼티명
        {
            get                   	                      //get접근자: 필드로부터 값을 읽어옴
            {
                return new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year; 
  //DateTime(DateTime.Now.Subtract(birthday).Ticks).Year를 호출자에게 반환(나이계산하는 것 같음)
            }
        }

    }
    class MainProgram
    {
        static void Main(string[] args)
        {
            BirthdayInfo birth = new BirthdayInfo();                //Birthday형식 birth생성
            birth.Name = "서현";                               	         //name에 서현 입력
            birth.Birthday = new DateTime(1991, 6, 28);        //birthday에 1991, 6, 28 입력

            Console.WriteLine($"Name:{birth.Name}");                             //서현 출력
            Console.WriteLine($"Brithday:{birth.Brithday.ToShortDateString()}"); 
            //1991-06-28 출력
            Console.WriteLine($"Age:{birth.Age}");    
            //DateTime(DateTime.Now.Subtract(birthday).Ticks).Year 결과를 출력
        }
    }
}

출력결과

Name:서현
Brithday:1991-06-28
Age:29