μ λ€λ¦μ 컬λ μ μΈμλ μΈν°νμ΄μ€, μ΄λ²€νΈ νΈλ€λ¬, κ³΅ν΅ μκ³ λ¦¬μ¦ κ΅¬ν λ± λ§€μ° λ€μν λΆμΌμμ νμ©λλ€.
μμ΄ν 18. λ°λμ νμν μ μ½ μ‘°κ±΄λ§ μ€μ νλΌ
νμ 맀κ°λ³μμ λν μ μ½ μ‘°κ±΄μ ν΄λμ€κ° μμ μ μ¬λ°λ₯΄κ² μννκΈ° μν΄μ νμ 맀κ°λ³μλ‘ μ λ¬ν μ μλ νμ μ μ νμ μ ννλ λ°©λ²μ΄λ€.
μ μ½ μ‘°κ±΄μ μ λ€λ¦ νμ μ λν΄ μ°λ¦¬κ° κ°μ νκ³ μλ μ¬μ€μ μ»΄νμΌλ¬μ λ€λ₯Έ κ°λ°μμκ² μλ €μ£Όλ μ©λλ‘ μ¬μ©λλ€.
- μ»΄νμΌλ¬λ νμ 맀κ°λ³μλ‘ μ λ¬λ νμ μ΄ μ μ½ μ‘°κ±΄μΌλ‘ μ€μ ν κΈ°λ₯μ λͺ¨λ ꡬννκ³ μμ κ²μ΄λΌ κ°μ ν μ μλ€.
- μ»΄νμΌλ¬λ μ λ€λ¦ νμ μ μ¬μ©νλ μ¬μ©μκ° νμ 맀κ°λ³μλ‘ μ¬λ°λ₯Έ νμ μ μ§μ νλμ§ μ»΄νμΌ νμμ νμΈν μ μλ€.
μ μ½ μ‘°κ±΄μ μ€μ νλ λμ νλ³νμ΄λ λ°νμμ ν μ€νΈλ₯Ό μννλλ‘ μμ±ν μλ μλ€. κ·Έλ¬λ μ μ½ μ‘°κ±΄μΌλ‘ μμ±νλ©΄ λ°νμμ λ°μν κ°λ₯μ±μ΄ μλ μ€λ₯λ₯Ό μ»΄νμΌνμμ νμΈν μ μκ³ μ½λ λν λ§€μ° μ§§μμ§λ€.
// νλ³νμ΄λ λ°νμμ ν
μ€νΈ μν
public static bool AreEqual<T>(T left, T right)
{
if (left == null)
return right == null;
if (left is IComparable<T>)
{
IComparable<T> lval = left as IComparable<T>;
if (right is IComparable<T>)
return lval.CompareTo(right) == 0;
else
throw new ArgumentException("Type does not implement IComparable<T>", nameof(right));
}
else // μ€ν¨
{
throw new ArgumentException("Type does not implement IComparable<T>", nameof(left));
}
}
// μ μ½ μ‘°κ±΄
public static bool AreEqual2<T>(T left, T right)
where T : IComparable<T> => left.CompareTo(right) == 0;
μ΄μ²λΌ λ€μν μ₯μ μ΄ μμ§λ§ μ μ½ μ‘°κ±΄μ κ³Όλνκ² μ€μ νλ κ²μ μ’μ§ μλ€. λ§μ μ μ½ μ‘°κ±΄μ μ¬μ©νλ©΄ μ λ€λ¦ νμ μ μ¬μ©νλ κ²μ΄ ν° λΆλ΄μ΄ λκ³ κ³Όλν μΆκ° μμ μ μνν΄μΌ ν μλ μλ€.
κ·Έλ λ€λ©΄ μ΄λ»κ² μ μ½ μ‘°κ±΄μ μ€μ¬μΌ ν κΉ?
- μ λ€λ¦ νμ λ΄μμ λ°λμ νμν κΈ°λ₯λ§μ μ μ½ μ‘°κ±΄μΌλ‘ μ€μ νλ€.
- μνλ λ©μλκ° κ΅¬νλμ΄ μμ§ μμ λ λ°νμμ νΉμ μΈν°νμ΄μ€λ₯Ό ꡬννκ³ μλμ§ νΉμ νΉμ λ² μ΄μ€ ν΄λμ€λ₯Ό μμν νμ μΈμ§ νμΈνλ κ²μ΄ μ’μ κ²½μ°λ μλ€.
μμ΄ν 19. λ°νμμ νμ μ νμΈνμ¬ μ΅μ μ μκ³ λ¦¬μ¦μ μ¬μ©νλΌ
μ λ€λ¦ νμ μ κ²½μ° νμ 맀κ°λ³μμ μλ‘μ΄ νμ μ μ§μ νμ¬ μμ½κ² μ¬μ¬μ©ν μ μλ€.
- νμ 맀κ°λ³μμ μλ‘μ΄ νμ μ μ§μ νλ€λ κ²μ μ μ¬ν κΈ°λ₯μ κ°μ§ μλ‘μ΄ νμ μ μμ±νλ€λ κ²μ μλ―Ένλ€.
- μ λ€λ¦μ μΈμ€ν΄μ€νλ λ°νμμ νμ μ κ³ λ €νμ§ μμΌλ©° μ»΄νμΌ νμμ νμ λ§μ κ³ λ €νλ€.
νμ§λ§, νμ μ΄λ λ©μλλ₯Ό μ λ€λ¦ννλ©΄ ꡬ체μ μΈ νμ μ΄ μ£Όλ μ₯μ μ μκ³ νμ μ μΈλΆμ μΈ νΉμ±κΉμ§ κ³ λ €νμ¬ μ΅μ νν μκ³ λ¦¬μ¦μ μ¬μ©ν μ μκ² λλ€.
λ§μ½ μ΄λ€ μκ³ λ¦¬μ¦μ΄ νΉμ νμ μ λν΄ λ ν¨μ¨μ μΌλ‘ λμνλ€κ³ μκ°λλ©΄ κ·Έλ₯ κ·Έ νμ μ μ΄μ©ν΄λ λλ€. μ μ½ μ‘°κ±΄μ μ΄μ©ν μλ μμ§λ§ νμ ν¨κ³Όμ μΈ λ°©λ²μ μλλ―λ‘ μνλλ 맀κ°λ³μμ λν ν μ€νΈλ₯Ό λ°νμμ νμΈνλ€.
μμ΄ν 20. IComparable <T>μ IComparer <T>λ₯Ό μ΄μ©νμ¬ κ°μ²΄μ μ ν κ΄κ³λ₯Ό μ μνλΌ
컬λ μ μ μ λ ¬νκ±°λ κ²μνλ €λ©΄ νμ λ΄μ κ°μ²΄μ μ ν κ΄κ³λ₯Ό νλ¨ν μ μλ κΈ°λ₯μ μ μν΄μΌ νλ€.
IComparable <T>λ νμ μ κΈ°λ³Έμ μΈ μ ν κ΄κ³λ₯Ό μ μνλ μΈν°νμ΄μ€λ‘ CompareTo() λ©μλλ§ μ μλμ΄ μλ€.
- Compare()λ νμ¬ κ°μ²΄κ° λμ κ°μ²΄λ³΄λ€ μμΌλ©΄ 0λ³΄λ€ μμ κ°μ, κ°μΌλ©΄ 0μ, ν¬λ©΄ 0λ³΄λ€ ν° κ°μ λ°ννλ€.
- .NET νκ²½μ΄ μ 곡νλ μ΅μ APIλ IComparable <T>λ₯Ό μ¬μ©νμ§λ§ μΌλΆ μ€λλ APIλ μ¬μ ν IComparableμ μ¬μ©νκΈ° λλ¬Έμ IComparable <T>λ₯Ό ꡬνν λλ IComparableλ ν¨κ» ꡬνν΄μΌ νλ€.
- IComparableμ ꡬνν λλ κ΄κ³ μ°μ°μλ ν¨κ» μ€λ²λ‘λ©νμ¬ μΌκ΄λ κ²°κ³Όλ₯Ό μ 곡ν΄μΌ νλ€.
IComparer <T>λ κΈ°λ³Έμ μΈ μ ν κ΄κ³ μ΄μΈμ μΆκ°μ μΈ μ ν κ΄κ³λ₯Ό μ μν μ μλ μΈν°νμ΄μ€μ΄λ€.
- νμ λ΄μ κ΄κ³ μ°μ°μλ₯Ό μ¬μ μνλ©΄ ν΄λΉ νμ μ μ΅μ νλ λ°©μμΌλ‘ κ°μ²΄μ μ ν κ΄κ³λ₯Ό νμ ν μ μλ€.
public struct Customer : IComparable<Customer>, IComparable
{
private readonly string name;
private double revenue;
public Customer(string name, double revenue)
{
this.name = name;
this.revenue = revenue;
}
// IComparable<Customer> λ©€λ²
public int CompareTo(Customer other) => name.CompareTo(other.name);
// IComparable λ©€λ²: νμ
맀κ°λ³μλ₯Ό μ¬μ©νμ§ μμ λ°νμμ νμ
μ νμΈν΄μΌ νλ€.
int IComparable.CompareTo(object obj)
{
if (!(obj is Customer))
throw new ArgumentException("Argument is not a Customer", "obj");
Customer otherCustomer = (Customer)obj;
return this.CompareTo(otherCustomer);
}
// κ΄κ³ μ°μ°μ
public static bool operator <(Customer left, Customer right) =>
left.CompareTo(right) < 0;
public static bool operator <=(Customer left, Customer right) =>
left.CompareTo(right) <= 0;
public static bool operator >(Customer left, Customer right) =>
left.CompareTo(right) > 0;
public static bool operator >=(Customer left, Customer right) =>
left.CompareTo(right) >= 0;
private static Lazy<RevenueComparer> revComp =
new Lazy<RevenueComparer>(() => new RevenueComparer());
public static IComparer<Customer> RevenueCompare => revComp.Value;
public static Comparison<Customer> CompareByRevenue =>
(left, right) => left.revenue.CompareTo(right.revenue);
private class RevenueComparer : IComparer<Customer>
{
// IComparer<Customer> λ©€λ²
int IComparer<Customer>.Compare(Customer left, Customer right) =>
left.revenue.CompareTo(right.revenue);
}
}
μμ΄ν 21. νμ 맀κ°λ³μκ° IDisposableμ ꡬνν κ²½μ°λ₯Ό λλΉνμ¬ μ λ€λ¦ ν΄λμ€λ₯Ό μμ±νλΌ
νμ 맀κ°λ³μλ‘ μ§μ νλ νμ μ΄ IDisposableμ ꡬννκ³ μλ€λ©΄ νΉλ³ν μΆκ° μμ μ΄ λ°λμ νμνλ€.
μλ₯Ό λ€μ΄ μ λ€λ¦ λ©μλ λ΄μμ νμ 맀κ°λ³μλ‘ μ£Όμ΄μ§λ νμ μ μ΄μ©νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν κ²½μ°μ λ°μνλ€.
- Tκ° IDisposableμ ꡬνν νμ μΌ κ²½μ° λ¦¬μμ€ λμκ° λ°μν μ μμΌλ―λ‘ μΆκ°μ μΈ μ²λ¦¬κ° νμνλ€.
- νμ 맀κ°λ³μλ‘ μ£Όμ΄μ§ νμ μ μ΄μ©νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ©΄ λ°λμ using λ¬Έμ μ¬μ©ν΄μΌ νλ€.
public interface IEngine
{
void DoWork();
}
public class EngineDriverOne<T> where T : IEngine, new()
{
public void GetThingsDone()
{
T driver = new T();
using (driver as IDisposable)
{
driver.DoWork();
}
}
}
νμ 맀κ°λ³μλ‘ μ λ¬ν νμ μ μ΄μ©νμ¬ λ©€λ² λ³μλ₯Ό μ μΈν κ²½μ°μλ λ 볡μ‘νλ°, μ λ€λ¦ ν΄λμ€μμ IDisposableμ ꡬννμ¬ ν΄λΉ 리μμ€λ₯Ό μ²λ¦¬ν΄μΌ νλ€.
public sealed class EngineDriver<T> where T : IEngine
{
// nullλ‘ μ΄κΈ°νλλ€.
private T driver;
public EngineDriver(T driver) { this.driver = driver; }
public void GetThingsDone() { driver.DoWork(); }
}