TIL/Java

[Java] 연산자(Operator)

yndev 2021. 12. 20. 18:56

산술 연산자

연산에 필요한 값이나 변수가 두 개인 이항 연산자

우선 순위에 따라 연산되어 결과가 산출됨

피연산자의 연산 방향은 왼쪽에서 오른쪽

		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);