Java

2024.04.09 연산자(항, 대입, 부호)

정훈5 2024. 4. 10. 14:14

항(Operands)과 연산자(Operators)

연산 과정에서 사용되는 데이터나 값을 항(Operands)이라고 합니다.

하나 이상의 항을 사용하여 특정 연산을 수행하는 기호를 연산자(Operators) 라고 합니다.

 

대입 연산자 (Assignment Operator) : ‘ = ‘

대입 연산자는 특정 값이나 다른 변수의 결과를 변수에 할당(대입)하는 데 사용됩니다.

대부분의 이항 연산자 중에서 실행 우선순위가 가장 낮아서, 대부분의 연산이 이루어진 후에 마지막으로 값이 할당됩니다. (연산에 순서는 오른쪽에서 왼쪽으로) 기본 형태는 왼쪽 변수 = 오른쪽 표현식(값, 변수, 또는 계산식)입니다.

 

부호 연산자 : ‘ +, - ‘

부호 연산자는 변수의 부호를 변경하거나 유지하는 단항 연산자입니다.

연산자는 변수의 부호를 그대로 두고, - 연산자는 변수의 부호를 반전시킵니다.

변수의 실제 값을 변경하고자 할 때는 부호 연산자와 함께 대입 연산자를 사용해야 합니다.

 

package basic.ch03;

/*
 * 부호 연산자
 * 단항 연산자 --> 변수에 부호를 변경 (리터럴값에 부호를 변경)
 */
public class Operation1 {

	public static void main(String[] args) {
		
		int intData = 1000;
		System.out.println(+intData);
		System.out.println(-intData);
		System.out.println("-----------");
		System.out.println(intData);
		// 반드시 기억 -> (부호 연산자는 변수에 실제 값이 변경되는 것은 아니다)
		
		// 메모리 공간안에 실제 값을 변경 하려면 어떻게 해야하나?
		// 답은 --> 대입 연산자와 함께 사용해야 한다.
		
		intData = -intData;
		System.out.println("실제 변수안에 들어있는 값 : " + intData);
		
		// 연습
		int oneStepDistance = 1;
		final int ZERO_POINT = 0; // 상수를 사용할 때는 대문자를 권장 한다.
		int currentPostion = 0;
		
		// 제로 포인트에서 왼쪽으로 3칸 이동한 값을 출력 하시오.
		// 식을 작성
		currentPostion = ZERO_POINT - (oneStepDistance * 3);
	
		// 결과값 출력
		System.out.println(currentPostion);
		
		// 절대값이란?
		// 절대값이란 어떤 수의 크기를 나타내는 것으로 그 수가 0에서 얼마나 떨어져
		// 있는지를 표시한다.
		// 즉, 어떤 수의 절대값은 그 수가 양수이든 음수이든 상관없이 항상 양수 입니다.
		// 0의 절대값은 0 입니다.
		
		//currentPostion 값이 양수 였다면 부호연산자를 통해 변경하고
		// 절대값이 틀려지게 된다.
		System.out.println(-currentPostion);
		
		// 우리는 절대값을 구하는 알고리즘을 만들어야 한다.
		
		// 자바 개발자들이 이미 만들어 둔 도구(Tool) 이다.
		// 자바 개발자들이 이미 만들어 둔 도구이다. 
		// Math math; // 수학과 관련된 기능들에 모음,
	
		System.out.println("Math 라이브러리 사용 : " + Math.abs(currentPostion));

	} // end of main

} // end of class

 

연산자(산술)

산술 연산자에 대해 살펴 봅시다.

(그림)

 

연산자(증감, 감소)

 

  • 단항 연산자
  • 변수의 값을 오직 1 더하거나 1 뺄때 사용
  • 연산자가 항의 앞에 있는가 뒤에 있는가에 따라 연산 시점과 결과가 달라짐
  • 문장(statement)의 끝(;)을 기준으로 연산 시점을 생각해야 함

(그림)

 

package basic.ch03;

public class Operation3 {

/*
 * 증감, 감소 연산자
 * 변수에 접근해서 그 값을 조직 1증가 또는 1감소 시킨다.
 */
	public static void main(String[] args) {
		
		int value1 = 1;
		// value1++;
		++value1;
		
		System.out.println(value1);
		
		// 변수에 접근해서 1 감소 시키기
		int value2 = 1;
		value2--;
		System.out.println(value2);
		
		// 증감 연산자가 변수 뒤에 올 때 (후의 연산자)
		int intData1 = 10;
		int resultData;
		
		// (오른쪽)에서(왼쪽)으로 간다.
		// 후의 연산자는 ; (세미콜론 기준으로 동작 합니다)
		//   11    =   10  +  1 
		resultData = intData1++;
		System.out.println(resultData); // 결과 10
		System.out.println(intData1);
		// ; 세미콜론 기준으로 끝나고 변수에 접근해서 1을 증가 시켰다.
		// ---> 여러분들은 전위 연산자로 사용하자
		
		// 증감 연산자가 변수 앞에 올 경우(전위 연산자)
		int intData2 = 100;
		int resultData2;
		
		resultData2 = ++intData2;
		System.out.println(resultData2);
		
		// 결론 : 증감 연산자는 변수의 값을 오직 1 증가 시킬때 사용 한다.
		// 항에 앞, 뒤 위치에 따라서 연산에 순서가 다르다.
		
	} // end of main

} // end of class

 

연산자(복합 대입 연산자)

 

  • 대입 연산자와 다른 연산자가 함께 쓰임
 =   + , - , * , % 
 
 +=, -=, *=, %=

 

(그림)

 

복합 대입 연산자는 대입 연산자 앞에 연산자를 작성해주어야 한다.

package basic.ch03;

public class Operation4 {

	/*
	 * 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
	 */

	/*
	 * 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
	 */
	public static void main(String[] args) {

		int score = 5;

		// score += 10;
		// System.out.println("점수 확인 : " + score);
		// 도전 연습 --> int score = score + 10;
		// score 변수에 적븐해 기존에 존재하는 값에 더하기 10을 해주세요
		// 15 = 5 + 10;
		// score = score + 10;
		score += 10;
		System.out.println(score);
		System.out.println("--------------------");
		int n1 = 100;
		// n1 이라는 변수에 접근해서 기존에 있는 값에 추가로 10을 더해주세요

		// n1 = n1 + 10;
		n1 += 10;
		System.out.println("n1 : " + n1);

		// score 변수에 접근해서 10점 감소 시켜주세요
		// score = score - 10;
		score -= 10;

		// ! 점수 두배 증가
		score *= 2;
		System.out.println("score : " + score);

		// ! 점수를 반으로 감소
		score /= 2;
		System.out.println("score : " + score);

	} // end of main

} // end of class

 

package basic.ch03;

public class Operation4_1 {

	/*
	 * 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
	 */
	public static void main(String[] args) {

		int num1 = 0;

		num1 += 2;
		System.out.println(num1); // 2

		int num2 = 0;

		num2 -= 2;
		System.out.println(num2); // -2

		int num3 = 1;
		num3 *= 3;
		System.out.println(num3); // 3

		int num4 = 10;
		num4 /= 2;
		System.out.println(num4); // 5

		int num5 = 5;
		num5 %= 3;
		System.out.println(num5); // 2

	} // end of main

} // end of class

 

연산자(관계,논리,빠른평가,삼항)

관계(비교)연산자

  • 이항 연산자
  • 연산의 결과가 true(참), false(거짓)으로 반환 됨, 비교연산자 라고도 함
  • 조건문, 반복문의 조건식으로 많이 사용 됨

(그림)

 

관계 연산자를 주어로 바라보고 하는 말이 사실인지 거짓인지 확인 하자.

package basic.ch03;

public class Operation5 {

	/*
	 * 관계, 비교 연산자
	 * 연산의 결과 값이 무조건 true, false 반환 된다.
	 */
	
	public static void main(String[] args) {
		
		int num1 = 5;
		int num2 = 3;
		
		// 관계 연산자를 주어로 바라 보자
		// ex) 왼쪽의 항이 오른쪽 항보다 크다 (라고 생각하면 편하다)
		boolean value = ( num1 > num2 ) ;
		System.out.println(value);
		
		System.out.println(3 < 5);
		System.out.println(3 >= 10);
		System.out.println(3 <= 3);
		System.out.println(3 == 5);
		System.out.println(3 != 5);
		System.out.println("-------------------------------");
		
		//		5   <   3
		System.out.println(num1 < num2);	
		//		5	<=	3
		System.out.println(num1 >= num2);
		//		5	<=	3
		System.out.println(num1 <= num2);
		//		5	==	3
		System.out.println(num1 == num2);
		//		5	!=	3
		System.out.println(num1 != num2);

	} // end of main

} // end of class

논리 연산자

 

● 관계 연산자와 혼합하여 많이 사용 됨

● 연산의 결과가 true(참), false(거짓)으로 반환 됨

 

(그림)

 

 

package basic.ch03;

public class Operation6 {

	/*
	 * 논리 연산자
	 * 관계 연산자와 혼합하여 많이 사용 된다.
	 * 연산에 결과는 true, false 으로 반환 된다.
	 */
	
	public static void main(String[] args) {
		
		// 논리 연산자는 3가지 종류가 있다.
		// 논리곱 ---> && (엠퍼센트, 엠퍼센트)
		// 논리합 ---> || (버티컬 바, 버티컬 바)
		// 부정 ---> ! (느낌표)
		
		int num1 = 10;
		int num2 = 20;
		
		// 1. 논리곱(&&)
		//					T		&&		T
		// 논리곱은 전부 true 이면 true 반환 한다. 하나라도 거짓이면 false를 반환 한다.
		boolean flag1 = (num1 > 0) && (num2 > 0);
		System.out.println("flag 1 : "+ flag1);
		
		//					T		&&		F
		boolean flag2 = (num1 > 0) && (num2 < 0);
		System.out.println("flag 2 : "); // 결과값 : F
		
		System.out.println("============================");
		
		// 2. 논리 합
		//					T		||		F
		// 논리 합은 둘 중에 하나라도 true 이면 연산에 결과는 무조건 true 이다.
		boolean flag3 = (num1 > 0) || (num2 < 0);
		System.out.println(flag3);
		
		// 3. 부정
		// flag1 은 true 였다.
		// flag2 은 false 였다.
		// flag3 은 true 였다.
		System.out.println("부정 논리 연산자 사용 : " + !flag3);
		
		// 연산에 결과가 어떻게 되지 ---> 확인해봐야지 ---> 로깅 한다.
		
		System.out.println("flag3 : " + flag3);
		
	} // end of main

} // end of class

 

빠른 평가(short circuit evaluation)

빠른 평가(short-circuit evaluation)는 논리 연산에서 첫 번째 조건이 결과를 결정하는 경우, 두 번째 조건을 평가하지 않는 자바의 특성입니다.

 

  • 논리 곱(&&)은 두 항의 결과가 모두 true일 때만 결과가
    true 앞의 항의 결과가 false이면 뒤 항의 결과를 평가하지 않음
  • 논리 합(||)은 두 항의 결과가 모두 false일 때만 결과가 false
  • 앞의 항의 결과가 true이면 뒤 항의 결과를 평가하지 않음
package basic.ch03;

public class Operation7 {

	/*
	 * 빠른 평가란?
	 * 논리 연산에 있어 첫 번째 조건이 결과를 결정할 때
	 * 두 번째 조건을 평가 하지 않는 것을 의미한다.
	 * 
	 */
	
	public static void main(String[] args) {
		
		int number = 5; // 변수의 선언과 동시에 초기화
		int index = 0;
		
		// 빠른 평가가 동작하는 식을 만들어 보자.
		//									F
		//						15					<	10
		boolean result = ( (number = number + 10) < 10) && ( (index = index + 2) < 10 );
		System.out.println("현재 number 변수에 값은 : " +number);
		// index의 값이 0 인 이유 앞에 있는 값을 판단하고 False가 나왔기 때문에
		// 굳이 뒤에있는 값 까지 계산하지 않아도 값이 나오기에 Cpu가 계산하지 않음
		System.out.println("현재 index 변수에 값은 : " +index);
		
		System.out.println("========================");
		
		// number 값 재 설정
		number = 5;
		// 논리합을 이용한 빠른 평가 식을 만들어 보자.
		
		//							15	<	10 ||			2	<	10
		//								F		||			T
		result = ((number = number + 10) < 10 || (index = index +2) < 10);
		
		//문제
		System.out.println("number : " + number);
		System.out.println("index : " + index);
		
		// 도전 문제 number 와 index 반대로 변경 해서 출력해 보자
	
		
		
		boolean result2 = (( (index = index + 2) < 10 ) && (number = number + 10) < 10);
		System.out.println(" 도전문제 현재 index 변수에 값은 : " +index);
	
		
		result = ( ( (index = index +2) < 10) || (number = number + 10) < 10);
		System.out.println(" 도전문제 현재 index 변수에 값은 : " +index);
		
	} // end of main

} // end of class