1) 산술 연산자 : + - * / %
2) 비교 연산자 : > < >= <= == !=
3) 논리 연산자 : && || !
4) 대입 연산자 : =
5) 기타 : (type)- 형변환 ?:- 3항연산자 instanceof
1) 산술>비교>논리>대입 (대입이 제일 마지막)
2) 단항(1) > 이항(2) > 삼항(3)
3) 대입, 단항연산자만 오른쪽에서 왼쪽으로(ex. x=y=3)/ 나머지는 왼쪽에서 오른쪽으로
증가연산자 (++)
감소연산자 (--)
int i=5, j=0;
j = i++; //i=6, j=5
int i=5, j=0;
j = ++i; //i=6, j=6
(-) : 피연산자의 부호를 반대로 변경
+, -, *, /, %(나머지)
int a =10;
int b = 4;
System.out.printf("%d / %d = %d%n", a, b, a/b); // 10/4 = 2
// 올바른 연산결과를 위해서는 어느 한 쪽을 실수형으로 형변환하기
System.out.printf("%d / %f = %f%n", a, (float)b, a/(float)b); // 10/4.000000 = 2.500000
연산 전에 피연산자의 타입을 일치시키는 것 (이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능~)
1) 두 피연산자의 타입을 일치시킨다. 보다 큰 타입으로 일치 (값손실 최소화)
ex. long + int -> long
float + int -> float
double + float -> double
2) 피연산자의 타입이 int보다 작은 타입(byte, short, char)이면 int로 변환.
ex. byte + short -> int
char + short -> int
byte a = 10;
byte b = 20;
byte c = a+b; //컴파일 에러가 발생함. 명시적 형변환 필요
// a+b는 int형으로 변환한 다음 연산을 수행하기 때문
byte c = (byte)(a+b);
Math.round() 활용
double pi = 3.141592;
double shortPi = Math.round(pi*1000) / 1000.0; // 소수점 넷째자리에서 반올림하기
Math.round(pi*1000)/1000.0
> Math.round(3.141592*1000)/1000.0
> Math.round(3141.592)/1000.0
>3142/1000.0
>3.142
System.out.println(shortPi);
--> 3.142
만약 3.141을 도출하고 싶다면?
double pi = 3.141592;
System.out.println((int)(pi*1000)/1000.0);
--> 3.141
- 오른쪽 피연산자로 나누고 남은 나머지를 반환.
나누는 피연산자는 0이 아닌 정수만 허용 (부호는 무시됨)
int x = 10;
int y = 8;
System.out.printf("%d을 %d로 나누면, %n", x, y);
System.out.printf("몫은 %d이고, 나머지는 %d입니다.%n", x/y, x%y);
// 출력 10을 8로 나누면,
// 몫은 1이고, 나머지는 2입니다.
종류 : >, <, >=, <=, ==, !=
두 연산자를 비교하는 데 사용되는 연산자
참이면 true, 거짓이면 false
문자열 비교에는 ==대신 equals()를 사용해야 함.
대소문자 구분X : equalsIgnoreCase()
&& (AND결합) 양쪽 모두 true여야 true
|| (OR결합) 어느 한 쪽이 true면 true (만약 앞의 조건이 true면 뒤의 조건을 굳이 연산하지 않음.)
int a = 5;
int b = 3;
boolean c = a>b;
boolean d = a==b;
c = (a>b)||(--a>b); // 앞에 것이 true이기 때문에 뒤의 것이 연산되지 않은 채로 출력됨.
System.out.println(a+":" +b); // 출력 5:3
c = (a<b)||(--a>b);
System.out.println(a+":"+b); // 출력 4:3
int a = 5;
int b = 3;
d = (a>b) && (a>(++b));
System.out.println(a+":"+b); // 출력 5:4
// i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
( i%2==0 || i%3==0 ) && (i%6!=0)
// 문자 ch는 숫자('0'~'9')이다.
'0'<=ch && ch<='9'
// 문자 ch는 대문자 또는 소문자이다.
('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z')
! : true를 false로, false는 true로 바꾼다.
boolean b = true;
!!b -> !!true -> !false -> true
//문자 ch가 소문자가 아니다.
!('a'<=ch && ch<='z')
오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
- lvalue (왼쪽 피연산자) : 저장공간. 변수, 배열
(반드시 값을 변경할 수 있는 것이어야 함!!! >> 상수, 리터럴X)- rvalue (오른쪽 피연산자) : 변수, 식, 상수 모두 가능
int i = 0;
3 = i+3; //에러. lvalue가 값을 저장할 수 있는 공간이 아님.
i+3 = i; //에러. lvalue의 연산결과가 리터럴
final int MAX = 3;
MAX = 10; //에러. 상수에 새로운 값 저장불가.
대입 연산자와 다른 연산자를 하나로 축약
i +=3; //i=i+3;
i -=3; //i=i-3;
i *=3; //i=i*3;
i /=3; //i=i/3;
i %=3; //i=i%3;
i <<=3; //i = i<<3;
i >>=3; //i = i>>3;
i &=3; // i = i&3;
i ^=3; // i = i^3;
i |=3; // i = i|3;
i *= 10+j; //i= i*(10+j);
형변환(casting) : 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
방법 : (타입)피연산자
double d = 85.4;
int score = (int)d;
int score = (int)85.4;
int score = 85;
System.out.println(score); // 85
System.out.println(d); // 85.4
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다.
byte > short/char > int > long > float > double
반대 방향으로의 변환은 반드시 형변환 연산자 사용!
float f = 1234; //(1234는 int, float타입의 변수는 1234를 저장하는데 아무런 문제가 없으므로 편의상 생략 가능)
int i = 3.14f; //(에러 incompatible types: possible lossy conversion from float to int) 값 손실 발생
byte b = 100; //(OK. byte타입의 범위 -128~127 안에 있기 때문에)
(조건식) ? 참일 때 : 거짓일 때
조건식의 결과에 따라 연산결과를 달리한다.
result = (x>y) ? x : y ;
// (x>y)가 true면 x가 result, false면 y가 result
//-> if문으로 바꾸면
if(x>y)
result = x;
else
result = y;
// 3항연산자를 여러번 쓸 수 있기도 함.
result = (score>90) ? "A" : (score>80)
? "B" : (score>70)
? "C" : (score>60)
? "D" : "F";