무명 형식
C#에는 여러 형식이 있습니다. 그 형식에는 int, double, string, FileStream, MyClass등의 이름들이 있었죠. 이번엔 이름이 없는 형식, 즉 무명 형식(Anonymous Type)을 설명하려고 합니다. 그나저나 형식의 이름은 왜 필요한거죠? "형식의 이름을 이용하여 인스턴스를 만들기 때문이죠. 무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다. 이 때문에 인스턴스를 만들고 다시는 사용하지 않을때 무명 형식을 요긴하게 사용합니다. (두 개 이상 인스턴스를 만드려면 class나 struct를 이용해야겠지만요)
다음은 무명 형식의 선언 예 입니다.
var myInstance = new {Name = "브루노", Age = "28" };
//여기
Console.WriteLine(myInstace.Name, myInstance.Age);중괄호 { 와 } 사이에 임의의 프로퍼티 이름(브루노)을 적고 값을 할당하면 그대로 새 형식의 프로퍼티가 됩니다.
무명 형식에서 주의할 점은 무명 형식의 프로퍼티에 할당된 값은 변경이 불가능하다는 것입니다. 한마디로 무명 형식의 인스턴스가 만들어지면 읽기만 된다는 뜻 입니다. 이는 나중에 LINQ와 함께 자주 사용할 것입니다.
다음 예제입니다.
using System;
namespace AnonymousType
{
class Program
{
static void Main(string[] args)
{
var a = new { Name = "Antony Martial", record = 60 };
Console.WriteLine($"Name:{a.Name}, Record :{a.record}");
var b = new { Team = "Manchester United", Goals = new int[] { 18, 8, 11, 12, 23 }};
Console.Write($"Team: {b.Team}, Goals: ");
foreach (var goals in b.Goals)
{
Console.Write($"{goals} ");
}
Console.WriteLine();
}
}
}Name : Antony Martial, Record : 60
Team : Manchester United, Goals : 18, 8, 11, 12, 23인터페이스의 프로퍼티
인터페이스는 메소드뿐만 아니라 프로퍼티와 인덱서도 가질 수 있습니다. 프로퍼티가 인덱서를 가지고 인터페이스를 상속하는 클래스가 '반드시' 해당 프로퍼티와 인덱서를 구현해야 하는 것은 물론입니다. 즉, 인터페이스에 들어가는 프로퍼티는 구현을 갖지 않습니다. 여기서 문제가 발생하는데, 인터페이스의 프로퍼티 선언은 클래스 자동 구현 프로퍼티 선언과 그 모습이 동일하다는 것이네요.
인터페이스의 예시 두가지를 보시고, 예제 프로그램까지 확인해보시죠.
[인퍼테이스 프로퍼티 선언 형식]
interface 인터페이스_이름
{
public 형식 프로퍼티_이름1
{
get; set;
}
public 형식 프로퍼티_이름2
{
get; set;
}
}
---------------------------------
[프로퍼티를 가진 인터페이스와 이를 상속하는 파생 클래스의 예]
interface IProduct
{
string ProductName
{
get;
set;
}
}
class Product : IProduct
{
private string productName;
public string ProductName //파생 클래스는 기반 인터페이스에 선언된 모든 프로퍼티를 구현해야합니다.
{
get { return productName; }
set { productName = value; }
}
}namespace PropertiesInInterface
{
interface INamedValue
{
string Name { get; set; } //인터페이스는 구현을 가지지 않습니다.
string Value { get; set; } //자동 구현 프로퍼티도 구현을 가지지 않죠.
}
class NamedValue : INamedValue
//INamedValue 인터페이스를 상속하는 NamedValue클래스는 반드시 Name과 Value를 구현해야합니다.
//이때 자동구현 프로퍼티 이용해도 됩니다
{
public string Name { get; set; }
public string Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
NamedValue name = new NamedValue() { Name = "이름", Value = "호날두" };
NamedValue height = new NamedValue() { Name = "키", Value = "188cm" };
NamedValue weight = new NamedValue() { Name = "몸무게", Value = "80kg" };
Console.WriteLine($"{name.Name} : {name.Value}");
Console.WriteLine($"{height.Name} : {height.Value}");
Console.WriteLine($"{weight.Name} : {weight.Value}");
}
}
}이름 : 호날두
키 : 188cm
몸무게 : 80kg추상 클래스의 프로퍼티
인터페이스 이야기를 마쳤으므로 추상 클래스 이야기도 해야겠죠. 추상 클래스는 클래스처럼 구현된 프로퍼티를 가질 수 있는 한편, 인터페이스처럼 구현되지 않은 프로퍼티도 가질 수 있습니다. 추상 클래스에서는 이것을 추상 프로퍼티(Abstract Property)라 합니다. 추상 메소드가 그랬던 것 처럼, 추상 프로퍼티 역시 인터페이스의 프로퍼티와 다를 것 없습니다. 파생 클래스가 해당 프로퍼티를 구현하도록 강제하는 것 뿐이거든요. 그렇다면 추상 클래스의 추상 프로퍼티는 어떻게 선언해야할까요? 바로 abstract 한정자를 이용해 선언하면 됩니다.
그러면 이제 예제 코드와 프로그램을 만들어봅시다.
abstract 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 PropertiesInInAbstractClass
{
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;
}
}
class Program
{
static void Main(string[] args)
{
Product product_1 = new MyProduct() { ProductDate = new DateTime(2023, 8, 31) };
Console.WriteLine("Product:{0}, Prodcut Date :{1}", product_1.SerialID, product_1.ProductDate);
Product product_2 = new MyProduct() { ProductDate = new DateTime(2023, 9, 1) };
Console.WriteLine("Product:{0}, Product Date :{1}", product_2.SerialID, product_2.ProductDate);
}
}
}
'C#.' 카테고리의 다른 글
| 이것이 C#이다 10장) 배열 Array [2] (0) | 2023.09.04 |
|---|---|
| 이것이 C# 이다 10장) 배열 Array [1] (0) | 2023.08.31 |
| 이것이 C#이다 9장) 불변 객체 record (0) | 2023.08.30 |
| 이것이 C#이다 9장) 자동구현 Property (0) | 2023.08.30 |
| 이것이 C#이다 8장) 인터페이스와 추상클래스 (0) | 2023.08.25 |