이항 연산자
(1) 산술연산자(+,-,*,/,%)
- 피연산자들이 모두 정수타입이고, int 타입(4 byte) 보다 크기가 작은 타입일 겨우 모두 int 타입으로 변환 후 연산 수행, 산출 타입은 int타입
public class ArithmeticOperator {
public static void main(String[] args) {
// TODO Auto-generated method stub
int v1 =5;
int v2 = 2;
int result1 = v1 + v2; //7
System.out.println("+ : "+result1);
result1 = v1 - v2; //3
System.out.println("- : "+result1);
result1 = v1 / v2; //2 2.5이지만 int형이므로
System.out.println("/ : "+result1);
result1 = v1 * v2; //10
System.out.println("* : "+result1);
result1 = v1 % v2; // 1
System.out.println("% : "+result1);
double result2 = (double)v1 /v2; //2.5
System.out.println("double, / : "+ result2);
}
}
public class CharOperationExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
char c1 = 'A' +1; // 'A'는 유니코드 65
char c2 = 'A';
//char c3 = c2 + 1; //컴파일에러
// c2가 int타입으로 변환되고 1과 연산되기 때문에 산출타입이 int타입이 되므로 char타입변수 c3에 대입불가
char c3 = (char)(c2+1);
System.out.println(c1); //B
System.out.println(c2); //A
System.out.println(c3); //B
}
}
- 부동소수점 타입 (float,double)은 0.1을 정확히 표현 X, 근사치로 처리
-> 정확한 계산 필요 : 정수연산으로 변경해서 계산
public class AccuracyExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int apple = 1;
double pieceUnit = 0.1;
int totalPieces = apple*10;
int number =7;
double result1 = apple - number*pieceUnit; //부동소수점타입사용
System.out.println("사과한개에서 0.7조각을 빼면 "+result1+"조각이 남는다.");
// 0.29999999999999993
int temp = totalPieces - number; //부동소수점 타입 사용X
double result2 = temp/10.0;
System.out.println("사과한개에서 0.7조각을 빼면 "+result2+"조각이 남는다.");
// 0.3
}
}
- NaN과 Infinity 연산
5 / 0 : ArithmeticException 예외 발생
5 % 0 : ArithmeticException 예외 발생
5 / 0.0 : Infinity(무한대) 값 가짐
5 % 0.0 : NaN(Not a Number)을 가짐
- Double.isIfinite() 와 Double.isNaN() 메소드 : /와 %의 결과가 Infinity, NaN인지 확인(true/false 리턴)
public class InfinityAndNaNCheck {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x=5;
double y=0.0;
double z1 = x/y; //Infinity
double z2 = x%y; //NaN
System.out.println(Double.isInfinite(z1));
System.out.println(Double.isNaN(z1));
System.out.println(z1+2);
System.out.println(Double.isInfinite(z2));
System.out.println(Double.isNaN(z2));
System.out.println(z2+2);
}
}
(2) 문자열 연결 연산자(+) : 피연산자 중 하나가 문자열이면 다른 피연산자를 문자열로 변환 후 결합
public class StringConcatExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = "JDK" + 3.0 + 3;
String str2 = 3.0 + 3 + "JDK"; //3.0 + 3 이 먼저 연산되고 "JDK"와 연산
System.out.println(str1); //JDK3.03
System.out.println(str2); //6.0JDK
}
}
(3) 비교 연산자 (<, <=, >, >=, ==, !=) : boolean 타입인 true/false 산출
- 피연산자가 char타입이면 유니코드 값으로 비교연산 수행
public class CompareOperator {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num1 = 15;
int num2 = 10;
boolean result1 = (num1 == num2);
boolean result2 = (num1 != num2);
boolean result3 = (num1 <= num2);
System.out.println("result1 = "+ result1);
System.out.println("result2 = "+ result2);
System.out.println("result3 = "+ result3);
char c1 = 'A';
char c2 = 'B';
boolean result4 = (c1<c2); //65 < 66
System.out.println("result4 = " + result4 );
}
}
- 부동소수점 타입의 경우, 0.1을 정확히 표현 X
0.1 == 0.1f -> false
피연산자 타입을 모두 float으로 강제 타입변환한 후 비교연산/ 정수로 변환한 후 비교연산
public class CompareOperatorEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
int v2=1;
double v3 = 1.0;
System.out.println(v2==v3); //true
double v4 =0.1;
float v5 = 0.1f;
System.out.println(v4 == v5); //false
System.out.println((float)v4 == v5); //true
System.out.println((int)(v4*10) == (int)(v5*10)); //true
}
}
- 문자열 비교 : equals() 메소드
public class StringEquals {
public static void main(String[] args) {
// TODO Auto-generated method stub
String strVar1 = "kwak";
String strVar2 = "kwak";
//strVar1 과 strVar2 는 동일한 String 객체를 참조하므로 동일한 String객체의 번지값을 갖고있음
System.out.println(strVar1==strVar2); //true
String strVar3 = new String("kwak");
// strVar3는 객체생성 연산자인 new로 생성한 새로운 String객체의 번지값을 갖고있음
System.out.println(strVar1==strVar3); //false
System.out.println(strVar1.equals(strVar3)); //true
}
}
(4) 논리 연산자 (&&, || , & , |, ^ , !)
- 논리곱(&&) , 논리합(||), 배타적논리합(^), 논리부정(!) 연산 수행
- 피연산자 : boolean타입만 사용 가능
AND(논리곱) | && 또는 & | 피연산자 모두가 true일경우에만 연산 결과 true |
OR(논리합) | || 또는 | | 피연산자 중 하나만 true이면 연산 결과는 true |
XOR(배타적논리합) | ^ | 피연산자가 하나는 true이고 다른하나가 false일 때 연산결과는 true |
NOT(논립정) | ! | 피연산자의 논리값을 바꿈 |
- && vs &
&& : 앞의 피연산자가 false 이면 바로 false 산출
& : 두 피연산자 모두 평가해서 산출
- || 도 동일
(5) 비트연산자 (&, |, ^, ~, >>, << , >>>)
- 데이터를 비트(bit)단위로 연산
- 0,1이 피연산자
- 비트논리연산자(&, |, ^, ~) , 비트이동연산자(>>, << , >>>)
AND(논리곱) | & | 두 비트 모두 1일 경우에만 연산결과 1 |
OR(논리합) | | | 두 비트 중 하나만 1이면 연산결과 1 |
XOR(배타적논리합) | ^ | 두 비트 중 하나는 1, 다른 하나는 0일경우 연산결과 1 |
NOT(논리 부정) | ~ | 보수 |
a << b | 정수 a 의 각 비트를 b 만큼 왼쪽으로 이동( 빈자리 : 0으로 채워짐) |
a >> b | 정수 a 의 각 비트를 b 만큼 오른쪽으로 이동( 빈자리 : 정수 a의 최상위 부호 비트(MSB)와 같은 값으로 채워짐) |
a <<< b | 정수 a 의 각 비트를 b 만큼 오른쪽으로 이동( 빈자리 : 0으로 채워짐) |
'Programming Language > Java' 카테고리의 다른 글
[JAVA] 제어문 (0) | 2020.05.30 |
---|---|
[JAVA] 연산자 - 삼항연산자 (0) | 2020.05.28 |
[JAVA] 연산자- 단항연산자 (0) | 2020.05.26 |
[JAVA] 타입변환 (0) | 2020.05.25 |
[JAVA] 데이터 타입 (0) | 2020.05.21 |