프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(Operations)이라고 한다.
- 연산자(Operator) : 어떤 연산을 나타내는 표시나 기호
- 피연산자(Operand) : 해당 연산식에서 연산되는 데이터
- 연산식(Expressions) : 연산자와 피연산자를 이용하여 연산의 과정을 표현한 것
* 연산자의 종류
유형 |
연산자 |
피연산자 수 |
기능 |
예시 |
결과값 |
산술 연산자 |
+, -, *, /, % |
2개 (이항) |
사칙연산과 나머지 계산 |
z = x + y |
숫자 |
부호 연산자 |
+, - |
1개 (단항) |
양수 및 음수의 표현 |
x = -x |
숫자 |
문자열 연산자 |
+ |
2개 (이항) |
두 문자열을 연결 |
"안녕" + "하세요" |
문자열 |
대입 연산자 |
=, +=, -=, *=, /= %=, &=, ^=, |=, <<=, >>= |
2개 (이항) |
좌변의 변수에 우변의 값을 대입 |
x += 1 (x = x + 1) x &= y (x = x & y) |
|
증감 연산자 |
++, -- |
1개 (단항) |
1만큼 증가(++) 또는 감소(--) |
++x (선증가 후연산) x++ (선연산 후증가) |
숫자 |
비교 연산자 |
==, !=, <, >, >=, <=, instanceof |
2개 (이항) |
값의 비교 |
x >= y (x가 y보다 크거나 같은가) |
boolean - true/false |
논리 연산자 |
!, &, |, &&, || |
단항 또는 이항 |
NOT(!), AND(&, &&), OR(|, ||) 연산 |
밑에 추가 설명 |
boolean - true/false |
조건 연산자 |
(조건식) ? T : F |
3개 (삼항) |
조건식이 참이면 T, 거짓이면 F |
(x > y) ? x : y |
|
비트 연산자 |
~, &, |, ^ |
단항 또는 이항 |
비트 XOR, AND, OR, NOT 연산 |
밑에 추가 설명 |
숫자, boolean |
쉬프트 연산자 |
<<, >>, >>> |
2개 (이항) |
비트 이동 연산자로 비트를 좌측, 우측으로 밀어서 이동 |
밑에 추가 설명 |
숫자 |
▶ 산술 연산자
1. 자바는 리터럴 간의 연산은 타입 변환 없이 계산한다.
ex) char c = 'A' + 1; // c에는 유니코드 66인 'B' 가 저장된다.
(But.) char c2 = c + 1; // c는 int타입으로 변환되고 1과 연산되므로 산출 타입은 int이다. 따라서 컴파일 에러.
위의 경우, c를 int타입으로 캐스팅(Casting)해서 char 타입으로 변환해야 한다.
2. 오버플로우 탐지 : 산출 타입(Type)으로 표현할 수 없는 값이 산출되면, 오버플로우가 발생하고 쓰레기값을 얻는다.
3. / 또는 % 연산자 사용 시 우측 피연산자는 0을 사용할 수 없다. 0으로 나누게 되면 예외(ArithmeticException)가 발생한다. 또한 실수 타입인 0.0 또는 0.0f로 나누면 예외가 발생하지 않고, / 연산의 결과는 Infinity(무한대) 값을 가지며, % 연산의 결과는 NaN(Not a Number)을 가진다. 이 때는 데이터가 엉망이 되므로 그 다음의 연산을 수행해선 안된다. 따라서 부동소수점(실수)을 입력받을 때 입력값의 NaN 여부를 조사하고 연산을 수행해야 한다.
(But.) NaN인지 조사할 때 == 연산자를 사용해선 안되며, Double.isNaN() 을 사용해야 한다. 그 이유는 NaN는 != 연산자를 제외한 모든 비교 연산자에서 false를 리턴하기 때문이다.
▶ 비교 연산자
1. 비교 연산자에서는 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다.
2. 예외 : 0.2 == 0.2f 의 경우 이진 포맷의 가수를 사용하는 모든 부동소수점 타입은 0.1을 정확히 표현할 수 없기 때문에 0.1f는 0.1의 근사값으로 나타나므로 피연산자를 모두 float 타입으로 강제 타입 변환한 후 비교 연산을 수행해야 한다.
3. String 객체의 문자열 비교할 때는 ==가 아닌 equlas() 메소드를 사용해야 한다. == 사용 시 객체의 번지값을 비교하므로 번지가 다른 객체일 경우 같은 문자열 상수라도 false가 나온다.
▶ 논리 연산자
1. AND (논리곱) - && 또는 & : 피연산자 모두 true일 경우 연산 결과로 true를 반환한다.
2. OR (논리합) - || 또는 | : 피연산자 중 적어도 하나가 true일 경우 연산 결과로 true를 반환한다.
3. XOR (배타적 논리합) - ^ : 피연산자가 하나는 true이고 다른 게 false일 경우에만 연산 결과는 true를 반환한다. (서로 다를 경우)
4. NOT (논리부정) - ! : 피연산자의 논리값을 바꾼다. true 이면 false , false이면 true로 변환한다.
▶ 비트 연산자
1. 비트 연산자는 데이터를 비트(bit) 단위로 연산한다.
2. 비트 반전 연산자, 논리 부정(~)
# 피연산자를 이진수로 표현했을 때, 0을 1로, 1은 0으로 반전한다.
# 정수 타입(byte, short, int, long)의 연산자에게만 사용된다.
# 연산 후, 부호 비트인 최상위 비트를 포함해서 모든 비트가 반전된다.
# 비트 반전 연산자의 산출 타입은 int 타입이다.
# 비트 반전 연산자의 산출값에 1을 더하면 부호가 반대인 정수를 얻는다.
3. 논리곱(AND) - & : 두 비트 모두 1일 경우에만 연산 결과가 1이 된다.
4. 논리합(OR) - | : 두 비트 중 적어도 하나가 1이면 연산 결과는 1이 된다.
5. 배타적논리합(XOR) - ^ : 두 비트 중 하나는 1이고 다른 하나가 0일 경우 연산 결과는 1이 된다.
▶ 쉬프트 연산자(비트 이동 연산자)
1. a << b : 정수 a를 이진법으로 표현했을 때, 각 비트를 b만큼 왼쪽으로 이동시키고 빈자리는 0으로 채워진다.
2. a >> b : 정수 a를 이진법으로 표현했을 때, 각 비트를 b만큼 오른쪽로 이동시키고 빈자리는 정수 a의 최상위 부호 비트와 같은 값으로 채워진다.
3. a >>> b : 정수 a의 각 비트를 b만큼 오른쪽으로 이동시키고 빈자리는 0으로 채워진다.
* 연산 방향 및 우선 순위
연산자 |
연산 방향 |
우선 순위 |
증감(++, --), 부호(+, -), 비트(~), 논리(!) |
← |
높음 ↑ ↓ 낮음 |
산술(*, /, %) |
→ |
|
산술(+, -) |
→ |
|
쉬프트(<<, >>, >>>) |
→ |
|
비교(<, >, <=, >=, instanceof) |
→ |
|
비교(==, !=) |
→ |
|
논리(&) |
→ | |
논리(^) |
→ |
|
논리(|) |
→ |
|
논리(&&) |
→ |
|
논리(||) |
→ |
|
조건( ? : ) |
→ |
|
대입(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=) |
← |
'Programming Language > JAVA' 카테고리의 다른 글
6. About Java and Exception - 예외 (0) | 2017.03.31 |
---|---|
5. Control Statement, Looping - 제어문과 루핑(조건문과 반복문) (0) | 2017.03.23 |
3. Promotion, Casting - 타입 변환 (0) | 2017.03.23 |
2. Variable, Constant, Type - 변수, 상수, 자료형 (0) | 2017.03.21 |
1. Java virtual machine - 자바 가상 기계 (0) | 2017.03.21 |