로그인회원가입장바구니고객센터마이페이지회사소개
kangcom
전체
서평보기
Effective C# : 강력한 C# 코드를 구현하는 개발지침 50가지
Bill Wagner | 한빛미디어 | 번역서 | 2007-01-10
종합평점
도서수준
C# 강력한 code 작성을 위한 첩경 2007-04-17 오후 3:49:12 
평점
도서수준
조회수 (1943)
공감 (0)
임은천 님의 블로그
누군가에 대해서 잘 모르면, 오해를 할 수밖에 없다. 우리가 누군가를 이해할 때는 사랑할 수 있는 바탕이 되지만, 뭔가를 오해할 때는 저주하고 미워하는 바탕이 된다. 사람과의 관계에서만 그런 것이 아니라 기술에 대한 접근도 이와 마찬 가지이다.
 
본 독자가 스스로 생각하기에 C# 언어에 대해서 약간의 미움을 가지고 있는 듯 하여, C#에 대해 좀 더 알아볼 심산으로 이 도서를 읽게 되었다. 기존의 Effective 시리즈의 이름을 달고 있기 때문에 이 책이 C# 언어에 대한 이해에 큰 도움을 줄 것이라고 기대를 하게 되었다.
 
총 50개의 지침으로 되어 있는 이 책의 내용은 본 독자가 C#에서 모르고 있었던 언어의 특성들을 파악하게 해줬으며, C# 언어를 바라보는 관점을 다르게 해주기에 충분한 내용이었다. 꼭 필요한 내용으로 엄선해서 다뤄지는 내용들인지라, 한자 한자에서 느껴지는 정성이란 감동이 사뭇 크다. 특히 마치 국내서처럼 읽혀지는 번역과 거의 존재하지 않는 오타로 인해 가벼운 마음으로 읽을 수 있었다. 책의 양이 적어서 내용이 부실할 거라는 생각은 하지 않아도 된다.
 
각 Item들에 대해서 간략히 살펴보자.
 
item 1에서 다루고 있는 프로퍼티를 항상 사용하라는 것에 대해서는 encapsulation을 지원하는 장점과 사용하기 쉽다는 점, 인덱서를 통해서 객체를 배열처럼 접근할 수 있다는 장점이 존재한다. 하지만, 명시적인 accessor, getter임을 확인하기가 어렵다는 단점이 존재한다. 추상적인 관점에서 입력과 출력이 다를 수도 있는데, 그런 것을 처리하는 것이 조금 어렵다는 단점이 있다.
 
item 2에서 다루고 있는 readonly에 대해서는 잘 모르고 있던 기능인데, readonly의 장점을 알았으니 한 번씩 써보도록 해야 겠다.
 
item 3에서 다루고 있는 as나 is는 이미 쓰던 것인데, 명시적 cast 보다 의미적으로 잘 드러나는 장점이 존재한다.
 
item 4의 Conditioanl Attribute는 몰랐던 것으로 [Conditional("DEBUG"), Conditional("TRACE")] 같은 것은 정말 유용한 기능이라고 할 수 있다.
 
item 5의 내용은 이미 다른 effective 시리즈에서 본 내용이다. ToString()을 잘 활용하자.
 
item 6의 value 타입과 reference 타입을 구분해라고 하는데, 본 독자는 사실 거의 구분을 하지 않고, reference 타입으로 생각해서 쓰는 것을 선호한다. 정말 성능 문제가 일어나지 않는다면, 추상화가 더 잘된 것이 좋다.
 
item 7의 immutable atomic value 타입이 더 좋다는 것은 아마 다른 resource를 통해서 만나본 내용일 것이다.
 
item 8의 0의 의미에 대한 것은 유용한 생각이라고 생각한다.
 
item 9의 경우엔 동일성 판단에 대한 것인데, 본 독자는 개인적으로 operator 오버라이딩을 유용하게 써본 적이 있어서, 이 내용을 참고해서 더 잘쓸 수 있을 것 같다.
 
item 10의 GetHashCode()의 경우엔 91p의 내용을 참고하자.
 
item 11의 경우엔 이미 다른 resource에서 접한 내용이고, 적용하고 있다.
 
105p~110p에서는 자원 관리에 대한 .NET에서의 접근법을 다루고 있다. Compaction, GC, 세대 등에 대한 용어에 익숙해 지자.
 
item 12에서는 내부적으로 생성자에서 어떤 식으로 처리 되는 지 보이면서 이렇게 하면 안된다는 것을 강조하고 있다.
 
item 13에서는  다른 resource에서도 접할 수 있는 static member에 대한 내용이다.
 
item 14의 연쇄적 생성자 호출은 이미 하던 것이라서, 별 의견은 없다. 당연히 연쇄적 생성자 호출이 좋다.
 
item 15, 18은 간혹 소스에서 보이던 using에 대한 궁금증을 해소해 주는 내용이었다. 결국 IDisposable 인터페이스와 관련 있는 내용이었다.
 
item 16의 GC 최소화, item 17의 boxing, unboxing 최소화는 다른 resource에서도 마찬가지이다.
 
item 19의 경우엔 이전 부터 이미 적용해왔던 interface에 대한 내용이다.
 
item 20의 경우엔 virtual 메서드의 overriding에 대한 내용인데, interface에 대한 method의 overriding에 대해서 C#의 동작에 대한 설명을 하고 있다. 본 독자는 개인적으로 일반적인 개발자들이 의도하는대로 concrete class의 내용이 언제나 binding 되도록 일관성이 지켜졌으면 하는 바램이다.
 
item 21의 경우엔 이미 사용하고 있던 delegate 콜백의 사용이다. delegate의 결합도 하락은 참 쓰기 편하다.
 
item 22는 그 동안 본 독자가 어떻게 구현하는 지 궁금했던 event handler에 대한 사용법을 알려준다. observer 패턴 적용을 언어 측면에서 지원해준다는 것은 상당한 강점이다.
 
item 23은 본 독자의 경우엔 주로 interface를 반환하는 것을 선호하는데 그로 인해서 이미 원하는 데로 적용을 하고 있던 내용이었다.
 
item 24는 약간 동의하기 어려운데, 아직까지는 명령적 프로그래밍과 속성 프로그래밍을 같이 사용하는 것이 좋다고 생각하며, 본 독자는 선언적 프로그래밍이라는 용어 자체가 가진 범위가 너무 넓기 때문에 적절하지는 않다고 생각한다.
 
item 25는 effective java와는 약간 다른 측면인데, 어찌 되었든 여기에서 다뤄지는 내용은 자바의 Serializable interface 구현이나 Externalizable의 구현과 동일하다.
 
item 26은 다른 resource에서도 접할수 있는 IComparable과 IComparer를 이용한 순차 관계 구현에 대한 내용이다. 정렬과 관련 있다.
 
item 27은 ICloneable 구현에 대한 내용인데, 어디서나 자주 다뤄지는 내용이지만, 좋아하지도 않고 자주 구현도 하지 않은 clone에 대한 내용을 다루고 있다. 역시 clone은 매우 드물게 사용된다.
 
item 28은 203p에서 보이듯이 거의 사용하지 않은 묵시적 형변환 연산자에 대한 사용이다. 당연히 사용하지 않는 것이 좋다. 어차피 잘 알고 쓰는 사람도 별로 없을 듯하다.
 
item 29는 new 한정자의 용법에 대한 내용인데, 이진 어셈블리 상에서의 변동을 최소화하여 원하는 함수 호출을 위한 내용으로 이해를 했다. 다만, new 한정자 자체는 별로 필요없는 개념이라는 생각이 조금 든다. 잘 몰라서 그런지도 모르겠다.
 
211p~216p에서는 이진 컴포넌트 작성에 대한 내용을 다루면서, .NET이 CBD 개발에 어느 정도 지원을 하는지 잘 보여주고 있다. 내용 자체는 이전에 잠깐 씩 봤지만, 잘 정리된 내용이라 참고하길 바란다.
 
item 30은 너무나 당연한 거지만 CLS를 준수하는 어셈블리가 좋다는 이야기를 하고 있다.
 
item 31은 본 독자가 이전에 반대로 생각하고 있던 작고 단순한 메서드가 좋다는 관점이었는데, 어찌 되었든, 컴파일러가 똑똑하다는 생각이 든다.
 
item 32는 설계에서 당연하게 여겨지는 작고 응집도 높은 어셈블리가 좋다는 내용이다.
 
item 33 역시 설계에서는 너무 당연한 내용인 타입 가시성 제한에 대한 내용이다.
 
item 34의 웹 API는 큰 단위로 작성해라는 것 역시 너무 당연한 내용이다.
 
243p~244p에 간단히 나온 프레임워크의 사용은 사실 MSDN을 잘 확인해서 재사용을 잘하자는 의미이다. 물론 MSDN에 대한 이야기는 적혀있지는 않다.
 
item 35의 이벤트 핸들러 보다 override를 사용하는 편이 낫다에는 동의할 수 없는데, 상속은 쉽게 사용이 가능하지만, 코드가 종속되는 면이 있다. 개인적으로는 성능의 큰 차이가 없다면 이벤트 핸들러를 선호한다.
 
item 36의 닷넷 런타임 진단 기능은 Debug만 썼었는데, Trace를 쓰는 것에 대해서 알려줘서 유용했다. 이전에 유경상님께서 이런 내용을 Attribute와 조합해서 보여주셨던 것 같은데, 그런 식으로 쓰면 금상 첨화일 것이다.
 
item 37은 아마 대부분 잘 알려진 내용인데, 단순히 있는 것만 쓰지말고, 255p의 XmlSerializer를 이용한 코드도 보도록 하자. 다만, 여전히 XmlSerializer만으론 즉시 원하는 결과를 얻는 것은 아니지만, 그래도 안 쓰는 것보단 훨씬 더 유연하게 설정을 변경할 수 있다.
 
item 38은 데이터 바인딩을 사용하는 것인데, 본 독자의 경우도 258p처럼 쓰고 있었던 터라 매우 유용했다. 이렇게 Control과 Binding을 하면 속성 변화를 바로 GUI에 적용할 수 있고, 내부 모델에도 적용할 수 있다는 것이 참 좋은 점이라 할 수 있다.
 
item 39는 개인적으로 이전부터 좋아했던 검증 방식은 266p의 RegularExpressionValidator였다. 역시 이것을 적절히 사용하면, 대부분의 검증을 쉽게 할 수 있다.
 
item 40에서는 적절한 collection 개체를 사용해라는 내용이었는데, generic collection에 대한 내용이 나오길 기대했는데, 아마 이 내용은 다른 책을 참고 해야 할 것 같다. 다만, 274p에 나오듯이 다차원 배열 생성시에 유의점은 살펴보는 것이 좋다.
 
item 41은 이전의 DataSet에 대한 궁금증을 해소해 주는 내용이라 주의 깊게 보았다. 생각 했던 것과 큰 차이는 없었다.
 
item 42는 attribute 사용에 대한 내용을 다루고 있다. 유경상님의 글을 통해 이전에 접한 내용이었지만, 이 책에서도 역시 reflection과 attribute를 잘 조화시켜 사용하는 법을 보여준다. 조금 소스가 번잡한듯 하지만, 한 번 구현해 놓으면 재활용 성이 뛰어나다.
 
item 43은 reflection을 많이 사용하지 마라는 내용인데, 다른 resource에서도 마찬가지이다.
 
item 44, 45는 예외 처리에 대한 내용인데, 아마 동의 하는 사람도 있고, 아닌 사람도 있을 것이다. 본 독자는 필요할 때만 만들자는 주의라서 동의하지 않는다.
 
item 46은 Interop에 대한 내용이다. 기존의 COM 사용이나 Windows API에 어떻게 접근하느냐에 대한 내용이고, 기존의 라이브러리가 전부 대체 되기 전까지는 하위 호환성 문제로 꽤 오래 남아 있을 내용이다. 어쨌든 .NET에 적응하려면 안 쓰는 게 좋을 것이다. 하지만, 안 쓰려면 어쩔 수 없이 새로 개발해야 한다.
 
item 47은 안전한 코드가 더 좋다는 내용으로, 코드의 접근 권한에 대한 내용을 다룬다. 329p의 IsolatedStorageFile에 대해서 배울 수 있는 기회였다.
 
item 48은 유용한 툴을 소개 하고 있고, item 49에서는 C# 2.0의 특징에 대해서 다루는데, partial은 이미 아는 내용이었다.
 
item 50은 마지막으로 표준에 대한 내용과 무엇을 더 공부해야 할까? 에 대한 내용을 다루고 있다.
 
오타는 사실 3개 정도 있었는데 그 중 2개이다.
27p.
위의 INameValuePair
-> IConstNameValuePair
 
28p.
IConstnameValuePair.Value
-> IConstNameValuePair.Value
 
어찌 되었든 이 책 덕분에 C#에 대해서 어느 정도 이해되긴 했지만, 여전히 부족하다는 생각이 든다. 계속 변화는 언어이므로 꾸준히 조금씩 익히도록 해야 겠다.
 
[점수]
통합성 : 100점 / 100점
용어 선정 : 100점 / 100점
독자 이해도 : 100점 / 100점
주석 점수 : 100점 / 100점
 
p.s. 좋은 서적 감사합니다. 번역도 정말 잘되었네요.

 
코멘트 0   공감 0
코멘트작성
 
이메일주소수집거부