Live-Study

[3주차] 연산자

youn12 2020. 11. 23. 16:40
✏️ Info.

- Java 연산자 공부

📋 List.

1.
산술 연산자
2. 비트 연산자
3. 관계 연산자
4. 논리 연산자
5. instanceof
6. assignment(=) operator
7. 화살표(->) 연산자
8. 3항 연산자
9. 연산자 우선 순위
10. (optional) Java 13. switch 연산자

✔️ Content.

 

 

1. 산술 연산자

연산자 기호
더하기 +
빼기 -
곱하기 *
나누기 /
나머지 %

입력

public class TestClass {

	public static void main(String args[]) {
		int a = 10;
		int b = 5;
		System.out.println("a + b = " + (a + b));	// 더하기
		System.out.println("a - b = " + (a - b));	// 빼기
		System.out.println("a * b = " + (a * b));	// 곱하기
		System.out.println("a / b = " + (a / b));	// 나누기
		System.out.println("a % b = " + (a % b));	// 나머지
		
	}
}


 

출력

a + b = 15
a - b = 5
a * b = 50
a / b = 2
a % b = 0

 

주의사항

  • 나누기의 경우 분모가 0이 될 수 없으므로 0으로 나눌 경우 다음과 같은 에러 메시지를 띄운다.
Exception in thread "main" java.lang.ArithmeticException: / by zero

2. 비트 연산자

 

  • 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다.
종류 연산자 설명
AND & 0 & 0 -> 0
0 & 1 -> 0
1 & 0 -> 0
1 & 1 -> 1
비트가 모두 1이면 1을 반환
OR | 0 | 0 -> 0
0 | 1 -> 1
1 | 0 -> 1
1 | 1 -> 1
비트중 하나라도 1이면 1 반환
XOR ^ 0 ^ 0 -> 0
0 ^ 1 -> 1
1 ^ 0 -> 1
비트가 서로 다르면 1 반환
NOT ~ 0 -> 1
1 -> 0
비트 반전
Left Shift << 아래 참조 지정한 수만큼 비트를 전부 왼쪽으로 이동
(빈 자리는 0으로 채워진다)
Right Shift >> 지정한 수만큼 비트를 전부 오른쪽으로 이동
(빈 자리는 최상위 비트로 채워 진다)
>>> Java 에만 존재하는 연산자로 지정한 수 만큼 비트를 전부 오른쪽으로 이동
(빈 자리는 0으로 채워진다.)
  • Shift 예)
//양수
a		=	8		(0000 0000 0000 0000 0000 0000 0000 1000 )
8 << 5		=	256 		(0000 0000 0000 0000 0000 0001 0000 0000 )
8 >> 5		=	0		(0000 0000 0000 0000 0000 0000 0000 0000 )
8 >>> 5		=	0		(0000 0000 0000 0000 0000 0000 0000 0000 )

//음수
a		=	-8		(1111 1111 1111 1111 1111 1111 1111 1000 )
-8 << 5		=	-256		(1111 1111 1111 1111 1111 1111 0000 0000 )
-8 >> 5 	= 	-1		(1111 1111 1111 1111 1111 1111 1111 1111 )
-8 >>> 5 	=	134217727	(0000 0111 1111 1111 1111 1111 1111 1111 )

3. 관계 연산자

연산자 설명
> a > b a가 b보다 클 경우 true
>= a >= b a가 b보다 크거나 같을 경우 true
< a < b a가 b보다 작을 경우 true
<= a <= b a가 b보다 작거나 같을 경우 true
== a == b a가 b와 같을 경우 true
!= a != b a가 b와 다를 경우 true

4. 논리 연산자

종류 연산자 설명
논리 곱 && a && b a 그리고 b가 참일 경우 true
논리 합 || a || b a 또는 b가 참일 경우 true
부정 ! !a a 가 true일 경우 false, false일 경우 true로 반전

5. instanceof

 

  • 변수가 형변환이 가능한지를 체크하는 연산자 이다.
  • 사용법 - {객체} instanceof {클래스}
  • 결과 - true, false
public class TestClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		A a = new A();
		B b = new B();
		
		System.out.println(a instanceof A); // true
		System.out.println(a instanceof B); // false
		System.out.println(b instanceof A); // true
		System.out.println(b instanceof B); // true
		
	}
	
}

class A{
	
}

class B extends A{
	
}

6. assignment(=) operator

 

  • 대입 연산으로 앞서 배운 연산자를 활용하는 예이다
종류 연산자 설명
대입 = a = b a 에 b를 대입
산술 += a += b a = a + b
a 에 a + b 값을 대입
-= a -= b a = a - b
a에 a  - b값을 대입
*= a *= b a = a * b
a 에 a * b 값을 대입
/= a /= b a = a / b
a 에  a / b 값을 대입
%= a %= b a = a % b
a 에  a % b 값을 대입
비트 &= a &= b a = a & b
a 에 a AND b 값을 대입
|= a |= b a = a | b
a 에 a OR b 값을 대입
^= a ^= b a = a ^ b
a 에 a XOR b 값을 대입
<<= a <<= b a = a << b
a 에 a left shift b 값을 대입
>>= a >>= b a = a >> b
a 에 a right shift b 값을 대입
(빈 값은 최상위 비트에 맞게)
>>>= a >>>= b a = a >>>b
a 에 a right shift b 값을 대입
(빈 값은 0으로)

사용 예)

a = 10, b = 5
10 = 5		 =>	 a = 5
10 += 5		 =>	 a = 15
10 -= 5		 =>	 a = 5
10 *= 5		 =>	 a = 50
10 /= 5		 =>	 a = 2
1010 ^= 101	 =>	 a = 1111
1010 &= 101	 =>	 a = 0
1010 |= 101	 =>	 a = 1111
1010 <<= 5	 =>	 a = 101000000
1010 >>= 5	 =>	 a = 0
1010 >>>= 5	 =>	 a = 0

7. 화살표(->) 연산자

 

  • Java8 버전 부터 지원하게 된 람다식(Lamdaba Expressions)에 사용되는 표현이다.

1). 람다식

  • 익명함수를 생성하기 위한 식으로 함수 지향 언어에 가깝다
  • 형태는 매개변수를 가진 코드 블록이지만, 런타임 시에는 익명 구형 객체(추상메소드를 한개 포함한)를 생성한다.
  • 로컬 익명 구현객체를 생성하지만, 사용 목적은 인터페이스가 가지고 있는 메소드를 간편하게 즉흥으로 구현해서 사용하는 것이 목적이다.
  • 반드시 한개의 추상메소드만을 가지는 인터페이스여야 한다. 이러한 인터페이스를 함수적 인터페이스(@FunctionalInterface)라고 부르며 해당 어노테이션을 명시 할 수 있다.

2). 표현식

(타입 매개변수, ...) -> {실행문;...};
  • 매개변수의 자료형은 생략 가능하다.
  • 매개변수가 한개일 경우 매개변수를 감싸는 소괄호를 생략 가능하다.
  • 실행문이 한개일 경우 실행문들을 감싸는 중괄호를 생략 가능하다.
  • 실행문이 한개이며 실행문이  return 문일 경우 실행문을 감싸는 중괄호와 return을 생략 가능하다.
  • 사용 예)
public class TestClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		calculator cal = (int a, int b) -> { return a + b;};
		
		calculator cal2 = (a, b) -> {return a+b;};
		
		calculator cal3 = (a, b) -> a+b;
		
		System.out.println(cal.plus(5, 10));
		System.out.println(cal2.plus(5, 10));
		System.out.println(cal3.plus(5, 10));
		
	}
	
}

@FunctionalInterface
interface calculator{
	int plus(int a, int b);
}

3). 오류 사항

  • @FunctionalInterface 명시 후 두개의 추상메소드를 선언했을경우 발생 오류


8. 3항 연산자

  •  if/else 의 문을 보다 간결하게 나타낼 수 있는 문법
  • 사용법
    • Condition ? A : B (조건문 ? true 일 때 반환 값 : false 일 때 반환값)

예)

int a = 10;
int b = 5;

int result;

// if/else
if(a > b){
	result = a;
}else{
	result = b;
}


// 3항 연산
result = a > b ? a : b;

9. 연산자 우선 순위

우선순위 연산자 설명 연산 방향
0 (), [] 괄호 ->
1 expr++, expr-- 증감 (후위 증가 및 감소) ->
2 ++expr, --expr, +expr, -expr, ~, ! 증감 (전위 증가 및 감소), 산술(단항) <-
3 *, /, % 산술 (곱하기, 나누기, 나머지) ->
4 +, - 산술 (더하기, 빼기) ->
5 <<, >>, >>> 비트 (Shift) ->
6 <, >, <=, >=, instanceof 관계 (크기, 형변환) ->
7 ==, != 관계 (같은지, 아닌지) ->
8 & 비트 (AND) ->
9 ^ 비트 (XOR) ->
10 | 비트 (OR) ->
11 && 논리 (AND) ->
12 || 논리 (OR) ->
13 ? : 삼항 연산자 <-
14 =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= 대입 연산자 <-

 

  • 연산 순위가 같은 식의 경우 연산 방향에 의해 식이 진행된다. 
int a = 10;
int b = 5;
int c = 3;
int result;

/**
*  연산 순위가 같은 식의 경우 연산 방향에 의해 결정된다
*  1. a + b
*  2. 1. + c
*  3. result = 2.
*/
result = a + b + c;

10. (optional) Java 13. switch 연산자

  • Java 12 에서의 value , break 가 사라지며 yield 문법이 생겨났다
// Java 12
 
    private static int getValueViaBreak(String mode) {
        int result = switch (mode) {
            case "a":
            case "b":
                break 1;
            case "c":
                break 2;
            case "d":
            case "e":
            case "f":
                break 3;
            default:
                break -1;
        };
        return result;
    }
    
// Java 13    
    
    private static int getValueViaYield(String mode) {
        int result = switch (mode) {
            case "a", "b":
                yield 1;
            case "c":
                yield 2;
            case "d", "e", "f":
                yield 3;
            default:
                yield -1;
        };
        return result;
    }

 


❗️ Refer.

비트 연산자
 - www.tcpschool.com/c/c_operator_bitwise

instanceof
 - improver.tistory.com/140

assignment(=) operator
 - tcpschool.com/java/java_operator_assignment

화살표(->) 연산자
 - juyoung-1008.tistory.com/48

연산자 우선 순위
 - www.programiz.com/java-programming/operator-precedence
(optional) Java 13. switch 연산자
 - mkyong.com/java/java-13-switch-expressions/