제로의영역

9.7 추상 클래스와 프로퍼티(추상 프로퍼티) 본문

C#

9.7 추상 클래스와 프로퍼티(추상 프로퍼티)

아이큐제로 2019. 7. 29. 16:42

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

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

 

1. 정의: 추상 클래스에 안에 있지만 인터페이스처럼 구현되지 않는 프로퍼티

 

2. 용도: 인터페이스의 추상클래스 처럼 다른 제작자가 프로퍼티의 추상 클래스를 사용할 때 강제적으로 추상클래스를 상속받아 재정의하여 사용하도록 하여 팀프로젝트나 다른 코드를 가져와 사용할 경우 혼선을 줄이는데 사용할 수 있도록 함.

 

3. 사용법: abstract 한정자를 이용하여 선언

abstruct class 추상 클래스이름
{
	abstract 데이터형식 프로퍼티이름
    {
    	get;
        set;
     }
 }

추상 프로퍼티를 갖는 추상 클래스와 이를 상속하는 파생 클래스의 예제 코드)

abstract class Product
{
	private static int serial=0;
    public string SerialID			// 추상클래스는 구현을 가진 프로퍼티를 가질 수 있음
    {
    	get
        {
        	return String.Format("{0:d5}", serial++);
        }
    }
    
    abstract public DateTime ProductDate	// 추상클래스는 구현이 없는 추상 프로퍼티를 가질 수 있음
    {
    	get;
        set;
     }
  }
  
class MyProduct : Product
{
	public override DateTime ProductDate
    		// 파생클래스는 부모 추상 클래스의 모든 추상 메소드뿐 아니라 추상 프로퍼티를 재정의 해야 함
    {
    	get;
        set;
    }
}

 

예제)

using System;

namespace ex8._12
{
    abstract class Product
    {
        private static int serial = 0;  
        public string SerialID  //구현을 가진 프로퍼티
        {
            get { return String.Format("{0:d5}", serial++); } 
            //다섯자리(0:d5)형식의 문자열과 Product의 변수 serial을 1 증가시킨 값을 반환 함.  
        }

        abstract public DateTime ProductDate    //구현을 가지지 않은 프로퍼티
        {
            get;
            set;
        }
    }

    class MyProduct:Product //추상 클래스 Product를 상속
    {
        public override DateTime ProductDate 
  // 파생클래스는 부모 추상 클래스의 추상 메소드와 추상 프로퍼티를 강제적으로 재정의 해주어야함
        {
            get;
            set;
        }
    }

    class MainProgram
    {
        static void Main(string[] args)
        {
            Product product_1 = new MyProduct()
            { ProductDate = new DateTime(2018, 1, 10) }; 
         //ProductDate를 2018,1,10으로 초기화   

            Console.WriteLine("Product:{0}, Product Date:{1}",
                               product_1.SerialID, product_1.ProductDate);

            Product product_2 = new MyProduct()
            { ProductDate = new DateTime(2018, 2, 3) };

            Console.WriteLine("Product:{0},Product Date:{1}",
                               product_2.SerialID, product_2.ProductDate);
        }
    }
}

출력결과

Product:00000,Product Date:2018-01-10 오전 12:00:00
Product:00001,Product Date:2018-02-03 오전 12:00:00