Computer Science/Programming Language

[JAVA] 연산자- 이항연산자

BS Kwak 2020. 5. 28. 19:09

이항 연산자 

(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으로 채워짐)