NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 9. C# 연산자 우선 순위와 조건 연산자 (삼항 연산자)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 요즘 메르스 때문에 전국적으로 난리가 아니네요. 회사에서는 마스크를 일괄 지급하고 있고, 거리도 한산한거 보면 말입니다. 이런 사회 분위기 때문인지 예전에 개봉해서 대 히트(?)했던 감기(The Flu, 2013)가 다시 주목받고 있다고 하는군요. 개인적으로 극중 대통령역을 했던 차인표씨와 같이 국민을 위하는 대통령이 나왔으면 하는 바램입니다.

     

    C#은 연산자가 참 많은데요. 한번에 모든걸 다루기는 무리입니다. 여러번 나눠서 진행하게 될거 같아요. 하지만, 급하신분은 MSDN에서 관련 자료들을 찾아볼 수 있습니다. 여기보단 MSDN이 잘 설명되어 있습니다^^;

     

    연산자 우선 순위와 결합성

     

    범주

    연산자

    설명

     기본 연산자 

     x.y

     f(x)

     a[x]

     x++

     new

     typeof

     checked

     unchecked

     맴버 액세스

     메서드 및 대리자 호출

     배열 및 인덱서 액세스

     후위 증가

     개체를 만들고 생성자를 호출합니다. 그외에 여러가지 용도가 있습니다.

     시스템 타입 개체 가져오기

     컨텍스트에서 식 계산

     컨텍스트에서 식 계산

     단항 연산자

     !

     ~ 

     ++x 

     --x 

     (T)x

     논리적 OR

     비트 부정 연산

     전위 증가

     전위 감소

     x를 T형식으로 명시적 변환

     승제 연산자

     * 

     / 

     %

     곱하기

     나누기

     나머지

     가감 연산자

     + 

     -

     더하기

     빼기

     시프트 연산자

     << 

     >>

      왼쪽 시프트

     오른쪽 시프트

     관계 및 형식 테스트 연산자

     < 

     >

     <= 

     => 

     is 

     as

     보다 작음

     보다 큼

     작거나 같음

     크거나 같음 (익명 함수의 람다식)

     안전한 캐스팅을 위해 데이타 검사 (캐스팅이 가능하면 true)

     안전한 캐스팅을 위해 데이타 검사 (캐스팅이 가능하면 ture, out로 반환)

     같음 연산자

     == 

     !=

     같음

     같지 않음

     논리 AND

     &

     정수 비트 AND, Boolean 논리곱 AND

     논리 XOR

     ^

     정수 비트 XOR, Boolean 논리곱 XOR

     논리 OR

     |

     정수 비트 OR, Boolean 논리곱 OR

     조건부 논리곱 연산자

     &&

     앞의 조건이 참인 경우에만 뒤의 조건을 계산

     조건부 논리합 연산자

     ||

     앞의 조건이 거짓인 경우에만 뒤의 조건을 계산

     조건 연산자

     C ? X : Y

     X ?? Y

     조건(C)이 참이면 X로 계산하고 거짓이면 Y로 계산

     X가 null인 경우 Y로 계산하고 null이 아니면 X로 계산

     대입

     = 

     *= 

     /= 

     %= 

     += 

     -= 

     <<= 

     >>= 

     &= 

     ^= 

     |=

     할당

     곱하기 후 할당

     나누기 후 할당

     나머지 후 할당

     더하기 후 할당

     빼기 후 할당

     왼쪽 시프트 후 할당

     오른쪽 시프트 후 할당

     정수 비트 AND 후 할당

     정수 비트 XOR 후 할당

     정수 비트 OR 후 할당

     

     

    아래와 같이 Main에 코드를 추가한 후 실행해 봅니다.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(1 * 2 + 3 * 4);
                Console.WriteLine(1 * (2 + 3) * 4);
                Console.WriteLine(1 - (2 + 3) / 4);
                Console.ReadLine();
            }
        }
    }

     

     

    결과는 여러분이 예상하는데로 나올겁니다.

    14

    20

    0.25

     

     

    하지만, 위와 같지는 않죠. 부동 소수점은 자동으로 int로 converting되면서 소수점은 버려집니다.

    14

    20

    0

     

     

    이렇게 나오게 됩니다. 이전 강좌인 자료형에 대한 내용을 기억 하신다면 한번에 맞추지 않았을까 생각되네요.

    식에 연산자가 여러 개 있는 경우 연산자의 우선 순위에 따라 각 연산자가 계산됩니다. x + y * z와 같은 식은 결국 x + (y * z)와 같이 계산되는데 이것은 *연산자의 우선 순위가 이진 + 연산자의 우선 순위보다 높기 때문이죠. 다 아시는 내용이라 생각되지만...

     

    만약, 우선 순위가 같은 두 개의 연산자 사이에 피연산자가 있으면 이 두 연산자간의 결합성에 따라 연산의 순서가 결정됩니다.

    대입 연산자를 제외하고 모든 이항 연산자는 왼쪽부터 결합됩니다. x + y +z는 (x + y) + z와 같습니다.

    대입 연산자와 조건 연산자(?:)는 오른쪽부터 결합됩니다. x = y = z는 x = (y = z)와 같이 계산됩니다.

     

    여기에서 알 수 있듯이 개발자는 괄호를 이용하여 연산에 의한 제어를 변경할 수 있게됩니다. 이러한 연산의 우선 순위에 따라 전혀 다른 결과가 나오므로 정확하게 알고 사용해야 겠습니다.

     

    위에 나온 조건 연산자(?:)를 확인하기 위해 Main의 내용을 아래 코드로 대체합니다.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string result = (10 % 2) == 0 ? "짝수" : "홀수";
                Console.WriteLine(result);
                Console.ReadLine();
            }
        }
    }

     

     

    나머지가 없으므로 짝수가 나옵니다. 보통 odd / even을 판단하는 가장 보편적인 방법이며 위의 문법을 삼항 연산자라고 합니다. 

     

    용어에 대해 잠깐 설명하자면, 가장 기초가 되는 단항 연산자가 있습니다. 이는 보통 x++, x--과 같이 사용됩니다. 그리고 일반적으로 많이 쓰이는 이항 연산자가 있습니다. a = x + y와 같이 사용됩니다. 마지막으로 삼항 연산자는 ?: 하나 뿐입니다. 삼항 연산자 또는 조건 연산자는 3개의 피연산자를 취하며 boolean ? true : false와 같은 중위 표기법을 사용합니다.

     

    여기서 boolean은 컨디션으로 값은 항상 true 또는 false가 와야 합니다. 이는 특별히 복잡한 식을 가지지 않는다면 좀 더 간결하게 코드를 작성할 수 있으며 가독성면에서도 좋기에 자주 사용됩니다.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string result = string.Empty;
                if (10 % 2 == 0)
                { result = "짝수"; }
                else
                { result = "홀수"; }
            }
        }
    }

     

     

    위의 코드보다 조건 연산자가 더 효율적이며 생산성이 좋다는 것은 아실겁니다. 하지만, 나중에 하게 될 Linq to SQL이나 WCF의 Data Service에 들어가면 조심해야 하는 부분도 있습니다. 지금 이야기 하기에는 너무 앞서 나가는면이 없지 않아 있지만, Linq to SQL의 경우에는 Linq 식에 조건 연산자를 사용할 수 있는 반면에 Data Service는 조건 연산자를 쓸 수 없고 상수만 사용 가능합니다. 또한, Lamda식에도 제약이 있습니다.

     

    지금까지 알아본 연산자와는 다르게 조건 연산자는 오른쪽에 결합성이 있습니다.

    a ? b : c ? d : e식은 (a ? b : c) ? d : e가 아닌 a ? b : (c ? d : e)로 계산됩니다. 참고로 조건 연산자는 연산자 오버로딩을 할 수 없습니다. 이 부분은 나중에 하게 될 연산자 오버로딩에서 다시 한번 확인하도록 하겠습니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.