본문 바로가기

공부/개발독서 - c++, c#

[effective C#] 1장 C# 언어 요소 (아이템 8 ~ 10)

반응형

아이템8: 이벤트 호출 시에는 null 조건 연산자를 사용하라

이벤트 핸들러가 결합되어 있는지 확인하는 코드를 추가하다 이벤트가 있는지 확인하는 코드와 이벤트를 발생시키는 코드 사이에 경쟁 조건(race condition)이 발생할 가능성이 있다. 이 문제는 C# 6.0의 null 조건 연산자를 사용하면 깔끔하게 해결할 수 있다.

  • null 조건 연산자는 원자적으로 처리된다

아이템9: 박싱과 언박싱을 최소화하라

값 타입은 다형적이지 못하다. .Net Framework는 모든 타입의 최상위 타입을 참조 타입인 System.Object로 정의하고 있다. .Net Framework는 박싱과 언박싱이라는 방법을 통해 이 두 가지 서로 다른 타입을 이어준다.

박싱과 언박싱은 성능에 좋지 않은 영향을 미친다. 때로는 박싱과 언박싱을 수행하는 과정에서 임시 객체가 생성되기도 하는데, 간혹 이로 인해 예상치 못한 버그가 발생하기도 한다. 따라서 박싱과 언박싱은 가능한 한 피하는 것이 좋다.

  • 박싱은 ‘복사본’을 생성한다. 이로 인한 버그나 의도치 않은 결과가 발생할 수 있다.
  • 가능하면 제너릭을 이용하자

아이템10: 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라

베이스 클래스에서 virtual로 선언하지 않은 멤버를 재정의하려는 경우 new 키워드를 사용할 수 있다. 하지만 사용할 수 있다는 것과 잘 사용한다는 것은 다른 이야기다. 왜냐하면 virtual로 선언되지 않은 메서드를 재정의하면 메서드의 동작 방식을 모호하게 만들 우려가 있기 때문이다.

비가상메서드는 정적으로 바인딩된다. 가상메서드는 동적으로 바인딩되므로 런타임에 객체의 타입이 무엇이냐에 따라 그에 부합하는 메서드를 호출한다.

가상메서드는 반드시 다형성이 필요한 경우에만 사용해야 한다. 가상 메서드를 제한적으로 사용하는 것이 클래스의 기능성을 제약한다고 생각한다기보다는 이 클래스의 활용 방법에 대해 더 신중한 가이드라인을 제시하는 것으로 생각해야 한다.

new 한정자를 활용해도 좋은 경우는 베이스 클래스에서 이미 사용하고 있는 메서드를 재정의하여 완전히 새로운 베이스 클래스를 만들어야 하는 경우 정도다.

  • 이미 널리 사용되고 있는 메서드가 있어 이를 사용하는 코드를 일일이 찾아서 수정하기 어렵거나 외부 어셈블리에서 이 메서드를 사용하고 있어 수정할 수 없는 경우
  • 외부에서 구매한 라이브러리 등
반응형