본문 바로가기
IT 이야기/Java

[Java Study] 3일차 연산자

by Dblog 2020. 11. 26.
728x90

학습내용

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

자바 스터디 시작 3일차 입니다. 

 

이번 스터디 내용은 연산자입니다. 연산자를 공부하기 전에 연산, 연산자, 피연산자에 대해 간단히 적어보겠습니다. 

  • 연산은 컴퓨터가 어떠한 값, 데이터를 처리해서 결과를 내는 행위를 뜻합니다. 
  • 연산자는 피연산자를 계산하는 기호, 혹은 문자를 뜻하며 +, -, *, / 등 기본 연산자와 사용자가 정의한 연산자가 있습니다.
  • 피연산자는 연산하는 대상을 뜻합니다.

 

산술 연산자

기본적인 산술 연산
산술 연산자는 일반 수학에서 볼 수 있는 +, - 을 포함한 연산자를 뜻합니다. 

연산자 동작 예제
+   덧셈 4 + 2 = 6
-   뺄셈 2 - 4 = -2
*   곱셈 2 * 4 = 8
/   나눗셈 2 / 4 = 2
%   나머지 2 % 4 = 0

 

증가/감소 연산자

변수의 값을 하나씩만 증가 시키며, 앞에 선언하는 전위, 뒤에 선언하는 후위로 선언할 수 있다.

연산자 동작 예제
++   전위/후위 증가 ++val, val++
--   전위/후위 감소 --val, val--

증가/감소 연산자의 경우 전위/후위 선언 방식에 따라 작게는 print값의 오류, 크게는 프로그램의 버그를 발생 시킬 수 있어 조심스럽게 사용해야 합니다.

int val = 10;
System.out.println(val++); 
System.out.println(++val);

 

위 예제의 경우 간단히 보면 두 경우 모두 11을 출력할 것 같지만 전위/후의 선언 방식의 차이로

10
12

를 출력합니다. 

이는 전위/후위 방식의 매커니즘을 통해 확인 할 수 있습니다.

  • 전위
    값 1을 증가, 증가 시킨후 값을 반환
  • 후위
    값 1을 증가, 값을 먼저 반환한 후 증가

위의 설명을 봤을때 int val의 값은 아래와 같이 사용 됩니다. 

int val = 10; 최초 선언                                         val = 10
val++    10을 먼저 print 한뒤 val 값 1 증가               val =11
++val    11에 1을 증가 한뒤 12 print                       val = 12

 

대입 연산자

대입 연산자는 다른 연산자를 대입해서 함께 쓰는 연산자이며 간단하게는 +, - 와 같은 기본 연산자를 대입할 수 있지만 추가로 << (shift연산자) 또한 자바에서는 지원 하고 있으며 a <<= b 처럼 사용 할 수 있다.

연산자 동작 예제 의미
+=   덧셈 대입 a += b a = a + b
-=   뺄셈 대입 a -= b a = a - b
*=   곱셈 대입 a *= b a = a * b
/=   나눗셈 대입 a /= b a = a / b
%=   나머지 대입 a %= b a = a % b

 

 

비트 연산자

비트 연산자는 일반 비트 연산자와, 시프트 연산자가 있습니다. 비트 연산자는 비트 단위로 연산을 하게 되며 AND, OR, NOR,.. 의 논리 게이트 연산을 할 수 있습니다.

  • 일반 비트 연산자
연산자 동작 예제  
&   AND Val1 & Val2 비트 논리곱
|   OR Val1 | Val2 비트 논리합
^   XOR Val1 ^ Val2 비트 배타적 논리합
~   NOT Val1 & Val2 비트 부정

일반 비트 연산자는 값을 2진 비트로 연산 할 수 있습니다. 과거 중학교때 배운 2진법을 다시 기억할 수 있는 계기가 되겠습니다.

ex) 

int a = 3;
int b = 4;

일때 AND 와 OR 의 예를 들어 보겠습니다.

3 & 4 = 0
3 | 4 = 7

3 과 4를 비트로 변환 했을때 각 11, 100 이 됩니다.

계산 하면 OR은 111(2)로 7   AND는 000(2) 로 0의 결과를 보입니다.

 

  • 시프트 연산자
연산자 동작 예제 의미
>>   NOT Val >> 2 Val을 2 만큼 오른쪽으로 쉬프트
<<   NOT Val << 2 Val을 2 만큼 왼쪽으로 쉬프트
>>>   NOT
Val >>> 2 Val을 2 만큼 오른쪽으로 쉬프트 하며 왼쪽은 항상 0이 채워짐 (부호 무관)
위 에서 확인 했던 int b = 4;  1000 >> 2 를 하면  1000 >> 2 = 10(2)인 2가 되며 
4 << 2 의 경우 또한 1000 << 2 = 100000(2) 인 16 이 됩니다.
이 때 4 >>> 2 를 하게 되면 0010이 됩니다 (왼쪽에 0을 채움)

 

관계 연산자

관계 연산자는 간단하게는 참과 거짓을 판별하는 연산자 입니다. 참과 거짓의 형태를 가지고 있기 때문에 if 문과 같은 제어문이나 for문의 반복문에 자주 사용됩니다.

연산자 동작 예제 의미
> a > b a가 b보다 크다 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
instanceof 인스턴스가 같다 a instanceof b a 인스턴스와 b 인스턴스가 같은 인스턴스 일때 true

 

논리 연산자

논리 연산자 또한 참과 거짓을 결과로 출력하기 때문에 if문과 for문에 자주 사용됩니다. 
이때 &&, || 과 같은 단축 논리 연산자가 있는데 이는 왼쪽부터 연산자가 진행되는데 미리 결과가 나오면 오른쪽 부분은 판별하지 않고 바로 결과를 도출 합니다.
ex) True ||  False || True 의 경우 첫번째 항목에서 True를 리턴하기 때문에 오른쪽 || 은 계산하지 않습니다.

연산자 동작 예제 의미
& AND  a & b  a 와 b 둘다 True 일때 True
&& 단축 AND  a && b  a 와 b 둘다 True 일때 True 
| OR  a | b  a 와 b 둘다 False 일때 False
|| 단축 OR  a || b  a 와 b 둘다 False 일때 False 
^ XOR  a ^ b  a 와 b 중 하나 이상이 True 일때 False
! NOT  !a  a 가 True 일때 False, a 가 False 일때 True 

 

논리 연산자는 대입 연산자 또한 사용할 수 있습니다. 그 중 하나는 이전에도 만났습니다. !=의 경우 입니다. !이라는 not 논리 연산자와 = 의 대입 연산자가 만나서 논리 대입 연산자로 사용합니다. 

연산자 동작 예제 의미
&=  AND 대입  A &= B A = A & B
|=  OR 대입  A |= B A = A | B
^=  XOR 대입  A ^= B A = A ^ B

 

 

instanceof

instanceof는 객체타입을 확인하는데 사용하게 됩니다. 결과는 True, False 값을 내는 연산자 이며 부모 클래스를 인식하기 때문에 자식 클래스는 부모 클래스와 같은 취급을 받게 됩니다.

Class A
Class B extends A



public static void main(String[] args){
	A a = new A();
    B b = new B();
    
    (a instanceof A)
    (a instanceof B)
    (b instanceof A)
    (b instanceof B)
    
}

일때 위의 경우 부터

true
false
true
true

를 리턴하게 되는데 a instanceof B 가 false인 이유는 자식 클래스를 부모 클래스에 비교 했기 때문에 상속 관계가 반대가 됩니다.

 

assignment(=) operator

할당연산자 = 는 이미 알고 계신분이 많겠지만 위에 계속 설명했던 대입연산자 입니다. 

+=, -= 를 시작으로   !=, >>= 까지 다양한 할당연산자에 사용할 수 있습니다.

 

화살표(->) 연산자

-> 는 화살표, 람다식으로 표현되는 연산자 입니다. 
람다식 이란 익명함수를 의미하는 용어 입니다. 간단하게 말하면 함수를 단순하게 표현하기 위해 사용하는 기호 입니다.

Java8에서 추가 되었으며 객체지향 보다 함수지향에 가깝다고 볼 수 있습니다. 

int x = 3;
int y = 4;

int a = (x, y) -> (x >= y) ? x:y;
int b = (int x, int y) -> x + y;

위 예시의 경우 아래와 같은 결과를 나타냅니다.

a = 4;
b = 7;

 

 

3항 연산자

연산자의 목록을 보다보면  : ? 를 만나게 됩니다. 3항 연산자는 평소에는 자주 사용하지 않지만 if 문이 많아질때 유용하게 사용할 수 있습니다. 

int a = 2;
int b = 3;
int c = (a > b) ? a : b;

위의 예시를 보면 a 와 b 의 대소 비교를 먼저 하게 됩니다. 이 때 ()안의 내용이 True이면 : 앞의 내용을 False면 : 뒤의 내용을 선택하게 됩니다. 
예제의 경우 a보다 b가 크기 때문에 c 에는 3이 저장됩니다.

int c = 3;

 

연산자 우선 순위

연산자는 우선순위가 존재합니다. 사칙 연산에서 먼저 계산하는 순서가 있듯 연산자에도 우선 순위가 있습니다. 

연산자 예제
1 ()  []
2 ++  --  ~  !
3 *  /  %
4 +  -
5 >>  >>>  <<
6 >  >=  <  <=
7 ==  !=
8 &
9 ^
10 |
11 &&
12 ||
13 ? :
14 = op=

 

 

(optional) Java 13. switch 연산자

java에도 c와 c++에서 볼 수 있는 switch 문법이 있습니다. 일반적으로는 C/C++ 과 비슷하게 선언합니다.

static String getInt(int num){
	String text;
  	swith (num) {
      case 1, 2:
          text = "case a";
          break;
      case 3, 4:
          text = "case b";
          break;
	}        
	return text;
}

이는 java 12에서 조금 업그레이드 되었습니다. 위에서 봤던 람다식이 사용이 가능하게 되었습니다. 

swith (num) {
	case 1, 2 -> "case a";
	case 3, 4 -> "case b";
}        

그러나 이 또한 Java12 GA배포 이후 사용자의 피드백을 받아 기존에 break를 사용하던 문법을 yield로 수정하였습니다.
yield는 쓰레드와 관련된 문법으로 yield가 사용되면 다른 쓰레드에게 실행을 양보하게 됩니다.

이 yield문법은 멀티 쓰레드가 사용되는 반복문에서 가장큰 효율을 발휘할 수 있게됩니다.

static String getInt(int num){
	String text;
  	swith (num) {
      case 1, 2:
          text = "case a";
          yield;
      case 3, 4:
          text = "case b";
          yield;
	}        
	return text;
}

 

728x90

댓글