728x90
마이크로소프트가 제공하는 닷넷 프레임워크는 그 양이 정말 방대하다. 그러다 보니 이미 오래전부터 존재하고 있음에도 불구하고 사용자들에게 널리 사용되지 않는 요소들도 꽤 많다. 오래된 기술이라서 Deprecated 되는 요소를 제외하더라도 그 유용성에 비해 사용자들의 인지가 떨어지는 것들이 여럿 있다. 그 중 대표적인 것이 바로 "?? 연산자" 이다. 

일반적으로 사용자들은 단행 조건문 처리를 할 때나 Nullable 자료형을 선언할 때 쓰는 "?" 는 많이 사용하는 편이다. 하지만 물음표를 두개 붙이 "??" 연산자를 사용하는 경우는 쉽게 찾아보기 어렵다. 그렇다면 도대체 물음표를 두개 붙여 놓은 "?? 연산자"는 무얼하는 친구일까?

 
우선 "??" 연산자는 영어로 null-coalescing 연산자라고 부른다. 우리말로 어떻게 해석해야 할지 조금 애매하니 그냥 "??" 또는 "?? 연산자" 라고 부르기로 하겠다. 이 연산자의 용도는 Null 값을 가질 수 있는 변수들을 사용할 때 초기값의 원활한 지정이다. 보통 Null 값의 처리를 위해 아래와 같은 코드를 많이 사용한다.

int? numOne = null;
int? numTwo = 23;

if (numOne != null)
    return numOne;
if (numTwo != null)
    return numTwo;

return 10;


이 코드는 Null 값을 가질 수 있는 두개의 정수형 변수 numOne 과 numTwo를 비교하여 Null이 아닌 값을 출력하기 위한 간단한 코드이다. 만약 둘다 null 값이면 숫자 10을 출력하게 된다. 우선 이 코드를 물음표 한개를 이용하여 단행 조건문으로 처리해 보면 아래처럼 표현될 수 있다.

return (numOne != null ? numOne : (numTwo != null ? numTwo : 10));

한줄로 처리가 되긴 했지만 가독성이 그리 높은 코드는 아니다. 코드 자체의 길이도 길지만 콜론과 괄호, 물음표, 부등호 등이 섞여 있어서 한눈에 내용을 파악하기에는 쉽지 않은 상태이다. 이것은 "??" 연산자를 이용해서 표현하면 아래와 같다.

return ((numOne ?? numTwo) ?? 10);

처음에 상당히 길었던 코드가 상당히 짧게 표현되었다. numOne ?? numTwo 의 의미는 두가지 변수 중 Null 값이 아닌 것이 어떤 것인가? 를 의미한다. Null 이 아닌 값이 있으면 해당 변수 값이 Return 된다. 하지만 둘다 Null 이면 numOne ?? numTwo 의 결과는 Null 이다. 이후 바깥쪽 괄호의 처리가 진행되는데 Null ?? 10 을 연산하게 되면 Null 이 아닌 10 이 Return 되게 된다.  

소프트웨어 개발을 하면서 Null 값의 처리는 꼭 해줘야 하는 필수적인 예외처리 로직이다. 이왕 해야 하는 처리 로직이라면 조금 더 간결하고 가독성 있는 코드를 만들어 쓰는 것이 더 좋지 않을까?

- NoPD - 
728x90
728x90
윈도폰7은 기존 마이크로소프트의 윈도우모바일 계열 운영체제와 다르게 닷넷 기반의 C# 만으로 개발이 가능하다고 알려져 있습니다. Managed 코드로만 개발을 가능하게 함으로써 애플리케이션과 운영체제의 안정성을 더 높히겠다는 마이크로소프트의 의지가 반영된 결과입니다. 한동안 Native C 를 지원하지 않음으로서 생기는 단점들에 대하여 갑론을박이 많았습니다만 단말 런칭 이후에는 이런 이야기가 많이 줄어든 분위기입니다.

마이크로소프트는 여기에 더하여 개발자 저변을 확대하기 위하여 비주얼베이직으로도 개발이 가능한 개발도구 추가 기능을 공개했습니다. 기존에 설치한 비주얼스튜디오 2010 윈도폰 버전이나 윈도폰7 개발도구가 추가된 비주얼스튜디오에 설치 가능하며 아직 정식 버전이 아닌 RTW 임을 감안하여 테스트 해볼것을 권장하고 있습니다. 비주얼 베이직은 은근히 개발자 층이 넓다는 것이 이번 개발도구 런칭의 이유가 아닐까 싶습니다.


개발도구를 다운로드 받는 MSDN 경로는 위의 이미지에 연결해 두었습니다. 이로써 윈도폰7을 개발할 수 있는 닷넷 기반의 Managed 언어는 C# 과 VB 가 된 것 같습니다. 다만 현재까지 XNA 기반의 게임 개발에는 사용할 수 없고 실버라이트를 기반으로하는 일반 어플리케이션 개발로 한정된다고 합니다. 

- NoPD -
728x90
728x90
오랜만에 포스팅을 올립니다 :-)
마이크로소프트가 제공하는 윈도우폰7 트레이닝 세션을 보기 시작했습니다.
시작하면서 세션 발표자들께서 좋은 링크들을 많이 공유해 주시네요

아무리 윈도우폰7이 실버라이트와 블렌드를 잘 써야한다고 해도
그 기저에는 C# 이 있다는 것을 부인할 사람은 아무도 없습니다.
본격적으로 윈도우폰7 개발을 공부하기 전에 C# 을 정리해보는 것은
상당히 의미있는 시간이 될 것으로 생각되네요!


위 웹사이트에서 C# Yellow Book 이라는 컨텐츠를 무료 배포하고 있습니다.
잘 아시는 분들도 Remind 하시는 차원에서 한번쯤 보시면 좋을 것 같네요!
귀차니즘을 극복하시려면 아래 링크로 책을 받으시면 됩니다 :-)


- NoPD -
728x90
728x90
C# 3.0 에서 새롭게 도입된 Lambda 표현식을 사용하면 코드를 정말 간단하게 표시할 수 있는 장점이 있습니다. 델리게이트가 세상에 처음 나타난 이래 이는 정말 많은 프로그램과 개발자들에게 형언할 수 없는 아름다운 생활을 할 수 있는 "기회"를 주었습니다. 물론... 기회에는 반대급부가 따랐지만 말이죠.. 쿨럭... 여튼... 아래의 간단한 세가지 코드를 보면서 코드가 아름다워지는 광경을 한번 보도록 하겠습니다.

Named 메서드의 사용
IEnumerable<string> filteredList = cities.Where(StartsWithL);

public bool StartsWithL(string name)
{
    return name.StartsWith("L");
}

자주 보시던 스타일의 코드입니다. cities 어레이에 들어 있는 값들 중 L 로 시작하는 값을 얻어오는 코드지요. string 클래스의 확장 메서드인 Where 의 도움을 받아 StartsWithL 메서드가 Where 절의 역할을 하고 있습니다.

익명 Delegate의 사용

별도로 메서드를 만들어서 호출하는 것도 나쁘지 않습니다만 이왕이면 코드를 간결하게 유지하기 위해 익명 Delegate를 많이들 사용하실 겁니다. Named 메서드 사용하던걸 익명 Delegate 로 바꿔보겠습니다.

IEnumerable<string> filteredList = cities.Where(
            delegate(string s)
            {
                return s.StartsWith("L");
            }
일단 메서드가 하나 줄어서 기분이 좋습니다 ^^; 익명 Delegate 를 이용해서 위처럼 간단하게 inline 으로 처리를 할 수 있습니다. 그런데 코드가 지저분한 것이 별로 보기가 좋지 않습니다. 이를 람다 표현식으로 바꾸어 보도록 하겠습니다

Lambda 표현식의 사용

IEnumerable<string> filteredList = cities.Where(s => s.StartsWith("L"));
아주 깔끔하게 한줄러 코드를 줄였습니다. 닷넷이 제공하는 컴파일러는 생각보다 똑똑해서 s 라는 변수가 당연히 cities의 타입을 따라간다는 것을 알고 있습니다. 인텔리센스도 실시간으로 당연히 잘 동작하겠지요.

- NoPD -
728x90

+ Recent posts