c# 연산자 질문 드립니다..

조회수 637회

안녕하세요. 현재 vs2013 이용자 입니다..

오픈 소스 분석 중에

public int NumColumns => Bounds?.NumColumns ?? 0;

형태로 선언하는 부분을 발견하였는데, 아무래도 vs2015이상 부터 지원하는 부분 같아서 헷갈리네요 ㅠㅠ

개별적으로 어떤 것을 의미하는지는 알고 있는데 어떤 연산자부터 적용이 되어야 하고 형태를 갖추는지 잘 모르겠습니다..

vs2013(.net 6.0)에서는 어떻게 사용할 수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 과거로 돌아갑시다.

    문법 역행

    1. =>

    => 를 빼봅시다.

    public int NumColumns => Bounds?.NumColumns ?? 0;
    

    public int NumColumns {
       get { return Bounds?.NumColumns ?? 0; }
    }
    

    =>는 익명함수(람다라고 합니다) 에도 쓰이지만, 프로퍼티가 getter만 있을 때도 줄여서 저렇게 쓸 수 있습니다.

    2. ?.

    다음에는 ?. 을 빼볼까요. ?. 연산자는 null 이 아닐 때에만 멤버에 접근하고, null이면 null을 반환합니다.

    2, 3 두 항목 참고링크

    public int NumColumns {
       get { 
          var result; // 이러면 안 됩니다. 편의상 var를 썼어요
          if (Bounds == null) {
              result = null;
          }
          else {
              result = Bounds.NumColumns ?? 0;
          }
          return result;
       }
    }
    

    3. ??

    null coercion 이라고 합니다. 왼쪽이 null이면 오른쪽 값을 씁니다. 빼봅시다.

    public int NumColumns {
       get { 
          var result; // 이러면 안 됩니다. 편의상 var를 썼어요
          if (Bounds == null) {
              result = null;
          }
          else {
              if (Bounds.NumColumns != null) {
                  result = Bounds.NumColumns;
              }
              else {
                  result = 0;
              }
          }
          return result;
       }
    }
    

    닷넷 버전, C# 버전

    C# 버전과 닷넷 버전은 별개입니다.

    닷넷 버전이 높으면 더 많은 닷넷 API를 쓸 수 있고, C# 버전이 높으면 더 많은 문법적 기능을 쓸 수 있습니다.

    Visual Studio 2015를 쓰면서 닷넷 2.0 을 대상으로 프로젝트를 만들수도 있다는 얘기입니다. 이 경우 상위 버전 C#의 문법 중 닷넷 상위 버전을 요구하지 않는 이런 기능들을 사용할 수 있습니다. 아마 VS 2015 가 C# 6 이던가요? 헷갈리네요

    닷넷 프레임워크 6.0 이 아직 안 나왔으니 적어주신 버전은 C# 버전인 것 같네요.

    즉, VS 2013에서는 C# 6.0 문법을 못 쓰지만 프로젝트 수정 없이 VS 2015에서 개발하면 이러한 문법들을 쓰실 수 있습니다.

    • 감사합니다!! 알 수 없는 사용자 2019.4.17 10:40
    • 살짝 궁금한 것이 있습니다 ㅠㅠ. Bounds 가 int 형이 아니라면 null 값과 비교할 수 없을 것 같은데. 이 경우에는 어떻게 해야 할까요? 알 수 없는 사용자 2019.4.17 11:20
    • Bounds 가 int 형이라면 null과 비교할 수 없습니다. 그런 경우에는 Nullable 타입으로 선언하시면 null과 비교할 수 있습니다. "int? Bounds;" 여기에서 ?는 질문하셨던 문법들과 비슷한 종류의 문법인데 C# 버전은 모르겠습니다. Ch. 2019.4.18 10:37
  • 공식 사이트 레퍼런스를 참고하시면 바로 나와요.

    =>는 아시다시피 람다 표현식이며, ?? 는 Null 병합연산자라고 불립니다. Bounds.NumColumns가 Null이 아니라면 NumColums는Bounds.NumColumns이고, Null이라면 0이라는 뜻입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)