프로그램에서 데이터를 처리하여 결과를 (산출)만들어내는걸 의미한다.
x + y
▪︎ +
: 연산자
▪︎ x
: 피연산자
▪︎ y
: 피연산자
연산에 사용되는 표시 또는 기호를 의미하며, 연산의 종류를 결정짓는다.
연산자에 의해 연산 되는 수나 변수를 의미한다.
3 + x
// 피연산자 : 3, x
연산자와 피연산자를 사용하여 연산 과정을 기술한걸 의미한다.
연산식은 반드시 하나의 값을 산출하며, 피연산자 위치에 연산식을 사용할 수도 있다.
// 피연산자 위치 = (x + y)
boolean result = (x + y) < 5;
연산자별로 산출되는 값의 타입이 다르다.
피연산자의 수는 연산자를 사용할 때 필요한 피연산자의 개수를 의미한다.
증감, 비교, 논리, 대입, 삼항 연산자는 자주 사용된다.
연산자 종류 | 연산자 | 피연산자 수 | 산출값 | 기능 |
---|---|---|---|---|
산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
부호 | +, - | 단항 | 숫자 | 음수와 양수의 부호 |
문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
대입 | =, +=, -=, *=, /=, %= | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
증감 | ++, -- | 단항 | 숫자 | 1만큼 증가/감소 |
비교 | ==, !=, >, <, >=, <=, instanceof | 이항 | boolean | 값의 비교 |
논리 | !, &, |, %%, || | 단항 이항 |
boolean | 논리 부정, 논리곱, 논리합 |
조건 | (조건식) ? A : B | 삼항 | 다양 | 조건식에 따라 A 또는 B 중 하나를 선택 |
하나의 연산식에 여러 종류의 연산들을 사용하는 경우가 많다.
이 때는 우선순위에 따라 연산이 수행된다.
▪︎ 단항 → 이항 → 삼항
▪︎ 산술 → 비교 → 논리 → 대입
같은 우선순위의 연산자로 연산을 수행하면 연산이 수행되는 방향이 있다.
증감, 부호, 논리, 대입 연산자는 오른쪽에서 왼쪽 방향으로 수행된다.
연산자 | 연산 방향 | 우선순위 |
---|---|---|
증감(++, --), 부호(+, -), 논리(!) | ← | 1 |
산술(*, /, %) | → | 2 |
산술(+, -) | → | 3 |
비교(<, >, <=, >=, instanceof) | → | 4 |
비교(==, !=) | → | 5 |
논리(&) | → | 6 |
논리(^) | → | 7 |
논리(|) | → | 8 |
논리(&&) | → | 9 |
논리(||) | → | 10 |
조건(?:) | → | 11 |
대입(=, +=, -=, *=, /=, %=) | ← | 12 |
먼저 연산을 수행하고 싶은 연산식이 있다면 괄호로 묶으면 된다.
괄호로 감싼 연산식이 우선순위 중 제일 높은 최우선순위를 갖으므로 제일 먼저 수행된다.
int var1 = 1;
int var2 = 3;
int var3 = 2;
int result = var1 + var2 * var3;
// var2 * var3
// var1
int result = (var1 + var2) * var3;
// var1 + var2
// * var3
피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
▪︎ 단항 연산자 : 부호, 증감 연산자
▪︎ 이항 연산자 : 산술, 비교, 논리 연산자
▪︎ 삼항 연산자 : 조건 연산자
boolean 타입과 char 타입을 제외한 기본 타입에 사용할 수 있다.
-
는 변수의 부호를 양수를 음수로, 음수를 양수로 바꾼다.
int x = -100;
int result1 = +x; // -100 (음수, +는 부호를 그대로 유지)
int result2 = -x; // 100 (양수, -는 부호를 변경)
부호연산
int 타입 이하의 정수는 int 타입으로 변환되므로 부호연산의 결과는 int 타입이다.
int 타입으로 변환된 값은 byte 타입에 저장할 수 없으므로 컴파일 에러가 발생한다.
byte value = 100;
byte result = -value; // 컴파일 에러 발생
int result = -value; // 올바른 작성법
boolean 타입을 제외한 모든 기본 타입인 피연산자에 사용 가능하다.
변수의 값을 1씩 증가하거나 1씩 감소시킨다.
증가 연산자(++)
피연산자 값에 1을 더하고, 그 결과를 다시 피연산자에 저장한다.
num = 5;
++num; // 6
감소 연산자(--)
피연산자 값에서 1을 빼고, 그 결과를 다시 피연산자에 저장한다.
num = 5;
--num; // 4
다른 연산자와 함께 사용
변수의 앞, 뒤에 사용할 수 있으나,
다른 연산자와 함께 사용하면 연산자의 위치에 따라 결과가 달라진다.
▪︎ 부호가 앞에 위치 : 값을 증가 또는 감소 후 연산을 수행
▪︎ 부호가 뒤에 위치 : 연산을 수행 후 값을 증가 또는 감소
int x = 1;
int resultX = ++x + 10; // 12
int y = 1;
int resultX = y++ + 10; // 11
피연산자 앞에 부호 (!)를 입력한다.
피연산자의 논리값을 반대로 변경하므로 boolean 타입에만 사용 가능하다.
true → false, false → true
조건문과 제어문에서 변수의 값을 부정(반대로)하여 실행 흐름을 제어할 수 있다.
boolean start = true;
start = !start; // !true → false
start = !start; // !false → true
나머지를 구하는 연산자를 제외하고는 사칙연산과 동일하다.
+
연산자의 피연산자 중 한 쪽이 문자열인 경우 결합 연산을 수행한다.
문자열과 숫자 값을 결합하면 숫자 값이 문자열로 자동 변환된다.
이 때, 숫자 + 숫자 + 문자열
인 경우 숫자의 연산을 수행 후 문자열과 결합된다.
String str1 = "JDK" 10 + 1; // "JDK101"
String str2 = 10 + 1 + "JDK"; // "11JDK"
두 피연산자를 비교하여 논리값(true 또는 false)을 산출한다.
조건문이나 반복문에서 실행의 흐름을 제어할 때 사용한다.
동등 비교 연산자는 모든 타입에 사용 가능하다.
크기 비교 연산자는 boolean 타입을 제외한 모든 기본 타입에 사용 가능하다.
int value1 = 7;
int value2 = 7;
boolean resultCompare = (value1 == value2); // true
boolean resultNotCompare = (value1 != value2); // false
boolean resultSmaller = (value1 < value2); // false
실수와 정수의 비교 연산
비교하기 전 int 타입의 변수가 자동으로 double 타입으로 변환된다.
int intValue = 1;
double doubleValue = 1.0;
System.out.println(intValue == doubleValue);
// true
float 타입과 double 타입의 비교 연산
실수 타입은 부동 소수점 방식으로 저장되는데,
정확하게 0.1를 저장할 수 없는 구조이다.
그렇기 때문에 double 타입을 float 타입으로 변환해야 한다.
double doubleValue = 0.1;
float floatValue = 0.1f;
System.out.println((double)floatValue); // 0.10000000149011612
System.out.println(doubleValue == floatValue); // false
System.out.println((float)doubleValue == floatValue); // true
피연산자의 타입이 동일하지 않은 경우
비교 대상이 다른 타입을 가지는 경우를 말한다.
float 타입과 double 타입
아래의 규칙에 따라 타입을 변환하여 두 타입을 일치시킨다.
▪︎ 피연산자 중 byte, short, char 타입 포함 : 모두 int 타입으로 자동 변환
▪︎ 피연산자 중 long 타입 포함 : 모두 long 타입으로 자동 변환
▪︎ 피연산자 중 실수 타입 포함 : 허용 범위가 큰 실수 타입으로 자동 변환
두 타입을 동일한 타입으로 선언하는 걸 권장한다.
논리값으로 연산을 수행, 피연산자의 타입은 boolean 타입만 사용 가능하다.
TRUE
는 참을 의미하고, FALSE
는 거짓을 의미한다.
사과는 과일이다. (참 = TRUE)
사과는 채소이다. (거짓 = FALSE)
AND(논리곱)의 &와 &&
▪︎ &
: 앞의 조건이 false여도 뒤의 조건을 검사한다.
사과는 과일이고(조건1 = TRUE) & 먹을 수 있다.(조건2 = TRUE) (참 = TRUE)
사과는 과일이고(조건1 = TRUE) & 먹을 수 없다.(조건2 = FALSE) (거짓 = FALSE)
▪︎ &&
: 앞의 조건이 false면 바로 false를 반환, 연산 속도가 & 보다 빠르다.
사과는 채소이고(조건1 = FALSE) && 먹을 수 있다. (FALSE)
OR(논리합)의 |와 ||
▪︎ |
: 앞의 조건이 true여도 뒤의 조건을 검사한다.
사과는 과일이고(조건1 = TRUE) | 먹을 수 없다.(조건2 = FALSE) (TRUE)
사과는 채소이고(조건1 = FALSE) | 먹을 수 없다.(조건2 = FALSE) (FALSE)
▪︎ ||
: 앞의 조건이 true면 바로 true를 반환, 속도면에서 유리하다.
사과는 과일이고(조건1 = TRUE) || 먹을 수 없다. (TRUE)
XOR (배타적 논리값)
▪︎ 연산자가 서로 다르면 TRUE
를 반환하고, 같으면 FALSE
를 반환한다.
사과는 과일이고(조건1 = TRUE) XOR 먹을 수 없다.(조건2 = FALSE) (TRUE)
사과는 과일이고(조건1 = TRUE) XOR 먹을 수 있다.(조건2 = TRUE) (FALSE)
NOT (논리 부정)
▪︎ TRUE
이면 FALSE
를 반환한다.
▪︎ FALSE
이면 TRUE
를 반환한다.
NOT 사과는 과일이다. (TRUE -> FALSE)
NOT 사과는 채소이다. (FALSE -> TRUE)
상황에 맞게 논리 연산자를 적절히 사용하면 성능 최적화를 기대할 수 있다.
오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 대입(저장)한다.
▪︎ 단순 대입 연산자 : 단순히 값을 저장한다.
▪︎ 복합 대입 연산자 : 연산을 수행 후 값을 대입(저장)한다.
int intValue1 = 10;
int intValue2 = 10;
int result1 = intValue1 += 3; // 10 += 3
int result2 = intValue2 -= 3; // 10 -= 3
System.out.println(result1); // 13
System.out.println(result2); // 7
3개의 피연산자가 필요하며, ?와 :(콜론)으로 조건식을 처리한다.
? 앞의 조건식에 따라
▪︎ :
앞 : 조건식이 true일 때의 결과값이 된다.
▪︎ :
뒤 : 조건식이 false일 때의 결과값이 된다.
(조건식) ? A(true) : B(false)
// 삼항 연산자
int score = 85;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
// if문으로 작성한 삼항 연산자
int score = 95;
char grade;
if (score > 90) {
// true
grade = 'A';
} else {
// false, 조건식
if (score > 80) {
// true
grade = 'B';
} else {
// false
grade = 'C';
}
}