CS/C#

[C#] 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티

Mirab 2021. 12. 21. 23:26

프로퍼티의 마지막 시간입니다.

무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티 배울 것이 많아 보입니다.

빠르게 공부해봅시다!

 

# 무명 형식 (Anonymous Type)

제목 그대로 이름이 없는 형식을 무명 형식이라고 합니다.

보통은 임시로 사용하는 경우 특별히 다시 사용하지 않기 때문에 람다처럼 이름을 붙이지 않습니다.

 

무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다.

인스턴스를 만들고 다시는 사용하지 않을 때 무명 형식이 요긴합니다.

var tempInstance = new {Name = "나, 무명", Age = 20};

무명 형식의 프로퍼티에 할당된 값은 변경 불가능합니다. 읽기만 가능하죠.

나중에 LINQ(링큐)에서 요긴하다고 합니다.

using System;

namespace AnonymousType
{
    class Program
    {
        static void Main()
        {
            // 무명 형식은 형식의 선언과 동시에 인스턴스를 할당, 이후에는 Read만 가능합니다.
            var a = new { Name = "지코", Age = 29 };
            Console.WriteLine($"Name:{a.Name}, Age:{a.Age}");

            var b = new { Subject = "Math", Scores = new int[] { 90, 80, 70, 60 } };
            Console.Write($"Subject:{b.Subject}, Scores: ");
            foreach(var score in b.Scores)
                Console.Write($"{score} ");

            Console.WriteLine();
        }
    }
}
Name:지코, Age:29
Subject:Math, Scores: 90 80 70 60

# 인터페이스의 프로퍼티

기존에도 공부했지만 인터페이스는 메서드, 프로퍼티, 인덱서를 가질 수 있습니다.

게다가 인터페이스에서는 구현부를 만들지 않습니다. 이 개념을 가지고 살펴봅시다.

 

인터페이스에도 프로퍼티를 선언할 수 있는데 구현을 갖지 않습니다. 그래서 프로퍼티는 구현을 갖지 않습니다.

그런데 인터페이스를 상속하는 클래스는 반드시 해당 프로퍼티와 인덱서를 구현해야 합니다!

 

신기하게도 인터페이스에 프로퍼티를 선언할 때 기존 클래스에서 선언하는 거랑 똑같지만 자동 구현 프로퍼티를 C# 컴파일러가 자동으로 구현해주지 않습니다. 인터페이스는 어떤 구현도 가지지 않기 때문이죠.

using System;

namespace PropertiesInInterface
{
    interface INamedValue
    {
        string Name { get; set; } // 자동으로 구현해주지 않습니다.
        string Value { get; set; }
    }

    class NamedValue : INamedValue
    {
        public string Name { get; set; } // 자동으로 구현해줍니다.
        public string Value { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            NamedValue name = new NamedValue()
            {
                Name = "이름",
                Value = "지코"
            };

            NamedValue height = new NamedValue()
            {
                Name = "키",
                Value = "181cm"
            };

            NamedValue weight = new NamedValue()
            {
                Name = "몸무게",
                Value = "67kg"
            };

            Console.WriteLine($"{name.Name} : {name.Value}");
            Console.WriteLine($"{height.Name} : {height.Value}");
            Console.WriteLine($"{weight.Name} : {weight.Value}");
        }
    }
}
이름 : 지코
키 : 181cm
몸무게 : 67kg

# 추상 클래스의 프로퍼티

추상 클래스도 앞서 공부한 인터페이스와 유사합니다.

다만 구현된 프로퍼티를 가질 수 있고, 인터페이스처럼 구현되지 않은 프로퍼티도 가질 수 있습니다.

 

인터페이스처럼 구현되지 않는 프로퍼티를 추상 프로퍼티라고 하며, 파생 클래스가 해당 프로퍼티를 구현하도록 강제하는 것입니다. 프로퍼티 앞에 abstract 키워드를 붙여야 합니다.

using System;

namespace PropertiesInAbstractClass
{
    abstract class Product
    {
        private static int serial = 0;
        public string SerialID
        {
            get { return String.Format("{0:d5}", serial++); }
        }

        abstract public DateTime ProductDate { get; set; } // 자동으로 구현 x
    }

    class MyProduct : Product
    {
        public override DateTime ProductDate { get; set; }
    }

    class Program
    {
        static void Main()
        {
            Product product_1 = new MyProduct()
            {
                ProductDate = new DateTime(2021, 12, 20)
            };

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

            Product product_2 = new MyProduct()
            {
                ProductDate = new DateTime(2021, 12, 21)
            };

            Console.WriteLine("Product:{0}, Product Date:{1}", product_2.SerialID, product_2.ProductDate);
        }
    }
}
Product:00000, Product Date:2021-12-20 오전 12:00:00
Product:00001, Product Date:2021-12-21 오전 12:00:00

 

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

[C#] Record 와 Property  (0) 2021.12.21
[C#] property, 프로퍼티  (0) 2021.12.21
[C#] 인터페이스와 추상 클래스  (0) 2021.12.20
[C#] 정적 필드와 메서드(static)  (0) 2021.12.12
[C#] 생성자와 소멸자  (0) 2021.12.11