연산자
연산자와 연산식
•
연산(Operation) : 데이터를 처리하여 결과를 산출하는 행위
•
연산자(Operater) : 연산에 사용되는 기호
•
피연산자(Operand) : 연산의 대상이 되는 데이터
z = x + y
// 산술 연산
// + 기호
// x 와 y
Java
복사
•
연산이 아무리 복잡하더라도 결과값은 오직 하나!
연산의 방향과 우선순위
•
수학에서 덧셈, 뺄셈 보다 곱셈, 나눗셈을 먼저 계산한다.
•
연산자도 우선순위와 연산의 방향이 존재한다.
◦
단항 연산, 대입 연산을 제외한 연산은 좌 → 우
◦
단항 연산의 우선순위가 첫번째. 대입 연산의 우선순위가 마지막.
▪
단항 > 이항 > 삼항 > 대입
◦
복잡한 연산식은 괄호를 사용한다.
Default view
Search
단항 연산자
•
피연산자가 하나인 연산자
•
부호(+, -), 증감(++, --), 논리 부정(!), 비트 반전(~)
부호 연산자
•
양수, 음수를 표현하는 연산자
◦
+ : 양수
◦
- : 음수
•
정수, 실수 타입에 사용
•
부호 연산자의 결과는 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