Search

Chapter03. 연산자

생성일
2021/01/11 11:16
태그

연산자

연산자와 연산식

연산(Operation) : 데이터를 처리하여 결과를 산출하는 행위
연산자(Operater) : 연산에 사용되는 기호
피연산자(Operand) : 연산의 대상이 되는 데이터
z = x + y // 산술 연산 // + 기호 // x 와 y
Java
복사
연산이 아무리 복잡하더라도 결과값은 오직 하나!

연산의 방향과 우선순위

수학에서 덧셈, 뺄셈 보다 곱셈, 나눗셈을 먼저 계산한다.
연산자도 우선순위와 연산의 방향이 존재한다.
단항 연산, 대입 연산을 제외한 연산은 좌 → 우
단항 연산의 우선순위가 첫번째. 대입 연산의 우선순위가 마지막.
단항 > 이항 > 삼항 > 대입
복잡한 연산식은 괄호를 사용한다.
Search
연산자
연산방향
우선순위
---------->
|
---------->
|
---------->
|
---------->
|
---------->
|
---------->
|
---------->
|
---------->
|
---------->
|
COUNT13

단항 연산자

피연산자가 하나인 연산자
부호(+, -), 증감(++, --), 논리 부정(!), 비트 반전(~)

부호 연산자

양수, 음수를 표현하는 연산자
+ : 양수
- : 음수
정수, 실수 타입에 사용
부호 연산자의 결과는 int 타입
byte a = 1; // byte minus_a = -a; // 컴파일 에러 int minus_a = -a;
Java
복사

증감 연산자

변수의 값을 1씩 증가하거나 감소하는 연산자
++ : 1 증가
-- : 1 감소
피연산자의 앞, 뒤 위치에 따라 연산식의 결과가 다르다.
++ 피연산자 : 연산을 수행하기 전 1 증가
피연산자 ++ : 연산을 수행한 후 1 증가
-- 피연산자 : 연산을 수행하기 전 1 감소
피연산자 -- : 연산을 수행한 후 1 감소
int a = 0; int b = 0; int c = -1; c = a++; // c에 a를 대입하는 연산이 끝난 후 a를 1 증가. // 연산 전 : c=-1, a=0 // 연산 후 : c=0, a=1 c=-1; c = ++b; // c에 b를 대입하는 연산 전에 b를 1 증가. // 연산 전 : c=-1, b=1 // 연산 후 : c=1, b=1
Java
복사
i = i + 1++i 의 수행속도는 동일하다 ( 바이트코드 동일 )

논리 부정 연산자

참, 거짓을 부정하는 연산자
! : 논리 부정
boolean a = true; boolean b = !a; // b 에는 a의 값 true의 부정인 false가 저장
Java
복사

비트 반전 연산자

정수 타입 데이터를 2진수로 표현했을 때, 0과 1을 반전시킨다.
~ : 비트 반전
byte a = 10; // 0 0 0 0 1 0 1 0 byte b = ~a; // 1 1 1 1 0 1 0 1 // b는 10진수로 -11
Java
복사
연산의 결과는 int 타입이다.
부호만 반대인 값을 구할 수 있다.
비트 반전 연산 → 더하기 1

이항 연산자

피연산자가 두개인 연산자
산술(+,-,/,%), 문자열 연결(+), 비교(<, ≤, >, ≥, ==, !=), 논리(&, &&, |, ||, ^, !), 비트 논리(&, |, ^), 비트 이동(<<, >>, >>>), 대입(=, +=, -=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

산술 연산자

사칙연산과 나머지를 구하는 연산
+ : 덧셈
- : 뺄셈
* : 곱셈
/ : 나눗셈
% : 나머지
boolean 을 제외한 타입 연산 가능
피연산자의 타입이 다른 경우 : 결과
int 보다 작은 타입 : int
long 타입이 있는 경우 : long
실수 타입이 있는 경우 : 실수
byte a = 1; byte b = 1; int c = a + b;
Java
복사
리터럴간의 연산은 자동 변환이 발생하지 않는다.
char c = 'A' + 1;
Java
복사
연산 결과의 오버플로우를 고려해야 한다.
연산 결과값의 크기가 데이터 타입보다 크거나 작을 수 있다.
int a = 1000000; int b = 1000000; int c = a * b; // int 는 대략 20억 까지 표현 가능
Java
복사
정확한 연산을 위해 정수를 사용한다.
실수는 부동소수점으로 나타내 정확한 연산이 불가능하다.
0 혹은 0.0 으로 나누는 경우를 피한다.
/ 혹은 % 연산을 하는 경우 발생
0 으로 나눈 연산 결과 : 예외 발생
0.0, 0.0f 로 나눈 연산 결과값 : Infinity
Double.isInfinite(), Double.IsNaN()
0으로 나눈 나머지 연산 결과값 : NaN
Double.isNaN()
Infinity, NaN으로 다른 연산 수행시 동일한 결과 발생
Double.isInfinite() , Double.inNaN() 메소드를 사용하여 방지

문자열 연결 연산자

문자열과 문자열을 이어주는 연산
+ : 문자열 연결
좌 → 우 방향으로 연산을 수행
왼쪽에 숫자가 있는 경우
산술 연산 결과값 + 문자열 연결
왼쪽에 문자열이 있는 경우
문자열 연결
String str1 = 6 + 6 + "Hello"; // str1 = "12Hello" String str2 = "Hello" + 6 + 6; // str2 = "Hello66"
Java
복사

비교 연산자

대소, 동등을 비교하는 연산
< : 미만
> : 초과
>= : 이상
<= : 이하
== : 같음
!= : 다름
연산의 결과는 boolean 타입
0.1 == 0.1f // false // 0.1f는 0.1을 정확하게 표현할 수 없다.
Java
복사
문자열은 다른 방식으로 비교한다.
String 타입의 변수의 값은 문자열이 아닌 String 객체의 주소이다.
즉, 문자열은 같을지라도 가리키는 객체가 다를 수 있다.
문자열을 비교하는 경우, String.equals() 메소드를 사용한다.

논리 연산자

boolean 타입의 피연산자 간의 논리 연산
&, && : AND
|, || : OR
^ : XOR
! : NOT
연산의 결과는 boolean 타입
&, && : 두 피연산자 모두가 true일 때 연산 결과는 true
|, || : 두 피연산자 중 하나라도 true 일 때 연산 결과는 true
^ : 두 피연산자가 서로 다를 경우 연산 결과는 true
! : 피연산자의 논리값을 부정

비트 연산자

정수 타입의 데이터를 비트 단위로 연산
& : AND
| : OR
^ : XOR
~ : NOT
<< , >> , >>> : Shift
비트 논리 연산자
& : 두 피연산자의 비트가 모두 1일 때 연산 결과 비트는 1
| : 두 피연산자의 비트 중 하나라도 1일 때 연산 결과 비트는 1
^ : 두 피연산자의 비트가 서로 다를 경우 연산 결과 비트는 1
~ : 피연산자의 비트를 0은 1로, 1은 0으로 전환. 보수
비트 연산시 피연산자와 연산 결과는 int 타입으로 자동 변형
비트 이동 연산자
<< : 연산자 기준 왼쪽 피연산자의 비트를 오른쪽 피연산자만큼 왼쪽으로 이동. 빈자리는 0으로 채움.
>> : 연산자 기준 왼쪽 피연산자의 비트를 오른쪽 피연산자만큼 오른쪽으로 이동. 빈자리는 부호 비트와 동일하게 채움.
>>> : 연산자 기준 왼쪽 피연산자의 비트를 오른쪽 피연산자만큼 오른쪽으로 이동. 빈자리는 0으로 채움.

대입 연산자

피연산자의 값을 변수에 대입하는 연산
단순 대입 연산자 : 피연산자의 값을 변수에 대입
복합 대입 연산자 : 연산결과를 변수에 대입
우선 순위가 가장 낮아 제일 마지막에 수행된다.
연산의 진행 방향 좌 ← 우

삼항 연산자

세 개의 피연산자를 조건에 따라 연산. 조건 연산식.
? :
조건식(피연산자1) ? 값/연산식(피연산자2) : 값/연산식(피연산자3)
조건식의 결과가 true 이면 연산결과는 피연산자2
조건식의 결과가 false 이면 연산결과는 피연산자3