[Java] 연산자(Operator)
산술 연산자
연산에 필요한 값이나 변수가 두 개인 이항 연산자
우선 순위에 따라 연산되어 결과가 산출됨
피연산자의 연산 방향은 왼쪽에서 오른쪽
int num1 = 20;
int num2 = 7;
System.out.println("num1 + num2 = " + (num1 + num2));
System.out.println("num1 - num2 = " + (num1 - num2));
System.out.println("num1 * num2 = " + (num1 * num2)); //끝에 ()안 쳐도됨 우선연산이 가능하기 때문
System.out.println("num1 / num2 = " + (num1 / num2)); //끝에 ()안 쳐도됨 우선연산이 가능하기 때문
System.out.println("num1 % num2 = " + (num1 % num2)); //끝에 ()안 쳐도됨 우선연산이 가능하기 때문
대입 연산자와 산술 복합 대입 연산자
int num = 12;
System.out.println(num); //12
//3증가시
num = num + 3; //대입 연산자의 오른쪽에는 값, 왼쪽에는 공간
System.out.println(num); //15
num += 3; // num = num + 3; 과 같은 의미
System.out.println(num); //18
num -= 5;
System.out.println(num); //13
num *= 2;
System.out.println(num); //26
num /= 2;
System.out.println(num); //13
*주의! 산술 복합 대입연산자의 작성 순서에 주의해야 한다.
산술 대입 연산자가 아닌 '-5'를 num에 대입한 것이다.
num =-5;
System.out.println("num : " + num);
증감 연산자
피연산자의 값에 1을 더하거나 빼는 연산자(++, --)로 위치에 따라 결과 값이 다르게 나타남
(결과값 20, 21, 22, 21, 20)
int num = 20;
System.out.println("num : " + num);
num++;
System.out.println("num : " + num);
++num;
System.out.println("num : "+ num);
--num;
System.out.println("num : " + num);
num--;
System.out.println("num : " + num);
피연산자의 값에 1을 더하거나 빼는 연산자(++, --)로 위치에 따라 결과 값이 다르게 나타남
증감연사자만 사용될 때는 1 증가/1감소의 의미를 가진다.
하지만 문제는 다른 연산자와 함께 사용할 때 전위/후위 연산의 구분이 필요하다.
전위연산
먼저 전위연산은 증감을 먼저 처리하고 난 뒤 다른 연산을 시행
실행값 (21, 63)
int secondNum = 20;
int result2 = ++secondNum * 3;
System.out.println("result2 : " + result2);
System.out.println("secondNum : " + secondNum);
후위연산
다른 연산 우선 실행 후 마지막에 처리됨 (다른 연산이라는 것은 대입이나 println을 통한 출력을 의미)
실행값 (60, 21)
int firstNum = 20;
int result1 = firstNum++ * 3;
System.out.println("result1 : " + result1);
System.out.println("firstNum : " + firstNum);
비교 연산자
데이터가 같은지, 다른지, 혹은 대소 비교를 할 때 사용
항상 논리값(true, false)이 결과 값
-숫자값비교
-1. 정수 비교
int inum1 = 10;
int inum2 = 20;
System.out.println("=============정수값비교=============");
System.out.println("inum1과 inum2가 같은지 비교 : " + (inum1 == inum2));
System.out.println("inum1과 inum2가 같지 않은지 비교 : " + (inum1 != inum2));
System.out.println("inum1이 inum2보다 큰지 비교 : " + (inum1 > inum2));
System.out.println("inum1이 inum2보다 크거나 같은지 비교 : " + (inum1 >= inum2));
System.out.println("inum1이 inum2보다 작은지 비교 : " + (inum1 < inum2));
System.out.println("inum1이 inum2보다 작거나 같은지 비교 : " + (inum1 <= inum2));
-2. 실수 비교
double dnum1 = 10.0;
double dnum2 = 20.0;
System.out.println("=============실수값비교=============");
System.out.println("dnum1과 dnum2가 같은지 비교 : " + (dnum1 == dnum2));
System.out.println("dnum1과 dnum2가 같지 않은지 비교 : " + (dnum1 != dnum2));
System.out.println("dnum1이 dnum2보다 큰지 비교 : " + (dnum1 > dnum2));
System.out.println("dnum1이 dnum2보다 크거나 같은지 비교 : " + (dnum1 >= dnum2));
System.out.println("dnum1이 dnum2보다 작은지 비교 : " + (dnum1 < dnum2));
System.out.println("dnum1이 dnum2보다 작거나 같은지 비교 : " + (dnum1 <= dnum2));
-문자값 비교
char ch1 = 'a';
char ch2 = 'A';
System.out.println("=============문자값비교=============");
System.out.println("ch1과 ch2가 같은지 비교 : " + (ch1 == ch2));
System.out.println("ch1과 ch2가 같지 않은지 비교 : " + (ch1 != ch2));
System.out.println("ch1이 ch2보다 큰지 비교 : " + (ch1 > ch2));
System.out.println("ch1이 ch2보다 크거나 같은지 비교 : " + (ch1 >= ch2));
System.out.println("ch1이 ch2보다 작은지 비교 : " + (ch1 < ch2));
System.out.println("ch1이 ch2보다 작거나 같은지 비교 : " + (ch1 <= ch2));
-논리값 비교
==과 !=은 비교 가능하지만 대소비교는 불가능하다.
boolean bool1 = true;
boolean bool2 = false;
System.out.println("=============논리값비교=============");
System.out.println("bool1과 bool2가 같은지 비교 : " + (bool1 == bool2));
System.out.println("bool1과 bool2가 같지 않은지 비교 : " + (bool1 != bool2));
//System.out.println("bool1이 bool2보다 큰지 비교 : " + (bool1 > bool2));
//System.out.println("bool1이 bool2보다 크거나 같은지 비교 : " + (bool1 >= bool2));
//System.out.println("bool1이 bool2보다 작은지 비교 : " + (bool1 < bool2));
//System.out.println("bool1이 bool2보다 작거나 같은지 비교 : " + (bool1 <= bool2));
-문자열값 비교
문자열도 ==과 !=은 비교 가능하지만 대소비교는 불가능하다.
String str1 = "java";
String str2 = "java";
System.out.println("=============문자열값 비교=============");
System.out.println("str1과 str2가 같은지 비교 : " + (str1 == str2));
System.out.println("str1과 str2가 같지 않은지 비교 : " + (str1 != str2));
//System.out.println("str1이 str2보다 큰지 비교 : " + (str1 > str2));
//System.out.println("str1이 str2보다 크거나 같은지 비교 : " + (str1 >= str2));
//System.out.println("str1이 str2보다 작은지 비교 : " + (str1 < str2));
//System.out.println("str1이 str2보다 작거나 같은지 비교 : " + (str1 <= str2));
논리 연산자
논리값(true or false)를 취급하는 연산자이다.
논리연산자 결과 값 확인
System.out.println("true와 true의 논리 and 연산 : " + (true && true));
System.out.println("true와 false의 논리 and 연산 : " + (true && false));
System.out.println("false와 true의 논리 and 연산 : " + (false && true));
System.out.println("false와 false의 논리 and 연산 : " + (false && false));
System.out.println("true와 true의 논리 or 연산 : " + (true || true));
System.out.println("true와 false의 논리 or 연산 : " + (true || false));
System.out.println("false와 true의 논리 or 연산 : " + (false || true));
System.out.println("false와 false의 논리 or 연산 : " + (false || false));
-논리 부정 연산자값의 앞에 !(느낌표) 사용 논리 값을 부정하며 반대 값으로 변경함. 제어문을 활용할 때 많이 쓰임
System.out.println("true의 논리 not 연산 : " + (!true));
System.out.println("false의 논리 not 연산 : " + (!false));
-논리식에 논리연산자 활용
int a = 10;
int b = 20;
int c = 30;
int d = 40;
System.out.println("a가 b보다 작으면서 c가 d보다 작은지 확인 : " + (a < b && c < d));
System.out.println("a가 b보다 작으면서 c가 d보다 큰지 확인 : " + (a < b && c > d));
System.out.println("a가 b보다 크면서 c가 d보다 작은지 확인 : " + (a > b && c < d));
System.out.println("a가 b보다 크면서 c가 d보다 큰지 확인 : " + (a > b && c > d));
System.out.println("a가 b보다 작거나 c가 d보다 작은지 확인 : " + (a < b || c < d));
System.out.println("a가 b보다 작거나 c가 d보다 큰지 확인 : " + (a < b || c > d));
System.out.println("a가 b보다 크거나 c가 d보다 작은지 확인 : " + (a > b || c < d));
System.out.println("a가 b보다 크거나 c가 d보다 큰지 확인 : " + (a > b || c > d));
논리연산자의 우선순위와 활용
&& : 11순위
|| : 12순위
&& 연산자가 || 연산자보다 우선순위가 높다.
-1부터 100사이의 값인지 확인
int num1 = 55;
System.out.println("1부터 100 사이인지 확인 : " + (num1 >= 1 && num1 <= 100));
int num2 = 105;
System.out.println("1부터 100 사이인지 확인 : " + (num2 >= 1 && num2 <= 100));
-영어 대문자인지 확인
char ch1 = 'G';
System.out.println("영어 대문자인지 확인 : " + (ch1 >= 'A' && ch1 <= 'Z'));
char ch2 = 'g';
System.out.println("영어 대문자인지 확인 : " + (ch2 >= 'A' && ch2 <= 'Z'));
-대소문자인지 구분 없이 영문자 y 인지 확인
char ch3 = 'Y';
System.out.println("영문자 y인지 확인 : " + (ch3 == 'y' || ch3 == 'Y'));
char ch4 = 'y';
System.out.println("영문자 y인지 확인 : " + (ch4 == 'y' || ch4 == 'Y'));
-영문자인지 확인
A : 65, Z : 90, a : 97, z : 122 (중간에 91~96은 영문자가 아님.)
연산자 우선순위를 고려했을 때 AND 연산이 먼저 수행되지만
논리적으로 먼저 실행하는 내용을 괄호로 묶어주면 코드 보기 편하다.
마지막 줄은 한글이기 때문에 false가 출력된다.
char ch5 = 'f';
System.out.println("영문자인지 확인 : " + ((ch5 >= 'A' && ch5 <= 'Z') || (ch5 >= 'a' && ch5 <= 'z')));
char ch6 = 'F';
System.out.println("영문자인지 확인 : " + ((ch6 >= 'A' && ch6 <= 'Z') || (ch6 >= 'a' && ch6 <= 'z')));
char ch7 = '가';
System.out.println("영문자인지 확인 : " + ((ch7 >= 'A' && ch7 <= 'Z') || (ch7 >= 'a' && ch7 <= 'z')));
AND연산과 OR연산의 특징
1. 논리식 && 논리식 : 앞의 결과가 false이면 뒤를 실행 안 함.
(결과값 - &&실행 확인 : 10)
int num1 = 10;
int result1 = (false && ++num1 > 0) ? num1 : num1;
System.out.println("&&실행 확인 : " + result1);
2. 논리식 || 논리식 : 앞의 결과가 true이면 뒤를 실행 안 함.
(결과값 - ||실행 확인 : 10)
int num2 = 10;
int result2 = (true || ++num2 > 0) ? num2 : num2;
System.out.println("||실행 확인 : " + result2);
삼항 연산자
피연산자 항목이 3개인 연산자이다.
조건식 ? 참일 때 사용할 값 : 거짓일 때 사용할 값2
조건식은 반드시 결과가 true 또는 false로 나오게끔 작성해야 함
비교/논리 연산자가 주로 사용된다.
(값 - num 1은 양수이다, num2는 양수가 아니다)
int num1 = 10;
int num2 = -10;
String result1 = (num1 > 0) ? "양수이다." : "양수가 아니다.";
String result2 = (num2 > 0) ? "양수이다." : "양수가 아니다.";
System.out.println("num1은 " + result1);
System.out.println("num2은 " + result2);
(값 - num3은 양수이다, num4는 0이다, num5는 음수이다)
int num3 = 5;
int num4 = 0;
int num5 = -5;
String result3 = (num3 > 0) ? "양수이다." : (num3 == 0) ? "0이다." : "음수이다.";
String result4 = (num4 > 0) ? "양수이다." : (num4 == 0) ? "0이다." : "음수이다.";
String result5 = (num5 > 0) ? "양수이다." : (num5 == 0) ? "0이다." : "음수이다.";
System.out.println("num3은 " + result3);
System.out.println("num4는 " + result4);
System.out.println("num5는 " + result5);