1. 개요
연산자는 어떠한 기능을 수행하는 '기호'를 말한다.
연산식에서 연산자의 작업 대상을 피연산자라고 한다. 변수, 상수, 리터럴, 수식이 이에 해당한다.
연산자의 대상(피연산자)의 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
2. 연산자의 종류 및 우선 순위
연산식을 진행할 때, 괄호로 묶여진 연산식의 우선 순위가 제일 높다.
또한, 피연산자의 수가 적을 수록 높은 우선 순위를 가진다.
단항 및 대입 연산자는 오른쪽에서 왼쪽으로 연산하고, 나머지 산술, 비교, 논리, 삼항 연산자는 왼쪽에서 오른쪽으로 연산한다.
즉, 단항 및 대입 연산자를 제외하고 나머지 다른 연산자는 수학의 기본 원리와 동일하게 연산한다.
int x = 1;
int y = 2;
-x + 3 // -x를 계산하고 3을 계산한다.
x + 3*y // 3*y를 계산하고 +연산을 한다.
x+3 > y-2 // x+3 과 y-2를 계산하고 크기를 비교한다.
x>3 && x<5 // 크기를 비교하고 논리를 통해 값을 추론한다.
int result = x + y*3 // 때문에 x와 y값을 계산하고, 곱셈을 처리한 후에 값을 대입한다.
3. 연산자의 세부 속성
연산자는 피연산자를 대상으로 특정 동작을 수행하는 특성을 가지고 있다.
연산자의 우선 순위에 따라 연산하는 방식이 다르며, 연산자 자체의 작동 방식도 상이하기 때문에 해당 연산자의 정보를 기억하고 적절히 사용하는 것이 중요하다.
3.1. 우선 연산자: (). []
해당 연산자는 연산 과정에서 우선 처리할 연산 과정을 지정하는 연산자이다.
해당 괄호안에 포함한 연산자를 우선 계산하고 다음 연산 과정을 처리하기 때문에 연산자끼리 발생할 수 있는 충돌을 방지할 수 있다.
- (): 우선 순위를 변경하여 사용한다.
- []: 배열의 크기나 첨자를 나타낼 때 사용한다.
3.2. 단항 연산자: ++, --, +, -, (type), !, ~
피연산자의 즉각적인 상태나 정보를 반영할 때 사용한다. 변수 변환도 단항 연산자에 해당한다.
- 보수 (~): 1의 보수를 구해주는 연산자이다. 보수란 어떤 수 C가 되기 위해 A 라는 숫자가 필요로 하는 수를 말한다. 즉, C - A = B 에서 B가 A의 보수이며, A + B = C를 만족한다. 컴퓨터는 2진수를 기준으로 한다. 때문에 보수는 주어진 수치를 2진수로 표현한 뒤에, 0 → 1 로 1 → 0으로 치환한다. 그 뒤 1을 더하면 해당 항목의 보수가 나오는데, 이는 해당 연산 처리가 2진수를 기준으로 한 기계어이기 때문이다.
- NOT (!) : true → false, false → true 로 바꾼다.
- 부호 (+, -): ‘+’는 형식적으로 제공한다. ‘ - ’는 2의 보수 연산자 혹은 부호 바꿈 연산자로 작용한다. (컴퓨터는 이를 +1을 곱하거나 -1을 곱하는 것으로 이해한다.)
- 증감 (++,--): 1을 더하거나 뺄 때, 사용하는 연산자이다. 일반적으로 단항연산자는 피연산자의 왼쪽에 위치하지만 증감연산자는 왼쪽, 오른쪽 모두 위치할 수 있다. 해당 연산자(부호)의 위치에 따라 처리 순서가 변화 한다.
전위형 |
j = ++i; |
++i; // j = i; |
값이 참조되기 전에 증가시킨다. |
후위형 |
j = i++; |
++i; // j = i; |
값이 참조된 후에 증가시킨다. |
int num1=5
/* System.out.println(num1++)
위의 명령어는 아래의 동작과 동일하다.
++의 위치에 따라 먼저 계산하는지 혹은 나중에 계산하는지가 결정된다.
*/
System.out.println(num1)num1=num1+1;
//출력값: 5
// 만약 System.out.println(++num1)인 경우에는 출력값이 6이다.
3.3. 산술 연산자: %, /, *, +, -
피연산자(숫자)를 계산하는 연산자이다.
일반적인 4칙 연산과 동일하다. %는 나머지 값을 구하는 연산자이다.
이항연산자이므로 데이터 타입을 변화시키고 일치시킨 후 계산하는 형변환(Casting) 과정이 발생한다.
정수형이라면 int보다 데이터 크기가 작은 byte, short는 int로 캐스팅된다.
기본적으로 피연사자중에 표현범위가 큰 타입으로 형변환한다. (정수형은 디폴트 값인 int로 변환된다.)
byte + short → int + int → int
char + int → int + int → int
float + int → float + float → float
long + float → float + float → float
float + double → double + double → double
캐스팅을 이해하는 가장 좋은 방법은 각 변수 앞에 해당 형식의 디폴트 값이 있다고 생각하는 것이다.
캐스팅에 대한 포스트는 chapter 05를 참고하자.
3.4. 시프트 연산자: >>, <<, >>>
정수형 데이터에서만 사용이 가능하다. 정수를 2진수로 표현했을 때, 각 자리를 오른쪽 또는 왼쪽으로 이동하는 연산자이다.
음수인 경우 가장 앞에 생긴 앞자리를 1로 채운다. (>>에만 해당하며 부호 비트이다.)
오른쪽으로 n 비트 이동하면 피연산자를 2의 n승으로 나눈 것과 같다. (나머지는 버린다.) >>, <<는 해당 부호 가르키는 방향으로 비트를 이동시키지만, >>> 연산자는 부호에 상관없이 항상 0으로 빈자리를 채운다.
예를 들어, byte num = 12; 의 값은 2진수로 00001100 이다. 이를 num >> 2; 한다면 00000011 로, num << 2; 한다면 00110000 으로 표현된다.
시프트 연산자는 존재한다는 정도만 알아두도록 하자.
실제로 시프트 연산자는 사용하기 어렵고, 이를 통해 알고리즘을 구성하면 협업이 불가능하다.
사람은 컴퓨터가 아니기 때문에 2진수로 수를 즉시 변환하고 이해할 수 없다.
3.5. 관계 연산자: <, <=, >, >=, ==, !=
이항연산자로 피연산자의 크기를 비교할 때 사용한다.
연산의 결과는 true 혹은 false이다.
boolean 형을 제외한 나머지 자료형에 사용이 가능하다.
==, !=는 피연산자의 값이 서로 같은지를 비교한다. (!는 Not의 의미로 쓰인다. !=는 같지 않다는 뜻이다.)
3.6. 논리 연산자: &, ^, |, ~ (&&, || == 논리값)
1) 단항 논리 연산자
논리 연산자는 특정한 결과를 도출할 때, 해당 값이 ‘참’ 혹은 ‘거짓’인지를 판단하는 연산자로 비트 논리 연산자 (&, |, ^, ~)와 조건 논리 연산자(||, &&)로 나눈다.
비트 논리 연산자는 ‘피연산자끼리 이진 비트 연산을 행하여 결과를 정수로 반환하는 연산자’이다.
때문에 정수형 변수만 해당 연산자를 사용할 수 있다.
‘l’ 는 OR 연산자, ‘&’ 는 AND 연산자, ‘^’ XOR 연산자, ‘~’ 는 NOT 연산자 이다.
a |
b |
AND |
OR |
XOR |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
(AND, OR, XOR 진리표)
기본: 논리 연산자에서 ‘참’은 1, ‘거짓’은 0으로 표기한다. 비트 연산자의 기본적인 연산 과정은 2진수를 따른다. 만약 10진수로 입력 및 출력한다면 10진수 >2진수로 바꾸고 ‘연산’한 뒤, 2 진수 > 10진수로 바꾸어 출력한다.
- AND 연산자: 피연산자의 값이 모두 ‘참’인 경우에 ‘참’이다.
- OR 연산자: 피연산자의 값이 ‘하나’라도 ‘참’인 경우에 ‘참’이다.
- XOR 연산자: 피연산자의 값이 ‘동일하지 않은 경우’에 ‘참’이다.
- NOT 연산자: 부여된 논리값을 뒤집는다. 즉 피연산자에 단독으로 적용되어 ‘거짓’을 ‘참’으로, ‘참’을 ‘거짓’으로 변화시킨다. boolean에 사용된다.
2) 조건 논리 연산자 (&&, ||, ==)
조건 논리 연산자는 boolean 형의 값을 결과로 하는 조건 연산자만 허용한다. (조건문, 반복문에서 많이 사용된다.)
어떠한 조건에 모두 해당해야한다면 &&를 적용하고, 둘 중 하나만 ‘참’이여도 된다면 || 를 적용한다.
즉 논리값에 대해서 조건 할당을 할 때, ‘참’의 범위를 지정하는 연산자이다.
중요: ll, l (OR)는 &&, & (AND) 보다 우선순위가 낮다.
x < -1 ll x > 3 && x < 5 // (x)
x < -1 ll (x > 3 && x < 5) // (o)
int x = 4
x < -1 || x > 3 && x < 5 // (x)
//조건 논리 연산자가 2개로 중첩되어 연산자 사이의 우선 순위에 따른 계산이 불가능하다.
x < -1 || (x > 3 && x < 5) // (o)
논리형 연산자의 중요한 점은 해당 연산자를 통해 특정 ‘값’의 계산과 구현, 암호화의 기초가 되기 때문이다.
3.7. 삼항연산자: ?:
삼항연산자는 조건 연산자라고도 하며 3개의 피연산자를 필요로 한다.
첫번째 피연산자는 조건이며, 두번째 피연산자는 조건이 true일 때, 세번째 피연산자는 false일 때의 값이다.
int a=(5 < 4) ? 50 : 40;
int a = (5 < 4) ? 50 : 40;
// 위의 조건에서 a의 조건 5 < 4는 거짓이므로 40이 할당된다.
3.8. 대입 연산자: =, +=, -=, *=, %=, /=, >>=, <<=
대입연산자는 변수에 값 또는 수식의 연산결과를 저장하는데 사용된다.
오른쪽에서 왼쪽으로 연산되므로, 다수의 대입 연산이 진행될 경우 가장 우측부터 연산을 진행한다.
int a; a=b=10; // 우선 b=10이 처리된 후 a=b가 연산. a+=3/ a=a+3
int a;
int b;
a=b=10;
// 우선 b=10이 처리된 후 a=b가 연산.
a+=3; // 이 연산식은 a=a+3 과 동일하다
3.9. 콤마 연산자: ,
for(int i = 1, j = i + 10; i < 5; i++, j = i * 2)
{
System.out.println("i = " + i + " j = " + j);
}
/*
i = 1 j = 11
i = 2 j = 4
i = 3 j = 6
i = 4 j = 8
*/
콤마 연산자는 반복문을 이해할 필요가 있다.
쉽게 이해하자면 콤마 연산으로 선언된 연산자는 왼쪽에서 오른쪽으로 순차적으로 처리하는 것이다.
'Java > 기본 이론' 카테고리의 다른 글
[JAVA] Chapter 09. 제어문- 조건문 (0) | 2021.04.24 |
---|---|
[JAVA] Chapter 08. 정보를 출력하는 명령어 (0) | 2021.04.23 |
[JAVA] Chapter 06. 데이터 영역의 이해 (0) | 2021.04.23 |
[JAVA] Chapter 05. 변수 - 데이터 타입과 형변환 (0) | 2021.04.23 |
[JAVA] Chapter 04. 데이터의 기본이해 (0) | 2021.04.23 |