Purpose-built post
이 포스트는 내가 이 책의 항목 4를 읽고 정리한 내용과 읽고 느낀점, 실제로 썼을 때 느꼇던 점을 정리하기 위해서 만들었다.
Content
#if/#endif 는 C/C++ 를 사용했던 사람이라면, 언제/어떻게/왜 쓰는지 알 고 있을 것이다. C# 도 마찬가지로 #if/#endif 를 쓸 수 있다. 하지만 책의 내용은 Conditional Attribute를 사용 하라는 내용인데, 나는 이 항목을 쭉 읽고, 직접 해보았다.
#if/#endif 보다 좋은 점은 다음과 같다
장점
1. 소스가 깔끔하게 보인다.
깔끔하게 보이는 것은 중요하다. 그 만큼 코드 보기가 쉽다는 뜻이기 때문이다. #if/#endif 를 사용하면, 코드 내에 #if/#endif 로 들쭉 날쭉한 코드가 보이게 됨으로써, 가독성이 무척 떨어진다.
2. 확실하게 독립된 경계 구역을 손쉽게 만들 수 있다.
#if/#endif 도 경계 구역을 만들 수 있으나, 손쉽지는 않다. 하지만 C#에서는 보다 손쉽게 할 수 있도록 Conditional Attribute를 이용할 수 있다.
왜 독립된 구역을 만들어야 하냐?
#if/#endif 를 사용하면, "경계" 가 생긴다. 이 경계는 조건에 따른 경계다. 예를 들면, A 조건일 땐 활성화, 아닐 땐 비활성화 같은 경계 말이다. 이 경계가 #if/#endif 로 생겨 났으면서, 경계 구분이 애매해진다. 이 애매함은 변수 a가 있을 때, a의 값이 조건부에 따라 달라지고, 이 달라짐이 전체 프로그램에 영향을 미친다.
결국 변수 a가 조건에 따라 값이 달라짐에, 다른것이 영향을 받으므로, 경계가 애매해 지는 것이다.Conditional Attribute를 사용하면, 리턴값, out 값, ref 값을 사용할 수 없게 함으로써, 이 경계가 확실하게 독립될 수 있게 만들 수 있다.
단점
1. 결과값을 사용 할 수 없다.
확실하게 독립된 경계 구역을 만들 수 있어 장점이 되었으나, 결과값을 사용 할 수 없으므로, 컴파일 조건에 따라 상태 변화를 봐야한다면, 처음부터 다시 처리해야 한다.
Digression
- 확실히 편하다. 컴파일 조건에 따른 "변화" 보다는 컴파일 조건에 따른 "추가" 작업을 할 때 빛을 발한다고 생각한다.
- 테스트 코드를 만들어 정리해야 하나, 책에 나와 있으므로, 대략 생략한다.
'책 정리 > Effective C#' 카테고리의 다른 글
item 10, GetHashCode()의 함정을 유의하라 (0) | 2010.06.27 |
---|---|
item 9, ReferenceEquals(), static Equals(), instance Equals(), operator==의 상호 연관성을 이해해라. (0) | 2010.06.26 |
item 8, value 타입을 사용할 때 0이라는 값이 의미를 가질 수 있도록 하라 (0) | 2010.06.24 |
item 7, immutable atomic value 타입이 더 좋다 (0) | 2010.06.23 |
item 6, value 타입과 reference 타입을 구분하라. (0) | 2010.06.20 |
Item 5, 항상 ToString()을 작성하라. (0) | 2010.06.11 |
item 3, cast보다는 is나 as가 좋다. (0) | 2010.04.05 |
Item 2, const 보다는 readonly가 더 좋다 (0) | 2010.04.02 |
Item 1, 데이터 멤버 대신에 항상 프로퍼티를 사용하라 (0) | 2010.03.31 |
Effective C# 을 읽는다. (711) | 2010.03.30 |
최근댓글