ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-16] 논리 연산자
    Java 2020. 11. 27. 14:21

    Boolean or Logical Operators

     

    1. 논리 연산자(Boolean or Logical Operators)

     

    우리가 지금까지 봐 왔듯이 , 비교 연산자는 두 수를 비교를 해서, 그 결과 값을 boolean(TRUE, FALSE) 를 반환하고, 우리는 아마, if문이나 for문을 통한 루프, 연속된 조건이 체이닝 걸렸을 때(Branching and Looping statements) 많이 사용했을 것이다. 한가지의 상황에서만 대처하는게 아니라 보통 2가지 이상(여러개의) 상황을 비교해야 하기 때문에 우리는 Boolean 연산자 *논리연산자 를 사용해서 Multiple한 비교를 진행할 수 있다. 논리 연산자는 피연산자에게 Boolean *참/거짓 값을 받아야 한다. 그리고 값을 통해 연산을 하여 boolean 값을 또 리턴하게 된다. 연산자중에는

     

     

    조건부 And (&&) Contional And

    • ‘&&’ 연산자는 피 연산자의 boolean 값을 가지고 다시한번 Boolean AND 연산을 한다. 만약 두개의 피연산자가 모두 참이면, TRUE를 반환을 하고, 둘중 하나가 false 이면 FALSE 를 반환한다.

    • && 연산자(정확히 ‘!’ 를 제외한  다른 논리연산자) 는 관계 연산자보다 우선순위가 낮다. 그러므로 실제로 먼저 수행이 되는건 관계 연산자 - > 논리 연산자 이긴 하다. 그러므로 위의 조건문은 정확하게 맞는 표현이긴 하다. 하지만 몇 개발자 분들은 좀 더 조건문을 명확하게 인지하고 싶기 때문에 parentheses(괄호) 를 붙히고는 한다.

    • 마지막으로 && 연산자는 조건부 AND 연산자라고 한다. 조건부 라고 불리는 이유는, 두번째 피연산자의 결과 값에 따라, 평가하기 때문인데, 예를 하나 들어보자 만약 첫번째 피연산자가 False 를 반환한다고 가정해보자, 그러면 연산은 두번째 조건부에 상관도 없이 무조건 False를 반환한다 이는, 성능면에서 이점을 얻을 수 있다. 왜냐면 (A<B)&&(C>D) 라는 식이 있다고 가정하자 JVM에서 인터프리터는 A<B가 False를 리턴하면 C>D 를 연산할 필요도 없기 때문에, 그냥 넘어가게 되고, 한줄 한줄 읽어야 하는 인터프리터 입장에서는 부담을 덜 수 있는 것이다. 밑의 식을 보면 3>5 는 무조건 False이기 때문에 뒤에 5<3을 진행하지 않는다.

     

    • 하지만 이런 실행방식은 문제점이 될 수 있다. 예를들어보자, 위에서 5<3 을 연산한다는걸 보장하지 않는다는게 가장 큰 문제이다. 예를 들어보자

      다은과 같은 조건문이 있다고 가정해보자 int[] data는 현재 값이 무조건 Null인 상황이고 조건문에서 두번째 연산인 ‘i<data.length’ 를 사용하게 되면 NullPointerException이 발생하게 된다. 하지만 앞에서 data!=null 연산의 false 값이 나오기 때문에 뒤에 연산을 실행하지 않고 NPE 도 발생하지 않는다. 그럼 나중에 오류가 터졌을 때 어디서 문제가 발생하는지 알 수 없다.

      왜냐면 다음과 같이 data!=null 만 계산하고 값은 무조건 False 니깐 말이다. 우리는 조건부AND 연산을 사용하면서 이점을 중요하게 생각해야 한다. 


    조건부 OR ( || )Contional Or

     

    • 조건부 OR 연산자는 Boolean 타입의 피 연산자 2개를 OR 연산을 한다고 생각하면 된다. AND 연산과 다르게 한쪽이라도 True 면 true를 반환하게 되고, 두 피연산자 모두 False 일 경우에만 false 반환하는 연산자 이다. 여기도 ‘조건부’라는 이름이 붙어있다. &&연산자와 비슷하게 || 연산자 또한, 두번째 피연산자를 무조건 적으로 실행하지 않는다.

      똑같이 첫번째 피연산자인 data ==  null 를 연산하고  true 이면, i < data.length 를 무시하고 바로 true를 반환하게 된다. 이 &&연산자와 같이 조심하여 써야 한다. 

    Boolean Not( ! )

     

    Boolean Not (!)

    • !는 단항 연산자 이며, 원래 가지고 있던 값의 반대를 반환하게 됩니다. 만약에 true value가 들어가 있는 변수, 또는 상태가 있다고 가정해보자 그러면 ! 연산을 실행하게 되면, false 를 반환하게 된다.

    보통 우리가 이런 단항 연산자를 사용할 때, 이런식으로 사용하게 되는데, 잘 생각해보자, 왜냐면 이런 단항 연산자는 연산자 우선순위가 가장 높기 때문에 괄호를 잘 사용해서 우리가 적절히 연산식을 세워야 한다. 

     

    Boolean And( & )

    • 이전에 && 라는 조건부 AND 연산자를 우리가 공부해 왔다.&& 연산자의 가장큰 특징은 무엇이었을까? , 단연코 ‘조건부’ 라는 이름 하에, 첫번째 피연산자가 false 면 두번째 피연산자의 연산은 진행하지 않는다는게 특징이지 않았나? Boolean AND 는 다르다. 정직하게 두개의 피연산 모두 진행한다. 많은 자바 개발자들이 이런 & 연산자는 비트연산 과 같은 Low - level 연산만 생각하고 Boolean &는 잘못된 방법으로 알고 있는 분들이 많다.

      이 연산은 &&과 다르게 NPE 를 발생시킨다. 

    Boolean OR( | )

    • Boolean OR 연산은 조건부 conditional OR 연산과 같은 연산을 실행한다. 한쪽이 True 면 True를 반환하는 연산이지만, & 연산과 같이 피연산자 모두 연산을 진행하고 마지막으로 | 연산을 진행한다는 특징이 있다. 사실 & , | 를 비트연산자가 아닌 Boolean 연산으로 사용하는건 굉장히 드문일이긴 하다. 

     

    Boolean XOR( ^ )

    • 우리가 Boolean 연산자를 사용을할 때, 연산자는 한쪽이 서로 틀리면 True를 반환하게 된다. != 연산자와 비슷하다고 생각하면 된다. 

    • ex ) (True ^ False) -> True, (True ^ True) -> False , (False ^ False) -> True 이런식으로 생각 하면 된다. 

     

     

    댓글

Designed by Tistory.