- [Java] 10. 관계, 논리, 빠른 평가2024년 04월 11일
- Song hyun
- 작성자
- 2024.04.11.:57
728x90반응형[Java] 10. 관계, 논리, 빠른 평가
1. 관계 연산자(=비교 연산자)(Relational Operator)
-이항 연산자이다.
-연산의 결과가 True(참) 혹은 False(거짓)으로 반환된다.(=Boolean 불리언 타입으로 값이 변환된다.)
-조건문, 반복문의 조건식으로 많이 사용된다.(1) 관계 연산자의 종류
->: 왼쪽이 크면 참, 아니면 거짓.
-<: 오른쪽이 크면 참, 아니면 거짓.
->=: 왼쪽이 오른쪽보다 크거나 같으면 참, 아니면 거짓.
-<=: 오른쪽이 왼쪽보다 크거나 같으면 참, 아니면 거짓.
-==: 두 개 항이 같으면 참, 아니면 거짓.
-!= : 두 개 항이 다르면 참, 아니면 거짓.int num1=5; int num2=3; //관계 연산자를 주어로 바라보자. boolean value=num1>num2; //연산 결과가 true 혹은 false로 나오기 때문에 //boolean 타입으로 한다. System.out.println(value); //5>3이므로, true 값이 출력된다.
-암산 시 헷갈리는 경우가 많기 때문에, 관계연산자를 주어로 바라보는 것이 간편하다.
-관계 연산자의 결과값은 참, 거짓 두 가지로만 나오기 때문에 (True/False)
변수를 지정할 땐 Boolean 타입(논리형)으로 설정한다.
2. 논리 연산자
-관계 연산자와 혼합하여 많이 사용된다.
-연산 결과가 참, 거짓으로 반환된다.
(1) 논리 연산자의 종류
&&(논리 곱 / 엠퍼센트 두 개): 두 항이 모두 참인 경우에만 결과 값이 참(True)이다.
||(논리 합 / 버티컬 바 두 개): 두 항 중 한 항만 참이어도 결과 값이 참이다.
!(부정 / 느낌표 한 개): 단항 연산자. 참인 경우는 거짓(False)으로, 거짓인 경우는 참으로 바꾼다.-부호 연산자와 논리 연산자 모두 원본 변수를 변경하는 것이 아니다.
원본 변수를 변경하기 위해서는 대입 연산자를 사용해야 한다.
-로깅: 코드 실행을 통해 연산 결과를 확인하는 것.
*논리 연산자 역시 부호 연산자(+,-)와 마찬가지로, 원본이 되는 변수의 값을 변경하는 것은 아니다.
3. 빠른 평가 (Short circuit Evolution)
-빠른 평가는 논리 연산에서 첫 번째 조건이 결과를 결정하는 경우,
두번째 조건을 평가하지 않는 자바의 특성이다.
아래의 식을 살펴보자.
변수 num은 5, index는 0의 값이 대입되었다.
변수 result에서는 ((num=num+10)<10)과 ((index=index+2)<2) 두 항과 논리곱을 가지고 참, 거짓을 가리고 있다.
int num=5; int index=0; boolean result=((num=num+10)<10)&&((index=index+2)<10); System.out.println("현재 number 변수의 값은 : "+result); System.out.println("현재 index 변수의 값은 : "+index);
논리곱(&&)은 두 항 모두 참(True)일 때만 참이 도출되며,
한 항이라도 거짓(false)일 경우에는 거짓이 도출되는 논리 연산자이다.
즉, 두 항 중에서 한 항만 거짓이어도 결과값이 거짓이라는 뜻이다.
하지만 아래와 같이 연산된 값을 살펴보면, 첫번째 항인 (num=num+10)<10의 값은 False임을 알 수 있다.
변수 num은 위에서 선언된 int num=5;의 값을 그대로 받아와 5의 값을 가진다.
괄호 속 num의 값 (=num+10) 은 15가 되고, 15<10은 거짓이기 때문이다.
주의해야 할 것은, 변수 result 속 논리 연산자가 논리곱(&&)이라는 점이다.
논리곱은 한 항이라도 거짓이라면 false의 값을 가진다.
이미 첫번째 항인 (num=num+10)<10 의 값이 false이므로, 설령 두번째 항의 값이 true라고 하더라도
변수 result의 값은 이미 false로, 변하지 않는다는 것이다.(=안 봐도 비디오네!)
이렇게 첫번째 항의 값이 결과를 결정하는 경우, 두번째 조건을 평가하지 않는 것이 바로 빠른 결정이다.
눈여겨 봐야할 점은, 빠른 결정으로 인해 스킵된 항의 값은 반영이 되지 않는다는 점이다.
아래의 식을 살펴보자. ((index+=2)<10)와 ((num=num+10)<10)을 논리합(||)으로 판별하고 있다.
논리합은 모든 항 중 한 개의 항만 참(True)여도 결과값이 참이 된다.
위에서 살펴본 것과 같이 빠른 결정이 실행되어 첫번째 항만 실행되고, 두번째 항은 스킵되는 것이다.
int num=5; int index=0; result=((index+=2)<10 || ((num=num+10)<10);
위와 같은 과정으로 인해,
첫번째 항은 실행되어 변수 index의 값은 0에서 2로 변하지만,
두번째 항은 실행되지 않기에 변수 num의 값은 실행 전과 같은 5로 남아있게 된다.
package basic.ch03; /** * 빠른 평가란? * 논리 연산에 있어 첫 번째 조건이 결과를 결정할 때, * 두 번째 조건을 평가하지 않는 것을 의미한다. */ public class Operation7 { public static void main(String[] args) { int num=5; //변수의 선언과 동시에 초기화한다. int index=0; //빠른 평가가 동작하는 식을 만들어보자. // 15<10->False 2<10->True boolean result=((num=num+10)<10)&&((index=index+2)<10); System.out.println("현재 number 변수의 값은 : "+result); System.out.println("현재 index 변수의 값은 : "+index); //빠른 평가로 인해 index=index+2가 실행되지 않았으므로, //index의 값은 여전히 0이다. //number 값 재설정 num=5; //논리합을 이용한 빠른 평가 식을 만들어보자. // 15<10 -->False || 2<10 -->True result=((num=num+10)<10) || ((index+=2)<10); // //문제: 현재 num과 index에 담겨 있는 값은 무엇일까? // System.out.println(num); // System.out.println(index); //논리합의 경우, 항 중 하나만 참이어도 True가 출력되기 때문에 //빠른 평가가 실행되지 않아, index의 값이 2로 변경된다. result=((index+=2)<10 || (num=num+10)<10); System.out.println(num); System.out.println(index); //이 경우, (index+=2)<10의 결과가 True이기 때문에 //뒤의 항들이 어떤 값이 오든, 변수 result의 값은 True가 된다. //이 경우, (index+=2)<10의 값 만으로도 True로 결정되어 빠른 결정이 실행된다. //때문에 num=num+10이 실행되지 않아 num의 값은 그대로 15이다. }//end of main }//end of class
728x90반응형'Java > 기본 개념 및 클래스' 카테고리의 다른 글
[Java] 12. 삼항 연산자와 연산자 우선순위 (0) 2024.04.12 [Java] 11. JDK, JRE, JVM (0) 2024.04.11 [Java] 9. 증감 연산자와 복합 대입 연산자 (0) 2024.04.11 [Java] 8. 항과 연산자(대입,부호,산술) (0) 2024.04.10 [Java] 7. 명령 프롬프트에서 자바 파일 컴파일 하기 (0) 2024.04.10 다음글이전글이전 글이 없습니다.댓글