연산자(Operator)

주8·2023년 1월 5일
0
  • 연산자(Operator): 피연산자에 대한 계산(처리)를 수행하는 특수 문자 기호의 총칭(+,-,*,/ 등)
  • 피연산자(Operand): 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

단항의 항의 의미는 연산 실행에 필요한 값 또는 변수를 의미한다.
이항연산자는 산술, 비교, 논리


종류기호
최우선 연산자. , [], ()
단항 연산자!, ~, +/-, ++/--, (cast)
산술 연산자+, -, *, /, %
관계 연산자>, <. ≤, ≥, ==, !=, instanceof
비트 연산자&, ^, |
논리 연산자&&, ||
삼항 연산자조건항 ? 항1 : 항2
대입 연산자=, +=, *=, /=, %=, <<=, >>=, ^=, &=, |=
증감 연산자++/--
시프트 연산자<<. >>, >>>

연산자 우선순위

  • 괄호의 우선순위가 제일 높다.
  • 산술 > 비교 > 논리 > 대입
  • 단항 > 이항 > 삼항
  • 연산자의 연산 진행방향은 왼쪽에서 오른쪽(→)이다. 예) 1 2 3
    단, 단항, 대입 연산자만 오른쪽에서 왼쪽(←)이다. 예) x = y = z
  • 예) c = 25 - 5 4 / 2 - 10 + 4 → 결과: 9
    5
    4 → 20
    20/2 → 10
    25-10 → 15
    15-10 → 5
    5+4 → 9
  • 연산방향은 진행방향 예) 산술연산자는 왼쪽에서 오른쪽 연산

종류연산방향연산자우선순위
단항 연산자++ -- + - ~ ! (타입)높음
산술 연산자* / % |
+ -
<< >> >>>
비교 연산자< > <= >= instanceof
== !=
논리 연산자&
^
|
&&
||
삼항 연산자? :
대입 연산자= *= /= %= += -= <<= >>= >>>= &= ^= |=낮음

산술 연산자(Arithmetic Operators)

기본적인 연산자이며 사칙연산과 나머지(%) 연산이 있다.

  • % 연산(Modulus)의 경우 피연산자들이 나머지를 구해주는 연산이다.
  • byte, short, char, int 자료형 사이의 연산은 정수 기본형인 int형으로 결과가 처리된다.
  • 산술 연산자는 두 개의 피연산자를 가지는 이항 연산자이다.
  • long, float, double은 큰 자료형의 결과로 처리된다(long < float < double).

증감 연산자

증감 연산자는 변수에 대한 연산자의 위치(앞 또는 뒤)에 따라 결과값이 달라진다.

  • 증가 연산자(++): 피연산자의 값을 1 증가시킨다.
  • 감소 연산자(--): 피연산자의 값을 1 감소시킨다.
  • 선증감 연산자: ++(--)변수명
    • 연산을 먼저 수행 후 값을 할당한다.
  • 후증감 연산자: 변수형++(--)
    • 값을 먼저 할당 후 연산을 수행한다.

++변수명은 “변수형=변수형+1”과 동일한 연산이다.


증감 연산자설명예시
++변수선증가 연산자int i = 5;
int j = ++i;
결과: i = 6, j = 6
변수++후증가 연산자int i = 5;
int j = i++;
결과: i = 6, j = 5
--변수선감소 연산자int i = 5;
int j = --i;
결과: i = 4, j = 4
변수--후감소 연산자int i = 5;
int j = i--;
결과: i = 4, j = 5

비교 연산자

값을 비교하는 연산자로 연산 결과는 true 또는 false이다.

  • ‘=’는 값을 대입하는 대입 연산자, ‘==’는 두 값을 비교하는 비교 연산자다.
  • 기본 자료형이 아닌 참조 자료형(reference data type)일 경우 ==, ≠ 연산자만 가능하다.

연산자설명예시
==비교값이 같으면 trueif (i == 1)
!=비교값이 다르면 trueif (i != 1)
<왼쪽값이 오른쪽 값보다 작으면 trueif (i < 1)
<=왼쪽값이 오른쪽 값보다 작거나 같으면 trueif (i <= 1)
>왼쪽값이 오른쪽 값보다 크면 trueif (i > 1)
>=왼쪽값이 오른쪽 값보다 크거나 같으면 trueif (i >= 1)

논리 연산자

논리 연산자는 양쪽의 피연산자들의 boolean(true 또는 false)값만 비교할 수 있다.

  • &&: 양쪽 피연산자들이 모두 true일 때만 true
  • ||: 양쪽 피연산자들이 모두 false일 때만 false
  • !: 논리부정연산자로 true는 false, false는 true로 변환한다.
  • Short-circuit: 불필요한 검사를 하지 않아 속도가 빨라질 수 있으며 효율적 코드 작성
    값1 && 값2 ⇒ 값1이 false라면 값2는 검사하지 않는다.
    값1 || 값2 ⇒ 값1이 true라면 값2는 검사하지 않는다.

삼항 연산자

삼항 연산자는 3개의 피연산자로 이루어진다.

  • 조건항 ? 항1 : 항2
    • 조건항이 true면 결과는 항1이 되고 false면 결과는 항2가 된다.
int a = 10 > 20 ? 10 : 20; //a=20
int b = 10 < 20 ? 10 : 20; //a=10

int x = 10;
int r = x ≥ 0 ? x : -x; //r=10

대입 연산자

대입 연산자(=)는 오른쪽 피연산자의 값이나 연산 결과를 왼쪽 변수에 대입하는 연산자

  • 대입 연산자는 축약해서 사용할 수 있다. (i = i+j ⇒ i += j)
    예) int i = 10;
    i = i+3;
    i += 3;

대입 연산자대입 축약 형태
i += 3i = i + 3
i -= 3i = i - 3
i *= 3i = i * 3
i /= 3i = i / 3
i %= 3i = i % 3
i &= ji = i & j
i |= ji = i | j
i <<= 3i = i << 3
i >>= 3i = i >> 3
i >>>= 3i = i >>> 3
i *= 10+ji = i * (10+j)

비트 연산자

비트 연산자는 비트 단위의 연산자로 AND(&), XOR(^), NOT(~)이 있다.
논리 연산자와 비슷하지만, bit 단위로 논리 연산을 할 때 사용하는 연산자다.
비트 연산시 연산 최소단위인 4byte로 변환된다(byte, short → int).

  • AND 연산자(&): 피연산자 양쪽 모두 1이면 1이다.
  • OR 연산자(|): 피연산자중 어느 한쪽이 1이면 1이다.
  • XOR 연산자(^): 두 값이 동일하면 0, 다르면 1이다.
  • NOT 연산자(~):
    • 0은 1로 1은 0으로 반전시키는 연산자다.
    • ~ 연산으로 반전된 비트가 음수로 인식되면 음수를 저장하기 위해 2의 보수(보충해주는 수) 처리가 된다.

xyx|yx&yx^y
11110
10101
01101
00000

  • 2의 보수는 1의 보수 +1
  • 1의 보수는 NOT 연산자로 비트 반전하여 구한다.
  • 2의 보수를 구하는 과정: 1의 보수 구하기 → 구한 1의 보수에 +1 한다.
  • 예를 들어 4 비트의 2진수로 양수(0 포함), 음수를 모두 표현해야 하는데 1의 보수만 해두면 0, -0이 공존하기 때문에 음수 처리를 위해 +1을 해준다.

비트 시프트 연산자

시프트 연산자는 정수형 변수에만 사용가능한데, 피연산자의 각 자리(2진수)를 오른쪽 또는 왼쪽으로 이동(shift)해서 시프트 연산자라고 한다.

  • 왼쪽 시프트 연산(<<): 비트가 한 비트씩 왼쪽으로 이동시마다 그 값은 2개씩 증가한다(비어있는 오른쪽 비트는 0으로 채워진다).
  • 오른쪽 시프트 연산(>>): 비트가 오른쪽으로 이동시마다 그 값은 2배씩 감소한다(음수인 경우 빈자리에 1을, 양수인 경우 0을 채워 부호는 변함 없다).
  • 오른쪽 시프트 연산자(>>>): 부호비트를 포함하여 모든 비트를 오른쪽으로 이동시키며, 비어있는 왼쪽 비트는 항상 0으로 채운다.
  • 2ⁿ으로 곱하거나 나눈 결과를 반환하며 곱셈, 나눗셈보다 빠르다.
    x << n은 x 2ⁿ과 같다 → 8 << 2는 8
    x >> n은 x / 2ⁿ과 같다 → 8 >> 2는 2 / 2²
  • MSB(Most Significant Bit): 데이터형의 최상위 Bit
  • LSB(Least Significant Bit): 데이터형의 가장 낮은 위치의 Bit
profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글