ITEM 19 : 값 타입에 대해서 0값이 유효한 상태가 되게 반드시 보장해야한다.

|

ITEM 19 :  Ensure That 0 Is a Valid State for Value Types

           (값 타입에 대해서 0값이 유효한 상태가 되게 반드시 보장해야한다.)



■ 요약 및 장점


1.기본 .NET 시스템에서 Object를 초기화 할 때 0으로 초기화 한다. 

  0으로 초기화 하는 값타입의 인스턴스를 막을 수 없다.


2.값타입을 만들때 기본값을 만들어야 한다.


3.하나의 예가 enums다. enums은 System.ValueType으로부터 파생된다.


public enum Planet
{
    // Explicitly assign values.
    // Default starts at 0 otherwise.
    Mercury = 1,
    Venus = 2,
    Earth = 3,
    Mars = 4,
    Jupiter = 5,
    Saturn = 6,
    Neptune = 7,
    Uranus = 8
    // First edition included Pluto.
}
 
Planet sphere = new Planet();


이렇게 초기화 하면 sphrere는 기본 0으로 초기화 되는데, 0은 유효한 값이 아니다.


이럴때에는 명시적으로 Planet sphere2 = Planet.Mars; 선언해줘야 한다. 

하지만 다른타입에 속해있다면 유효한값으로 초기화 하기가 더 힘들어진다.


public struct ObservationData
{
   private Planet whichPlanet; //what am I looking at?
   private double magnitude; // perceived brightness.
}


따라서 아래와 같이 0이 의미있는 상태로 만들어줘야 한다.


public enum Planet2
{
    None = 0,
    Mercury = 1,
    Venus = 2,
    Earth = 3,
    Mars = 4,
    Jupiter = 5,
    Saturn = 6,
    Neptune = 7,
    Uranus = 8
}



4. enums에서 특별하게 Flags Attribute 를 사용할때가 있는데 이렇게 하면

항상 None 값이 0이 되어야 한다.


[Flags]
public enum Styles
{
    None = 0,
    Flat = 1,
    Sunken = 2,
    Raised = 4,
}


5.보통 프로그래머들은  AND operator를 사용해서 None값으로 초기화 됐을때 코드가 

실행이 되지 않게 처리하는 방법을 쓰고있다.


if ((flag & Styles.Flat) != 0) // Never true if Flat == 0.

     DoFlatThings();



6.다른 초기화 문제는 참조를 포함하는 값타입에서 발생한다.


public struct LogMessage
{
    private int ErrLevel;
    private string msg;
}
 
LogMessage MyMessage = new LogMessage();


이렇게 초기화 하면 msg가 Null값을 갖는다. 이것을 막을 수가 없는데 이럴때에는 프로퍼티를 이용해서 getter에서

msg가 null 인지 체크해서 null이면 string.Empty를 리턴하면 된다.


■ Terms



■ 단어


As it stands: 현상태 그대로

magnitude:규모,광도

don't make any sense:전혀 말이 안된다.

make sense:타당하다.

sphere:구체

perceive:감지하다.

faulty:흠이있는,불완전한


And

ITEM 18 : 값 타입과 참조 타임을 구별하라

|

ITEM 18 : Distinguish Between Value Types and Reference Types

(값 타입과 참조 타임을 구별하라)



n  요약 및 장점


1. Structs는 데이터를 저장하고, Classes는 행동을 정의한다.


2. 자바에서는 모든 사용자 정의 타입들은 참조 타입이다. 또한 모든 파라미터와 리턴값은 참조타입이다. 이것은 일관성을 유지한다는 장점이 있지만, 성능이 좋지 않다. C#에서는 struct/class 키워드를 통해서 value type reference type을 선택할 수 있다.


3.아래의 4가지의 항목을 모두 충족한다면 value type으로 생성해야만 한다.


     타입의 주요한 책임이 데이터 저장인가?

     프로퍼티에 의해 완전히 정의된 공용 인터페이스가 데이터 멤버를 접근하는가?

     타입이 절대 subclass를 갖지 않는가?

     타입이 절대 다형성을 갖지 않는가?



n  Terms


n  해석이 잘 안되거나 중요한 내용


n  단어

1.      preferring : 선호하는

2.      polymorphic: 다형성

3.      consistent :일관성

4.      far-reaching : 지대한 영향을 가져올

5.      principal : 주요한 / 교장

6.      entirely : 전적으로, 완전히, 전부

And

ITEM 17 : 표준 Dispose 패턴을 구현하라

|

ITEM17 : Implement the Standard Dispose Pattern.

   (표준 Dispose 패턴을 구현하라)



n  요약 및 장점


1.  일반적인 자원해제 패턴은 Client가 자원해제를 잊지 않았다면, Unmanaged Resource IDisposable 인터페이스를 이용해서 해제(명시적 호출)하며, 만약 잊어버렸다면 방어적으로 Finalizer를 사용해서 자원해제를 한다.


2.  Root base class는 자원해제를 위해서 IDisposable Interface를 구현해야 하며, 방어적인 메커니즘을 위해서 Finalizer를 추가해야만 한다. 하위 클래스들에서는 이 virtual method override해서 자원을 해제해야 한다.(Obejct.Finalize method)


3.  당신의 클래스가 unmanaged resources를 사용한다면 반드시 finalizer를 구현해서 사용자가 Dispose를 호출하지 않더라도 자원해제가 정상적으로 될 수 있게 해야 한다.


4.  GC가 실행이 되면, 즉시 메모리에서 finalizer가 없는 object들을 해제한다. 메모리에 남은 finalizer가 있는 object들은 finalization Queue에 들어가게 된다. GC는 해당 object들의 finalizer를 실행하도록 새로운 쓰레드를 생성한다. 따라서 finalization이 필요한 object들은 메모리에 그렇지 않는 object들보다 더 오랫동안 남아있게된다. 그러나 선택의 여지가 없다. 방어적으로 하려면 당신의 타입들이 unmanaged resources를 잡고 있다면 finalizer를 구현해야 한다.


5.   IDisposable.Dispose() 4가지의 책임이 있다


     모든 unmanaged resources를 해제

     모든 managed resources를 해제(unhooking events들도 포함)

     state flag object disposed됐다고 설정하는 것. 상태를 체크해야 하며 object dispose된 후에 해제된 리소스에 접근하는 모든 호출에 대해서 ObjectDisposed exceptions throw해야한다.

     GC.SupressFinalize(this)를 호출해서 Finalization이 실행되는것을 금지해야한다.

 

6.  소스참고 ( dispose 패턴) : 위의 예제에서는 Finalize 메소드를 구현하지 않았는데 그 이유는 unmanaged resource를 사용하지 않았기 때문이다.


7.  DisposeFinalize(~) 매소드 내에서 자원해제 이외의 처리를 하지 마라. 만약 그렇게 한다면 Object의 생명주기에 심각한 문제가 발생이된다. 특히 해당 클래스를 다시 사용 가능하게 전역변수에 할당하는 것은 문제가 된다.


8.  Managed 환경에서는 finalizer를 구현할 필요가 없지만 objectunmanaged type 또는 IDisposable 인터페이스를 구현한 member를 포함한다면 구현해야 한다.


n  Terms


1.  Unmanaged Resource: CLR에 의해서 관리가 되지 않는 자원들, GC가 이 자원에 대해서 존재자체를 모른다. 따라서 이런 자원을 사용하면 사용자가 메모리를 반드시 해제해줘야 한다. (. File Handle, COM Object, Database Connection..)


2.  Managed Resource: CLR에 의해서 관리되는 자원들. Garbage Collector가 자원해제를 담당한다.


n  해석이 잘 안되거나 중요한 내용


n  단어

1.      thoroughly:완전히,대단히

2.      in a timely fashion : punctually, 정각에

3.      entry point : 진입점

4.      Hog : 돼지(비육돈)

5.      Encapsulate : 요약하다.

6.      complication : 문제,합병증

7.      comatose : 혼수상태의

8.      cringe : 민망하게 하다, 움추려들게 하다.

9.      Idiom : 관용구 , 숙어

And