Lumpy Space Princess - Adventure Time
공부/Java

#03. 항과 연산자

yaebb_82 2022. 1. 24.

반응형

 

 

 

1. 항과 연산자

- 항: 연산에 사용되는 값

- 연산자: 항을 이용하여 연산하는 기호 (*항의 개수에 따른 연산자 구분 : 단항 / 이항 / 삼항 연산자)

 

 

 

2.  연산자

1) 대입 연산자 [=]

: 변수에 값을 대입하는 연산자

: 연산 결과를 L-value에 R-value를 대입

: 우선 순위가 가장 낮은 연산자

 

 

2) 부호 연산자 [+, -]

: 양수와 음수를 나타내는 연산자

 

 

<대입 연산자 & 부호 연산자 예제>

package assignment;

public class OperationEx {

	public static void main(String[] args) {
		//대입 연산자
		int age = 24;
		System.out.println(age);
		
		//부호 연산자
		int num = 10;
		int num2 = -num;
		System.out.println(num);
		System.out.println(num2);
		
		num = -num;
		System.out.println(num);

	}

}

 

 

 

3) 산술 연산자 [+, -, /, %]

: %는 나머지를 구하는 연산자

: 숫자 N의 나머지는 0~N-1 범위의 수 (특정 범위 안의 수를 구할 때 종종 사용)

 

 

4) 증가 감소연산자 [++, --]

: 1만큼 더하거나, 뺄 때 사용하는 연산자 (단항 연산자)

  1) 앞에 있을 때 ▶︎ 해당 statement가 끝나기 전에 수행 (ex. ++a)

  2) 뒤에 있을 때 ▶︎ 해당 statement가 끝난 후에 수행 (ex. a++)

 

 

5) 관계연산자 [<, >, <=, >=, ==, !=]

: 연산 결과가 true / false로 반환되는 연산자 (이항 연산자)

: 같다는 의미로 ==가 사용되고, 같지 않다는 의미로 !=가 사용된다.

 

 

<증가 감소 연산자 & 관계 연산자 예제>

package assignment;

public class OperationEx2 {

	public static void main(String[] args) {
		//증가 감소 연산자
		int num = 10;
		System.out.println(num++);
		System.out.println(num);
		
		int num2 = 10;
		System.out.println(++num2);
		System.out.println(num2);
		
		//관계 연산자
		int first = 5;
		int second = 8;
		boolean flag = (first > second);
		boolean flag2 = (first < second);
		System.out.println(flag);
		System.out.println(flag2);
	
	}

}

  • num에 10이 할당되고, 증가 연산자가 뒤에 위치하기 때문에 10이 먼저 출력된 후에 1이 증가한다.
  • num2에 10이 할당되고, 증가 연산자가 앞에 위치하기 때문에 1이 먼저 증가되고 11이 출력된다.

 

 

5) 논리연산자 [&&, ||, !]

: 연산의 결과는 true/false로 반환되는 연산자

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

: &&(논리 곱: 둘다 모두 참인 경우 참) / ||(논리 합: 둘 중 하나만 참이면 참) / !(부정: 참이면 거짓, 거짓이면 참으로 바꿔줌)

 

*단락 회로 평가 (Short Circuit Evaluation : SCE)

: 논리 곱, 논리 합

: 논리 곱 = 두 항이 모두 true 일 때만 결과가 true

: 논리 합 = 두 항이 모두 false 일 때만 결과가 false

 

 

<논리연산자 예제>

package assignment;

public class OperationEx3 {

	public static void main(String[] args) {
		
		int num1 = 10;
		int i = 2;
		boolean value = ( ((num1 = num1 + 10) < 10)  &&  ((i = i + 2) > 10) );
		System.out.println(value);
		System.out.println(num1);
		System.out.println(i);
		
		int num2 = 10;
		int j = 2;
		boolean value2 = ( ((num2 = num2 + 10) > 10)  &&  ((j = j + 2) > 10) ); 
		System.out.println(value2);
		System.out.println(num2);
		System.out.println(j);
		
		int num3 = 10;
		int k = 2;
		boolean value3 = ( ((num3 = num3 + 10) > 10)  ||  ((k = k + 2) > 10) ); 
		System.out.println(value3);
		System.out.println(num3);
		System.out.println(k);
		
		int num4 = 10;
		int l = 2;
		boolean value4 = ( ((num4 = num4 + 10) > 10)  &&  ((l = l + 2) > 10) ); 
		System.out.println(value4);
		System.out.println(num4);
		System.out.println(l);
		
	}

}

  • 첫번째 (&&) : 앞에가 false이기 때문에 이미 조건을 충족시킬 수 없기 때문에 뒤에 식을 연산하지 않는다.
  • 두번째 (&&) : 앞에가 true여도 뒤에 식도 true여야 충족시킬 수 있기 때문에 뒤에 식을 연산한다.
  • 세번째 (||) : 앞에가 true이기 때문에 이미 조건을 충족하였기에 뒤에 식을 연산하지 않는다.
  • 네번째 (&&) : 앞에가 false여도 뒤에 식이 true면 조건을 충족시킬 수 있기 때문에 뒤에 식을 연산한다.

 

 

6) 복합 대입연산자 [+=. -=, *=, /=, %=, <<=, >>=, >>>=, &=, !=, ^=]

: 자기 자신에게 연산한 값 할당

: 대입 연산자와 다른 연산자를 함께 사용

: 비트 연산자와도 같이 사용할 수 있다.

 

 

7) 조건연산자

: 조건문 ? 결과1 : 결과2 (삼항 연산자)

: 결과가 true/false에 따라 다른 식이나 결과가 수행된다. (조건문이 true = 결과1 수행 / 조건문이 false = 결과2 수행)

: 조건문을 간단히 표현할 때 사용할 수 있다.

 

 

<복합 대입 연산자 & 조건 연산자 예제>

package assignment;

public class OperationEx4 {

	public static void main(String[] args) {
		
		//복합 대입 연산
		int num = 10;
		System.out.println(num+=1);
		
		System.out.println(num%=10);
		
		num-=1;
		System.out.println(num);
		
		//조건 연산자
		int num1 = (5 > 3) ? 10 : 20;
		System.out.println(num1);
		
	}

}

  • num이 10일 때, num+=1은 num=num+1과 같은 의미이기 때문에 결과값이 11이 나온다.
  • num의 값이 11이 되었고, num%=10은 num=num%10과 같은 의미이기 때문에 결과값이 1이 나온다.
  • num의 값이 1이 되었고, num-=1은 num=num-1과 같은 의미이기 때문에 결과 값이 0이 나온다.
  • 조건문이 5>3으로 true이기 때문에 결과 값이 10이 나온다.

 

 

8) 비트연산자 [~, &, |, ^]

: 비트 연산자는 정수에만 사용 가능

: ~  (비트 반전, 1의 보수)

: & (비트 단위 AND) ▶︎ 1 & 1 : 1 반환, 그 외에는 0 반환

: | (비트 단위 OR) ▶︎ 0 | 0 : 0 반환, 그 외에는 1 반환

: ^ (비트 단위 XOR) ▶︎ 두 개의 비트가 서로 다른 경우에 1 반환

 

 

9) 비트연산자 - 시프트 연산자 [<<, >>, >>>]

: 자바에서는 기본적으로 4바이트(32비트)가 주어진다.

: << (왼쪽 shift) ▶︎ a<<2 : a를 2비트 만큼 왼쪽 이동 / 뒤에는 0으로 채워짐

  *한 비트가 옆으로 이동하게 되면 *2 한 것과 같아진다. (*2^n한 값과 같아짐)  ex) 15<<2 면 15x4한 값

: >> (오른쪽 shift) ▶︎ a>>2 : a를 2비트 만큼 오른쪽으로 이동

  * 한 비트가 옆으로 이동하게 되면 /2 한 것과 같아진다 (/2^n한 값과 같아짐)

: >>> (오른쪽 shift) ▶︎ >>와 동일한 연산 / 채워지는 비트가 부호와 상관없이 0으로 채워진다.

 

 

<비트 연산자 & 시프트 연산자 예제>

package assignment;

public class OperationEx5 {

	public static void main(String[] args) {
		
		//비트 연산자
		int num1 = 5;
		int num2 = 10;
		int num3 = 11;
		
		int result = num1 & num2;
		int result2 = num1 & num3;
		int result3 = num1 | num2;
		
		System.out.println(result);
		System.out.println(result2);
		System.out.println(result3);
		
		//비트 연산자 - 시프트 연산자
		int num4 = 5; //00000101
		System.out.println(num4 << 2);
		System.out.println(num4);
		
		System.out.println(num4 <<= 2);
		System.out.println(num4);
		
		int num5 = 5; //0000101
		System.out.println(num5 >> 1);
		
	}

}

  • num1 = 5 = 101 (2) / num2 = 10 = 1010(2) ▶︎ 0101 & 1010 하면, 같은 자리에 1이 있는 경우가 없으므로 결과 값은 0
  • num1 = 5 = 101 (2) / num3 = 11 = 1011(2) ▶︎ 0101 & 1011 하면, 마지막 자리에 1로 같기 때문에 결과 값은 1
  • num1 = 5 = 101 (2) / num2 = 10 = 1010(2) ▶︎ 0101 | 1010 하면, 같은 자리에 0이 있는 경우가 없으므로 결과 값은 15
  • num4 = 5 = 00000101(2)를 <<2 하면, 결과 값은 20 = 00010100(2)
  • 하지만 << 만으로는 num4의 값 자체가 변하지는 않는다 (<<= 필요)
  • num5 = 5 = 00000101(2)fmf >>1 하면, 결과 값은 2 = 00000010(2)

 

 

3. 연산자 우선 순위

일차식 ((), []) ➤ 단항 (++ -- + = ~ !) ➤ 산술(* % /) ➤ 산술(+ -) ➤ 비트이동(<< >>) ➤ 관계(< > <= >=) ➤ 관계(== !=) ➤ 비트 곱(&) ➤ 비트 차(^) ➤ 비트 합(|) ➤ 논리 곱(&&) ➤ 논리 합(||) ➤ 조건(조건?참:거짓) ➤ 대입(= += -= *= /= %=)

 

반응형

'공부 > Java' 카테고리의 다른 글

#06. 클래스 / 객체 / 패키지 / 메서드  (0) 2022.01.27
#05. 반복문  (0) 2022.01.25
#04. 조건문  (0) 2022.01.25
#02. 진수/변수/상수 이해하기  (0) 2022.01.07
#01. Java 시작하기  (0) 2022.01.07

댓글