Chapter 5. 연산자

SeungHyun Son·2021년 6월 20일
0

본 내용은 KH정보교육원 에서 제공한 교재 내용을 개인적인 공부를 위한 목적으로 작성되었습니다.
만약 아래의 내용을 무료로 배부하거나 상업적으로 이용할 경우 법적 처벌을 받을 수 있음을 경고합니다.

연산자 (Operator)란?

값 계산에 사용되는 계산용 기호 문자

  • 피연산자(Operand) : 연산의 대상이 되는 데이터(값)


연산자의 종류

  • 연산자를 분류하는 방법에는 기능에 따른 분류, 피연산자 개수에 따른 분류가 있다.

기능에 따른 분류

피연산자 개수에 따른 분류

연산에 필요한 피연산자의 개수에 따라 분류하는 방법이다.
'_' 연산자는 연산에서 두 가지 역할을 한다. 피연산자가 음수임을 나타내는 단항 연산자와 두 피연산자의 뺄셈 연산으로 사용하는 이항연산자가 있다.
연산에 필요한 항의 개수별로 연산자를 나누면 단항연산자, 이항연산자, 삼항연산자로 나눌 수 있다.

연산자 우선순위

연산자 결합규칙

컴퓨터 연산은 한 번에 한 개만 수행할 수 있고 연산자는 연산을 수행하고 나면 항상 결과값을 반환한다. '3 + 5 + 7' 같은 연산식은 먼저 '3 + 5' 연산이 수행되고 '8'을 반환하고 '8 + 7'이 연산되어 최종 결과인 '15'를 반환한다. '3 + 5 + 7' 같은 연산의 경우 왼쪽에서부터 오른쪽으로 연간이 진행되지만 연산자들은 우선순위에 따라 한 연산식 내에서 연산 순서가 바뀔 수 있다.

연산자 우선순위

단항 연산자

부호(Sign) 연산자 +, -

부호 연산자 '+'는 (값 1)의 의미를 가지는 연산자로 피연산자의 부호를 그대로 유지한다. 반대로 '-' 부호연산자는 (값 -1)의 의미를 가지는 연산자로 피연산자의 부호를 반대로 바꾸는 연산자이다.

TestSign.java

01 public class TestSing {
02     public static void main(String[] arge) {
03         int value = -57;
04        
05         int result1 = +value;
06         int result2 = -value;
07         
08         System.out.println("value : " + value);
09         System.out.println("result1 = " + result1);
10         System.out.println("result2 = " + result2);
11     }
12 }
------
value: -57
result1 : -57
result2 : 57

증감 연산자 ++, --

피연산자에 저장된 값을 1 증가 또는 1 감소시킨다.

연산자처리 효과
++1 증감연산자
--1 감소연산자

증감 연산자는 피연산자의 왼쪽 또는 오른쪽 양쪽에 다 위치할 수 있다. 이 때 연산자가 '++num'과 같이 왼쪽에 있으면 전위 증감 연산자라 하고, 'num++' 과 같이 오른쪽에 있으면 후위 증감 연산자라고 한다.
피연산자와 단독으로 증감연산자가 사용될 때에는 전위든 후위든 같은 결과를 가지지만, 다른 연산과 결합해서 일부로 사용될 때에는 전위와 후위의 결과가 달라진다. 전위로 사용된 증감연산자는 변수의 값을 먼저 증감시킨 후 결과를 가지고 연산하고 후위로 사용된 증감연산자는 변수의 값을 연산에 사용한 후에 변수의 값을 증감시킨다.

TestIncDec.java

01 public class TestIncDec {
02     public static void main(String[] arge) {
03         int x = 12;
04         int y = 12;
05
06         int result1 = ++x + 10;
07         int result2 = y++ + 10;
08
09         System.out.println("x : " + x + ", result1 = " + result1);
10         System.out.println("y : + " y + ", result2 = " + result2);
11         System.out.println("y : " + y);
12     }
13 }
------
x : 13, result1 = 23
y : 12, result2 = 22
y : 13

논리 부정 연산자

논리값 true / false 를 반대로 바꾼다. 피연사자가 true이면 false를, false이면 true를 반환한다.

비트 반전 연산자 ~ (Tield)

정수에만 사용되며 피연산자의 이진수 비트값 0은 1로, 1은 0으로 바꾸는 연산자
부호 있는 정수 타입을 연산할 경우 부호가 반대로 변경되며, 연산 결과로 해당 정수의 1의 보수를 얻을 수 있다.

TestTield.java

01 public class TestTield {
02     public static void main(String[] args) {
03         int data = 10;
04
05     System.out.println("data : " + data);
06     System.out.println("10의 1의 보수 : " + ~data);
07         System.out.println("10의 0의 보수 : " + (~data + 1));
08     }
09 }
------
data : 10
101의 보수 : -11
100의 보수 : -10

이항 연산자

  • 반드시 두 개의 피연산자가 연산자 앞과 뒤에 있어야 한다.

산술 연산자 +, -, *, /, %

더하기(+), 빼기(-), 곱하기(*), 나누기한 몫(/), 나누기한 나머지(% : mod)를 연산할 때 사용한다.

TestArithmetic.java

01 public class TestArithmetic {
02     public static void main(String[] args) {
03         int x = 10;
04         int y = 7;
05         
06         System.out.println(x + " + " + y + " = " + (x + y));
07         System.out.println(x + " - " + y + " = " + (x - y));
08         System.out.println(x + " * " + y + " = " + (x * y));
09         System.out.println(x + " / " + y + " = " + (x / y));
10         System.out.println(x + " % " + y + " = " + (x % y));
11     }
12 }
------
  

나누기 연산에서 두 피연산자가 모두 int 타입일 경우, 연산 결과의 데이터 타입은 int 형이다. 이 결과에서 소수점 이하 데이터는 버려지게 되고 결과로 나온 정수값은 나눗셈의 몫이 된다. 소수점 이하의 결과를 포함하는 나눗셈 결과를 얻고자 할 때에는 두 개의 피연산자 중 한 개라도 소수점을 포함할 수 있는 데이터 타입(double 또는 float)으로 형변환 해야 한다. 또한 피연산자가 정수형일 경우 나누는 수로 0을 사용할 수 없다.

관계 연산자 <, >, <=, >=, ==, !=

피연산자들의 대 / 소 / 등 / 부등 관계를 따져 true / false로 결과를 반환한다.

  • 대 / 소 비교 < > <= >=
    • 두 피연산자의 크기를 비교하여 true나 false를 반환한다.
    • Boolean 형을 제외한 기본형 데이터에 사용하며, 참조형에는 사용할 수 없다.
관계 연산자연산결과
좌변 < 우변좌변이 작으면 true, 아니면 false (초과)
좌변 > 우변좌변이 크면 true, 아니면 false (미만)
좌변 <= 우변좌변이 작거나 같으면 true, 아니면 false (이상)
좌변 >= 우변좌변이 크거나 같으면 true, 아니면 false (이하)
  • 등가비교 ==, !=
    • 두 피연산자가 같은지 다른지 비교하여 true나 false를 반환한다.
    • 기본형과 참조형, 모든 자료형에 사용할 수 있다. 기본형의 경우 변수에 저장되어 있는 값이 같은지 비교하며, 참조형의 경우 참조하고 있는 대상 객체가 같은지 비교한다.
관계 연산자연산결과
좌변 == 우변두 값이 같으면 true, 아니면 false
좌변 != 우변두 값이 다르면 true, 아니면 false

논리 연산자 &&, ||, !

&& (And)와 ||(Or) 연산자 두 가지가 있으며, '그리고, ~면서'와 '또는, ~거나'의 의미를 가지고 있다. && 연산은 두 피연산자가 모두 true일 경우 true를 반환하고, || 연산은 두 피연산자 중 한 개라도 true일 경우 true를 반환한다.

xyx&&yx
truetruetruetrue
truefalsefalsetrue
falsetruetruefalse
falsefalsefalsefalse

비트 논리 연산자 &, |, ^

정수에만 사용되며 피연산자의 자리별 비트값들을 각각 논리 연산으로 비교하며 정수 값을 결과로 반환한다.

  • 비트 논리 연산자
    • 두 정수 피연산자들의 이진수 비트들을 각각 논리 연산하여 결과를 반환한다.
연산자결과 반환
&(AND)두 피연산자의 두 비트가 모두 1이면 1을 반환, 아니면 0을 반환
I(OR)두 연산자의 한 쪽 비트라도 1이면 1을 반환, 아니면 0을 반환
^(XOR)두 연산자의 비트가 다르면 1을 반환, 같으면 0을 반환
  • True / False 와 비트값의 관계
    • 컴퓨터는 2진수를 다루는 기계이다. 2진수의 세계에는 0과 1밖에 존재하지 않으며 이 두 가지를 이용해 논리구조를 표현한다. 기본적으로 0은 false, 1은 true를 나타낸다.

시프트 연산자 <<, >>, >>>

비트 연산자에 해당되며 정수 피연산자의 비트들을 왼쪽(<<) 또는 오른쪽(>>,>>>)으로 이동시켜 정수값의 변화를 주는 연산자

  • 왼쪽 시프트 연산자 <<
    • 정수 피연산자의 비트열 각 자리를 왼쪽으로 이동시킨다. 비트 이동 후 비워지는 오른쪽은 양수 / 음수 상관 없이 비트 0으로 채운다.
    • 연산 결과는 비트 한 자리를 이동시킬 때마다 2의 배수를 곱하기한 결과와 같다.
  • 부호 있는 오른쪽 시프트 연산자 >>
    • 비트열을 오른쪽으로 이동시킨 후 왼쪽의 빈 공간에 양수는 0으로,음수는 1로 채운다.
  • 부호 없는 오른쪽 시프트 연산자 >>>
    • 비트열을 오른쪽으로 이동시킨 후 왼쪽의 빈 공간에 양수 / 음수 상관 없이 모두 0으로 채운다.
수식자리이동2진수10진수
9 << 0없음00000000 00000000 00000000 000010019
9 << 1왼쪽 한 번00000000 00000000 00000000 0001001018
-9 << 2왼쪽 두 번00000000 00000000 00000000 0010010036
-9 << 0없음11111111 111111111 11111111 11110111-9
-9 << 1왼쪽 한 번11111111 11111111 111111111 11110111-18
-9 << 2왼쪽 두 번11111111 11111111 11111111 11110111-36
수식자리이동2진수10진수
9 >> 0없음00000000 00000000 00000000 000010019
9 >> 1오른쪽 한 번00000000 00000000 00000000 000001004
-9 >> 2오른쪽 두 번00000000 00000000 00000000 000000102
-9 >> 0없음11111111 111111111 11111111 11110111-9
-9 >> 1오른쪽 한 번11111111 11111111 111111111 11111011-5
-9 >> 2오른쪽 두 번11111111 11111111 11111111 11111101-3
수식자리이동2진수10진수
9 >>> 0없음00000000 00000000 00000000 000010019
9 >>> 1오른쪽 한 번00000000 00000000 00000000 000001004
-9 >>> 2오른쪽 두 번00000000 00000000 00000000 001000102
-9 >>> 0없음11111111 111111111 11111111 11110111-9
-9 >>> 1오른쪽 한 번01111111 11111111 111111111 111110112147483643
-9 >>> 2오른쪽 두 번00111111 11111111 11111111 111111011073741821

대입 연산자 =

대입 연산자 '='를 사용해서 변수 공간에 값을 저장할 수 있다.
num = 10;

복합 대입 연산자

+=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^=

  • 대입 연산자와 다른 연산자를 결합하여 '연산자=' 방식으로 사용된다.
복합 대입 연산자대입 연산자
i += 2;i = i + 2;
i -= 2;i = i - 2;
i *= 2;i = i * 2;
i /= 2;i = i / 2;
i %= 2;i = i % 2;
i <<= 2;i = i << 2;
i >>= 2;i = i >> 2;
i >>>= 2;i = i >>> 2;
i & 2;i = i & 2;
i I= 2;i = i I 2;
i ^= 2;i = i ^ 2;

상항 연산자 ? :

삼항 연산자는 조건식을 가지고 반환할 피연산자를 선택하는 동작을 하기 때문에 조건 연산자로고도 부른다.
조건식 ? 값1 : 값2
조건식의 결과가 true일 경우에는 값1을 반환하고, false일 경우에는 값2를 반환한다. 조건식은 결과값이 반드시 boolean형이어야 한다.

TestTemary.java

01 public class TestTemary {
02     public static void main(String[] args) {
03         int value = 123;
04         String result = (value % 2 == 0) ? "짝수" : "홀수";
05     System.out.println(value + "는 " + result + "이다.");
06     }
07 }
------
123는 홀수이다.

0개의 댓글

관련 채용 정보