[Book] Effective C# - CHAPTER 3 μ œλ„€λ¦­ ν™œμš©

2020. 12. 15. 19:11Β·πŸ“ Book/✏ Effective
μ œλ„€λ¦­μ€ μ»¬λ ‰μ…˜ 외에도 μΈν„°νŽ˜μ΄μŠ€, 이벀트 ν•Έλ“€λŸ¬, 곡톡 μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ λ“± 맀우 λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œμš©λœλ‹€.

 


μ•„μ΄ν…œ 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(); }
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Book/✏ Effective' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Book] Effective C# - CHAPTER 2 .NET λ¦¬μ†ŒμŠ€ 관리
  • [Book] Effective C# - CHAPTER 1 C# μ–Έμ–΄μš”μ†Œ
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Book] Effective C# - CHAPTER 3 μ œλ„€λ¦­ ν™œμš©
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”