연산자의 순서를 생각 해봤을 때 괄호 안 사칙연산 먼저 그 다음 곱셈 그다음 =
true
조금 더 명확하게 표현식을 적어주는 것이 좋음.
구분 | 연산자 | 비고 | |
---|---|---|---|
결과가 boolean | 숫자 비교 연산자 | <, <=, >, >= | |
숫자 동등 연산자 | ==, != | ||
결과가 int 혹은 long | 기본 사칙 연산자 | +, -, *, /, % | %는 나머지 연산 (ex. 10%3=1) |
증감 연산자 | ++, -- | 단항 연산자 | |
비트 연산자 | &, | , ^, ~, <<, >>, >>> |
조건문에서 논리 연산자로 많이 사용
&& (=&, AND)
|| (=|, OR) |
| 기타 연산자 | 삼항 연산자 | ? : | |
| | 형 변환 연산자 | (타입) | 캐스팅 |
| | 문자열 더하기 연산자 | + | |
연산자 분류는 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분
단항 연산자 : ++x;
이항 연산자 : x + y;
삼항 연산자 : (sum > 90) ? "A" : "B"; // 앞의 식이 true일때 A false일때 B
연산식은 하나의 값을 산출
// 해당 연산식의 처리 순서
x > 0 && y < 0 // > < && 순으로 처리
// [AND 연산자]
// true && true = true
// true && false = false
// false && true = false
// false && false = false
a = b = c = 5;
// 위에 int a; int b; int c;가 쓰여져 있다는 가정 하에
// 첫번째로 연산될 등호는 c = 5; 그 다음은 b, 그 다음은 a순으로 실행.
연산자 | 연산 방향 | 우선 순위 | |
---|---|---|---|
증감(++, --), 부호(+, -), 비트(~), 논리(!) | ← | 높음 | |
산술(*, /, %) | → | ||
산술(+, -) | → | ||
쉬프트(<<, >>, >>>) | → | 처리 속도가 빠름 | |
비교(<, >, <=, >=) | → | ||
비교(==, !=) | → | ||
논리(&) | → | ||
논리(^) | → | ||
논리( | ) | → | |
논리(&&) | → | ||
논리( | ) | → | |
조건(?:) | → | ||
대입(=, +=, -=, *=, /=, %=, &=, ^=, …) | ← | 낮음 |
int x;
int y;
int result = x++ + y--;
//이 경우에는 x++ 먼저 그 다음 y-- 그 다음 + 그 다음 =
피연산자가 하나뿐인 연산자
부호 연산자, 증감 연산자, 논리 부정 연산자, 비트 반전 연산자가 있음.
+,- 변수 값의 부호를 유지하거나 바꾸기 위해 사용하기도 함.
++,— 변수 값을 1 증가 시키거나 1 감소 시키는 연산자
boolean타입을 제외한 모든 기본 타입의 피연산자에 사용 가능
연산식 | 설명 | 예시) int x = 5; |
---|---|---|
++피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 | int reslult = ++x; // x = 6 |
--피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 | |
피연산자++ | 값을 먼저 읽어온 후에 피연산자의 값을 1 증가시킴 | int reslult = x++; // x = 5 |
피연산자-- | 값을 먼저 읽어온 후에 피연산자의 값을 1 감소시킴 |
전위 연산자는 먼저 증가나 감소를 하고 후위 연산자는 선언시에는 변화없고 그 후에 증가나 감소를 함.
실습
// 단항연산자 - 감소 후위 연산자
int x = 5;
int result = x--;
System.out.println(result); // 연산의 결과, x-- 즉 연산이 되지 않은 상태
System.out.println(x); // 연산이 끝난 상태.
// 단항연산자 - 감소 전위 연산자
int x = 14;
int result = --x;
System.out.println(result); // 연산의 결과, --x 즉 연산이 끝난 상태
System.out.println(x); // 연산이 끝난 상태.
// 단항연산자 - 증감 전/후위 연산자
int x = 14;
int result = --x;
System.out.println(result); // 연산의 결과, --x 즉 연산이 끝난 상태
System.out.println(x++); // 연산이 끝난 상태. 여기서 x는 13
System.out.println(x); // 여기서 x는 14
// 단항연산자 - 증감 전/후위 연산자
int x = 5;
int result = x++ + 3;
System.out.println(result); // 8
System.out.println(x); // 6
//예제
public class IncreaseDecreaseOperatorExample {
public static void main(String[] args){
int x = 10;
int y = 10;
int z;
System.out.println("----------------------");
x++; // 10
++x; // ++11 // 즉, 12
System.out.println("x=" + x); // 12
System.out.println("----------------------");
y--; // 10
--y; // --9 // 즉, 8
System.out.println("y=" + y); // 8
System.out.println("----------------------");
z = x++; // 12
System.out.println("z=" + z); // 13 -> 틀림. 정답은 12. z는 연산 되지않고 바로 읽어내서
System.out.println("x=" + x); // 13
System.out.println("----------------------");
z = ++x; // 14
System.out.println("z=" + z); // 14
System.out.println("x=" + x); // 14
System.out.println("----------------------");
z = ++x + y++; // 15 + 8 = 23
System.out.println("z=" + z); // 23
System.out.println("x=" + x); // 15
System.out.println("y=" + y); // 9
}
}
! not 이라는 뜻. 연산자를 부정시킨다.
즉 true를 false로, false를 true로 변경시킨다. 그렇기 때문에 boolean 타입에만 사용 가능.
조건문, 제어문에서 사용되어 조건식의 값을 부정할 때 사용.
!true = false; !false = true;
가독성은 좋진 않음. 부정식을 작성해서 사용하는 것을 지향.
피연산자가 두 개인 연산자
산술 연산자 | 설명 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 나머지 |
// 이항연산자 - 산술 연산자
int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3
System.out.println(a % b); // 1
int result = a % b; // 변수로 담을 수도 있음.
만약 피연산자들의 타입이 다를 경우
→ 대체로 피연산자 중에 크기가 더 큰 타입으로 자동 변환 되어 연산
피연산자들이 모두 int보다 크기가 작을 경우 int로 변환 후 연산
byte x = 45;
byte y = 67;
int result = x + y; // 여기서 x 와 y 가 자동 형변환(int)되서 계산됨, 이때 타입을 byte로 하고 싶으면 캐스팅을 해주어야 한다
System.out.println(result); // 112
피연산자 중에 long 타입이 있을 경우 모두 long으로 변환 후 연산
피연산자 중에 float 혹은 double 타입이 있을 경우 크기가 큰 실수 타입으로 변환 후 연산
int + float 를 int로 받으면 오류
int로 받고 싶을 땐 캐스팅을 해준다.
캐스팅 방식에 따라 계산 되는 식
//캐스팅에 따라 값이 달라질 수 있는 예시
int x1 = 51;
double x2 = 50.34;
int result1 = (int)(x1-x2);
int result2 = x1-(int)x2;
System.out.println(result1); // 0
System.out.println(result2); // 1
//예시2
int a = 10;
int b = 4;
int c = a / b; // 2
double d = a / b; // 2.0
double e = (double)a / b; // 2.5
저장할 수 있는 범위를 초과하면 엉뚱한 값이 나옴.
int a = 1000000;
int b = 1000000;
int c = a * b;
System.out.println(c); // -727379968
// 해당 내용은 long으로 바꾸면 해결 가능
실수 타입 연산 중에 발생. 해당 값이 보이면 오류.
public class NaNInfinitySample {
public static void main(String[] args) {
double a = 10;
double b = 0;
System.out.println(a / b); // Infinity
System.out.println(a % b); // NaN
Double.isInfinite(a/b); // true
Double.isNaN(a%b); // true
// is~ 메서드는 결과가 boolean으로 나옴.
System.out.println(Double.isInfinite(a/b));
System.out.println(Double.isNaN(a%b));
}
}
피연산자 중 한쪽이 문자열이면 + 연산자는 문자열 연결 연산자로 사용되어 문자열을 결합
System.out.println("Hello" + 123 + 456); //Hello123456
System.out.println(123 + 456 + "Hello"); //579Hello
피연산자들을 비교하여 boolean 타입인 true, false를 산출
크기 비교
연산식 | 설명 |
---|---|
A > B | A가 B보다 큰 지 검사 |
A >= B | A가 B보다 크거나 같은지 검사 |
A < B | A가 B보다 작은 지 검사 |
A <= B | A가 B보다 작거나 같은지 검사 |
동등 비교
연산식 | 설명 |
---|---|
A == B | A와 B가 같은지 검사 |
A != B | A와 B가 다른지 검사 |
// 피연산자가 char 타입이면 유니코드 값으로 비교 연산
('A' < 'B') -> (65 < 66)
// char 타입과 int 타입을 비교할 때는 int로 타입을 일치시킨 후 비교
'A' == 65 // true
10 == 10.0 // true (int타입인 10을 double 타입인 10.0으로 변환 후 비교)
0.1 == 0.1f // false, 0.1f는 0.1의 근사 값이(예를 들어 0.100000000149와 같은 값) 되기 때문에
(float)0.1 == 0.1f // true
(int)(0.1 * 10) == (int)(0.1f * 10) // true
// String 타입의 문자열은 대소 비교를 할 수 없고, 동등 비교는 할 수 있는데 이때도 주의 해서 확인.
// .equals() 메서드 사용하여 동등 비교 진행!!
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1.equals(str3)); // true
조건식을 연결하거나 비교할 때 사용.
피연산자는 boolean 타입만 사용 가능.
피연산자가 모두 true일 경우에만 결과가 true
x | y | x && y |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
피연산자 중 하나만 true이면 결과는 true
x | y | x |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
피연산자가 하나는 true이고 다른 하나는 false일 경우에만 결과가 true
연산식 | 결과 |
---|---|
true ^ true | false |
true ^ false | true |
false ^ false | false |
피연산자의 논리 값을 바꿉니다.
연산식 | 결과 |
---|---|
!true | false |
!false | true |
// x는 5보다 크고 13보다 작다
x > 5 && x < 13
// i는 2의 배수 또는 3의 배수이다.
i % 2 = 0 || i % 3 = 0
비트(bit, binary digit) : 1과 0으로 구성 되어있는 정보의 최소단위.
// 10진수의 연산을 2진수의 연산으로 변환하는 연습
// 16을 2로 나눈다음 나온 숫자로 조합
16 -> 10000
비트 논리 연산자에는 &, |, ^, ~
&, |, ^ 연산자는 피연산자가 boolean이면 일반 논리 연산자이고, 피연산자가 정수이면 비트 논리 연산자로 동작.
x | y | x & y | x | y |
---|---|---|---|---|
1 (true) | 1 (true) | 1 (true) | 1 (true) | 0 (false) |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
이진수
01111 : 15
11110 : 30
논리합
01111 | 11110 == 11111
배타적 논리합
01111 ^ 11110 == 10001
논리부정 (단항연산)
~01111 == 10000
~11110 == 00001
int x = 15;
int y = 30;
System.out.println(x & y); // 14 // 1110 // 2의 3승 + 2의 2승 + 2의 1승 (1이 있는 자리 뒤 숫자 갯수 만큼 승으로 올려주면 됨)
System.out.println(x | y); // 31 // 11111 // 2의 4승 + 2의 3승 + 2의 2승 + 2의 1승 + 2의 0승 즉 16 + 8 + 4 + 2 + 1
System.out.println(x ^ y); // 17
System.out.println(x >>> y); // 0
System.out.println(~x); // -16
연산식 | 결과 |
---|---|
a << b | 정수 a의 각 비트를 b만큼 왼쪽으로 이동 (빈자리는 0으로 채워짐) |
a >> b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 최상위 부호 비트(MSB)와 같은 값으로 채워짐) |
a >>> b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동시키며, 새로운 비트는 전부 0으로 채워짐 |
num1 * 2 == num1 << 1 (성능이 훨씬 좋음) 10000 = 16
num1 * 4 == num1 << 2 (성능이 훨씬 좋음) 100000 = 32
음수를 이진법으로 바꾸는법
예) -8의 2진수
세 개의 피연산자가 있는 연산자
public class Example {
public static void main(String[] args) {
int score = 95;
char grade = (score > 90) ? 'A' : 'B';
System.out.println("당신의 학점은 : " + grade);
}
}
// 삼항연산자를 풀어서 쓰면
char grade;
if (score > 90){
grade = 'A'
} else {
grade = 'B'
}
데일리퀴즈 1
(num % 2 == 0) ? “짝수” : “홀수”;
정답
데일리퀴즈 2
int a = 1;
int b = 2;
//값이 같다면 a 반환
int result = (a >= b) ? a : b;
System.out.println(result)
if (a >= b){
result = a;
} else {
result = b;
}
데일리퀴즈3
int score = 60;
if (score >= 60) {
result = "합격";
} else {
result = "불합격";
}
System.out.println(result)