[Java] Java의 정석 | Chapter 03 연산자(operator)

숙취엔 꿀물.·2023년 11월 24일

Java

목록 보기
3/13
post-thumbnail

👉1. 연산자(operator)

1.1 연산자와 피연산자

연산자(operator) - 연산을 수행하는 기호(+, -, *, / 등)
피연산자(operand) - 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
ex) 'x+3'에서 +는 연산자, x와 3은 피연산자


1.3 연산자의 종류

종류연산자설명
산술 연산자+ - * / % << >>사칙 연산(+,-,* ,/)과 나머지 연산
비교 연산자> < >= <= == !=크고 작음과 같고 다름을 비교
논리 연산자&&
대입 연산자=우변의 값을 좌변에 저장
기타(type) ?: instanceof형변환 연산자, 삼항 연산자, instanceof 연산자

1.4 연산자의 우선순위와 결합규칙

  1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
  2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
  • 이를 표로 정리하면 다음과 같다.
종류결합규칙연산자우선순위
단항 연산자<--------++ -- + - ~ ! (type)높음
산술 연산자-------->* / %
-------->+ -
--------><< >>
비교 연산자-------->< > <= >= instanceo
-------->== !+
논리 연산자-------->&
-------->^
-------->|
-------->&&
-------->||
삼항 연산자-------->?:
대입 연산자<--------= += -= *= /= %= <<= >>= &= ^= |=낮음

1.5 산술 변환(usual arithmetic conversion)

산술 변환이란? 연산 수행 직전에 발생하는 피연산자의 자동 형변환
① 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치).
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.



👉 2. 단항 연산자

2.1 증감 연산자 ++ --

증가 연산자(++) 피연산자의 값을 1 증가시킨다.
감소 연산자(--) 피연산자의 값을 1 감소시킨다.

타입설명사용예
전위형값이 참조되기 전에 증가시킨다.j = ++i;
후위형값이 참조된 후에 증가시킨다.j = i++;

2.2 부호 연산자 + -

  • 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다. 피연산자가 음수면 양수, 양수면 음수가 연산의 결과가 된다.
  • 부호 연산자 '+'는 하는 일 X


👉 3. 산술 연산자

3.1 사칙 연산자 +-*/

3.2 나머지 연산자 %



👉 4. 비교 연산자

4.1 대소비교 연산자 < > <= >=

두 피연산자의 값의 크기를 비교하는 연산자이다. 참이면 true, 거짓이면 false를 결과로 반환한다. 기본형 중에서는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.

비교연산자연산결과
>좌변 값이 크면 true, 아니면 false
<좌변 값이 작으면 true, 아니면 false
>=좌변 값이 크거나 같으면 true, 아니면 false
<=좌변 값이 작거나 같으면 true, 아니면 false

4.2 등가비교 연산자 == !=

두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다. 대소비교 연산자와는 달리, 모든 자료형에 사용할 수 있다.

비교연산자연산결과
==두 값이 같으면 true, 아니면 false
!=두 값이 다르면 true, 아니면 false
class OperatorEx21{
	public static void main(String args[]){
    	System.out.printf("10 == 10.0f \t %b\n", 10==10.0f);	// true
        System.out.printf("'0'== 0	   \t %b\n", '0'==0);		// false
        System.out.printf("'A'== 65	   \t %b\n", 'A'==65);		// true
        System.out.printf("'A' > 'B'   \t %b\n", 'A'>'B');		// false
        System.out.printf("'A'+1 != 'B'\t %b\n", 'A'+1 != 'B');	// false
    }
}


👉 5. 논리 연산자

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

|| (OR결합) - 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
&& (AND결합) - 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.

xyx||yx&&y
truetruetruetrue
truefalsetruefalse
falsetruetruefalse
falsefalsefalsefalse
  • <논리 연산자의 연산결과>
// ex)
// 1. x는 10보다 크고, 20보다 작다.
x > 10 && x < 20

// 2. i는 2의 배수 또는 3의 배수이다.
i % 2 == 0 || i % 3 == 0

// 3. i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
(i % 2 == 0 || i % 3 == 0) && i % 6 != 0

// 4. 문자 ch는 숫자('0'~'9')이다.
'0' <= ch && ch <= '9'

// 5. 문자 ch는 대문자 또는 소문자이다.
('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

효율적인 연산(short circuit evaluation)

논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것

  • OR 연산 || 의 경우, 두 피 연산자 중 어느 한 쪽만 이어도 전체 연산결과가 이므로 좌측 피연산자가 'true(참)'이면, 우측 피연산자의 값은 평가하지 않는다.

  • AND연산 && 의 경우도 마찬가지로, 어느 한쪽만 거짓(false) 이어도 전체 연산결과가 '거짓(false)' 이므로 좌측이 거짓이면 우측은 평가하지 않는다.

논리 부정 연산자 !

피연산자가 true이면 false를, false면 true를 결과로 반환한다.


5.2 비트 연산자 & | ^ ~ << >>

| (OR 연산자) - 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
& (AND 연산자) - 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^ (XOR 연산자) - 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

  • 연산자 '^' 는 배타적 XOR(eXclusive OR)라고 하며, 피연산자의 값이 서로 다른 경우, 즉 배타적인 경우에만 참(1)을 결과로 얻는다.

비트 전환 연산자 ~

이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리부정 연산자 '!'와 유사하다.

  • '~' 에 의해 '비트 전환'되고 나면, 부호있는 타입의 피연산자는 부호가 반대로 변경된다. 즉, 피연산자의 '1의 보수'를 얻을 수 있다. 그래서 비트전환연산자를 '1의 보수' 연산자라고도 한다.

쉬프트 연산자 << >>

이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shift) 한다고 해서 '쉬프트 연산자(shift operator)'라고 이름 붙여졌다.

x << n 은 x * 2^n의 결과와 같다.
x >> n 은 x / 2^n의 결과와 같다.



👉 6. 그 외의 연산자

6.1 조건 연산자 ? :

조건 연산자는 건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.

조건식 ? 식1 : 식2
result = (x > y) ? x : y; // 이런식으로 사용한다.
  • if문 대신 조건 연산자를 사용하면 코드를 보다 간단히 할 수 있다.

6.2 대입 연산자 = op=

대입 연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다. 이 연산자는 오른쪽 피연산자의 값(식이라면 평가값)을 왼쪽 피연산자에 저장한다.

복합 대입 연산자

대인 연산자는 다른 연산자(op)와 결합하여 'op='와 같은 방식으로 사용될 수 있다.

op==
i += 3;i = i + 3;
i -= 3;i = i - 3;
i *= 3;i = i * 3;
i /= 3;i = i / 3;
i %= 3;i = i % 3;
i <<= 3;i = i << 3;
i >>= 3;i = i >> 3;
i &= 3;i = i & 3;
i ^= 3;i = i ^ 3;
i |= 3;i = i | 3;
i *= 10 + j;i = i * (10 + j);

👉 참고

저는 그냥 책만 보고 공부하긴 하지만 필요한 사람이 있을까봐 남깁니다.

profile
단단하게 오래가고자 하는 백엔드 개발자

0개의 댓글