타입을 정의하는것은 단위 환산을 빈번하게 해야하는 프로그램에서도 유용하다.
와우의 화폐 골드 실버 코퍼를 단순히 하나의 데이터 타입으로 정의한다면 계산에 오류가 생기기 쉽다.
decimal gold = 10;
decimal silver = gold * 100;
decimal copper = silver * 100;
gold = silver; // 이런식으로 대입을 해도 오류가 발생하지 않는다
이 코드에서는 공통된타입, decimal을 통해 모든 통화를 표시가혹 있는데, 이는 나중에 유지보수를 하는 동안 중대한 버그를 발생시킬 수도 있다.
using System;
namespace Project2
{
public class 통화
{
decimal money;
public decimal Money { get { return money; } }
public 통화(decimal money)
{
this.money = money;
}
}
public class 코퍼 : 통화
{
public 코퍼(decimal money) : base(money) { }
public override string ToString()
{
return Money + "코퍼";
}
}
public class 실버 : 통화
{
public 실버(decimal money) : base(money) { }
public override string ToString()
{
return Money + "실버";
}
}
public class 골드 : 통화
{
public 골드(decimal money) : base(money) { }
public override string ToString()
{
return Money + "골드";
}
}
class Class1
{
public static void Main(String[] args)
{
코퍼 copper = new 코퍼(100);
실버 silver = new 실버(100);
골드 gold = new 골드(100);
gold = silver; // 이곳에서 오류 발생
}
}
}
이렇게 한다면 타입이 다르기 때문에 컴파일 시에 오류가 발생한다.
100코퍼는 1실버다.
이런 연산을 연산자 오버로드를 통해 하려면 =(대입연산자) 를 정의해야 직관적이겠지만
C#에서는 허용되지 않는다.
하지만 대체 구문으로 exlicit, implicit 메서드를 정의하는 것으로 동일한 목적을 달성할 수 있다.
public class 실버 : 통화
{
public 실버(decimal money) : base(money) { }
public override string ToString()
{
return Money + "실버";
}
static public implicit operator 코퍼(실버 실)
{
return new 코퍼(실.Money * 100);
}
}
------------------------------------------------------------
public static void Main(String[] args)
{
코퍼 copper = new 코퍼(100);
실버 silver = new 실버(100);
골드 gold = new 골드(100);
copper = silver;
Console.WriteLine(copper);
}
먼저 implicit 연산자는 이렇게 사용한다.
implicit는 암시적 형변환, 명시적 형변환 모두 허용한다.
단위 관련 형변환은 민감할 수 있기 때문에, 개발자가 의도한 형변환만 가능하도록 제한을 걸고 싶을 수 있는데
이때에는 explicit 연산자를 사용하면 된다.
implicit 대신 explici 을 사용하면 반드시 형변환 연산자() 를 사용해야 한다.
난 이걸 언제 쓰는지 모르겠다.
'C# > 책 정리' 카테고리의 다른 글
C# 정리 ) 추상 클래스 (0) | 2021.12.05 |
---|---|
C# 정리 ) 중첩 클래스 (0) | 2021.12.05 |
C# 정리 ) 메서드 오버로드, 연산자 오버로드 (0) | 2021.12.04 |
C# 정리 ) object 기본 메서드 확장 (0) | 2021.12.03 |
C# 정리 ) base 를 이용한 메서드 재사용 (0) | 2021.12.01 |
댓글