이펙티브 C# (빌 와그너, 2017) 독후감

2 minute read

제목에 effective가 붙은 책은 믿고 본다. 아이템 별로 스토리가 있어서 재미있다. 책보다는 스토리가 있는 팁에 더 끌리는 것과 비슷하다고 생각한다. 간단한 팁을 넘어서서 왜 이렇게 동작하는지 좀 더 깊게 설명해서 몰랐던 부분도 배운다. 스콧 마이어스(Scott Meyers)에게 책 내용에 대한 조언을 구했다는 게 인상적이다. 강제는 아닌 것 같지만 Effective C++로 이런 형식의 책을 만든 저자에 대한 존중이라고 생각했다.

C#을 어느 정도 알아야 이해가 된다. 그래서 중급서로 분류가 된다. 해당 언어에 effective가 붙은 책이 있다면 필독서로 추천되곤 하는데, 이 책도 그런 필독서가 아닐까 생각했다.

재미있었던 아이템에 대한 간단히 정리해봤다.

  • 아이템 1: 지역변수를 선언할 때에는 var를 사용하는 것이 낫다
    • C++에서 지역변수에 auto를 사용하라고 권장하는 것과 궤가 같다.
  • 아이템 3: 캐스트보다는 is, as가 좋다
    • 형변환 캐스팅 연산자를 정의하지 않았다면 as 를 사용해 더 간편하게 검사할 수 있다.
  • 아이템 6: nameof() 연산자를 적극 활용하라
    • 문자열로 클래스 이름을 사용할 일이 있으면 괜히 오타 내지 말고 nameof 연산자를 사용.
    • 이름 변경에도 컴파일 에러로 방어가 된다.
  • 아이템 8: 이벤트 호출 시에는 null 조건 연산자를 사용하라
  • 아이템 17: 표준 Dispose 패턴을 구현하라
    • 가물가물했던 Dispose 패턴을 다시 공부했다.
  • 아이템 22: 공변성과 반공변성을 지원하라
  • 아이템 23: 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라
    • 인터페이스로 제약 조건을 만들어서 사용하기 번거로웠던 기억이 떠올랐다.
  • 아이템 24: 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라
    • 제네릭 메서드와 제네릭 함수 특화 메서드가 있을 때, 어떤 메서드가 호출되는지 규칙에 대해 배웠다.
  • 아이템 27: 인터페이스는 간략히 정의하고 기능의 확장은 확장 메서드를 사용하라
    • C++에서 클래스에 필요한 구현만 하고 public 멤버 함수로 호출해서 결과를 낼 수 있는 건 Helper 를 뒤에 붙여 정의하는 방법을 시도한 기억이 떠올랐다
  • 아이템 29: 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다
    • 컬렉션을 리턴하는 코드를 짰던 걸 반성
  • 아이템 31: 시퀀스에 사용할 수 있는 조합 가능한 API를 작성하라
    • 지연 평가(lazy evaluation)가 기본이던 clojure 생각이 불현듯났다.
  • 아이템 34: 함수를 매개변수로 사용하여 결합도를 낮추라
    • 인터페이스에 함수를 추가할 때, 타입의 성격을 나타내는 건지 특정 API를 사용하기 위해서인지를 생각해보게 된다.
  • 아이템 38: 메서드보다 람다 표현식이 낫다
  • 아이템 41: 값비싼 리소스를 캡처하지 말라
    • C# 컴파일러는 클로저를 구현할 때, 메서드 내에서 단 하나의 중첩 클래스만 생성한다.
  • 아이템 44: 바인딩된 변수는 수정하지 말라
    • 람다 표현식(lambda expression)에 인스턴스 변수, 지역 변수를 참조하느냐에 따라 C# 컴파일러가 어떻게 코드를 생성하는지를 배웠다.
  • 아이템 49: catch 후 예외를 다시 발생시키는 것보다 예외 필터가 낫다
    • 예외 필터를 사용해 쓸데없는 스택 되감기(stack unwinding)를 방지하는 방법을 배웠다.
  • 아이템 50: 예외 필터의 다른 활용 예를 살펴보라
    • 콘솔 로그를 찍는다든지 디버거가 붙지 않았을 때만 예외를 던진다든지 하는 활용 방법을 배웠다.