NGMsoftware

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

    학습


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

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. Java는 연산자가 참 많은데요. 한번에 모든걸 다루기는 무리입니다. 여러번 나눠서 진행하게 될거 같아요. 하지만, 급하신분은 Google 또는 [ docs.oracle.com ]에서 관련 자료들을 찾아볼 수 있고 당연히 여기보단 [ docs.oracle.com ]이 잘 설명되어 있습니다^^;

     

    연산자 우선 순위와 결합성

    범주

    연산자

    설명

     기본 연산자

     expr++

     expr--

     후위 증가

     후위 감소

     단항 연산자

     ++expr

     --expr

     ~

     !

     전위 증가

     전위 감소

     비트 부정 연산

     논리적 OR

     승제 연산자

     * 

     / 

     %

     곱하기

     나누기

     나머지

     가감 연산자

     + 

     -

     더하기

     빼기

     시프트 연산자

     << 

     >>

     >>>

     왼쪽 시프트

     오른쪽 시프트

     Unsigned 오른쪽 시프트 (C#에는 없는 자바 고유 연산자)

     관계 연산자

     < 

     >

     <= 

     => 

     instanceof

     보다 작음

     보다 큼

     작거나 같음

     크거나 같음

     인스턴스와 같거나 하위 인스턴스일 경우 true를 반환

     같음 연산자

     == 

     !=

     같음

     같지 않음

     논리 AND

     &

     정수 비트 AND, Boolean 논리곱 AND

     논리 XOR

     ^

     정수 비트 XOR, Boolean 논리곱 XOR

     논리 OR

     |

     정수 비트 OR, Boolean 논리곱 OR

     조건부 논리곱 연산자

     &&

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

     조건부 논리합 연산자

     ||

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

     조건 연산자

     C ? X : Y

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

     대입

     =

     +=

     -=

     *=

     /=

     %=

     &=

     ^=

     |=

     <<=

     >>=

     >>>=

     할당

     더하기 후 할당

     빼기 후 할당

     곱하기 후 할당

     나누기 후 할당

     나머지 후 할당

     정수 비트 AND 후 할당

     정수 비트 XOR 후 할당

     정수 비트 OR 후 할당

     왼쪽 시프트 후 할당

     오른쪽 시프트 후 할당

     Unsigned 오른쪽 시프트 후 할당

     

     

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

    public static void main(String[] args)
    {
        System.out.println(1 * 2 + 3 * 4);
        System.out.println(1 * (2 + 3) * 4);
        System.out.println(1 - (2 + 3) / 4);
    }

     

     

    결과는 여러분이 예상하는데로 나올겁니다. 아래처럼요.

    14

    20

    0.25

     

     

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

    14

    20

    0

     

     

    이렇게 나오게 됩니다. 이전 강좌인 자료형에 대한 내용을 기억 하신다면 한번에 맞추지 않았을까 생각되네요. 식에 연산자가 여러 개 있는 경우 연산자의 우선 순위에 따라 각 연산자가 계산됩니다. x + y * z와 같은 식은 결국 x + (y * z)와 같이 계산되는데 이것은 *연산자의 우선 순위가 이진 + 연산자의 우선 순위보다 높기 때문이죠. 다 아시는 내용이라 생각되지만... 만약, 우선 순위가 같은 두 개의 연산자 사이에 피연산자가 있으면 이 두 연산자간의 결합성에 따라 연산의 순서가 결정됩니다.

    bdjvBQL.jpg

     

     

    대입 연산자를 제외하고 모든 이항 연산자는 왼쪽부터 결합됩니다. x + y +z는 (x + y) + z와 같습니다. 반면에 대입 연산자와 조건 연산자(?:)는 오른쪽부터 결합됩니다. x = y = z는 x = (y = z)와 같이 계산됩니다. 여기에서 알 수 있듯이 개발자는 괄호를 이용하여 연산에 의한 제어를 변경할 수 있게됩니다. 이러한 연산의 우선 순위에 따라 전혀 다른 결과가 나오므로 정확하게 알고 사용해야 겠습니다.

     

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

        public static void main(String[] args) {
            String result = (10 % 2) == 0 ? "짝수" : "홀수";
            System.out.println(result);
        }
    

     

     

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

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

    public static void main(String[] args)
    {
        String result = "";
        if (10 % 2 == 0)
        {
            result = "짝수";
        }
        else
        {
            result = "홀수";
        }
    }

     

     

    위의 코드보다 조건 연산자가 더 효율적이며 생산성이 좋다는 것은 아실겁니다. 지금까지 알아본 연산자와는 다르게 조건 연산자는 오른쪽에 결합성이 있습니다. a ? b : c ? d : e식은 (a ? b : c) ? d : e가 아닌 a ? b : (c ? d : e)로 계산됩니다. 아쉽게도 [ C#의 연산자 오버로딩 ]은 자바에서 사용할 수 없습니다.

     

    다음 시간에...

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

    댓글목록

    등록된 댓글이 없습니다.