연산자는 종류가 좀 많아서 제가 이전에 작성했던 블로그 링크를 아래 두겠습니다.
예제로 다뤄볼게요!!
◎ 부호/ 증감 연산자를 이용한 예제 학습
public class ScannerExample { public static void main(String[] args) { int x = 10; int y = 10; int z; x++; // 11 ++x; // 12 System.out.println("x = " + x); // x = 12 System.out.println("-----------------"); y--; // 9 --y; // 8 System.out.println("y = " + y); // y = 8 System.out.println("-----------------"); z = x++; // z = 12, x = 13 System.out.println("z = " + z); System.out.println("x = " + x); System.out.println("-----------------"); z = ++x; // z = 14, x = 14 System.out.println("z = " + z); System.out.println("x = " + x); System.out.println("-----------------"); z = ++x + y++; // x = 15, z = 15 + 8 = 23, y = 9 System.out.println("z = " + z); System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("-----------------"); System.out.println("z = " + -z); System.out.println("x = " + -x); System.out.println("y = " + -y); } } // 출력 : // x = 12 // ----------------- // y = 8 // ----------------- // z = 12 // x = 13 // ----------------- // z = 14 // x = 14 // ----------------- // z = 23 // x = 15 // y = 9 // ----------------- // z = -23 // x = -15 // y = -9
◎ 산술 연산자 사용 예제
public class ArithmeticOperatorExample { public static void main(String[] args) { byte v1 = 10; byte v2 = 4; int v3 = 5; long v4 = 10L; int result = v1 + v2; // int 대신 byte로 사용하면 안됨 System.out.println("result : " + result); // int = byte + byte long result2 = v1 + v2 - v4; // long = byte + byte - long System.out.println("result2 : " + result2); double result3 = (double)v1 / v2; // double = double / byte System.out.println("result3 : " + result3); int result4 = v1 % v2; // int = byte % byte System.out.println("result4 : " + result4); } } // 풀이 : // result : 14 // result2 : 4 // result3 : 2.5 // result4 : 2
◎ 오버플로우와 언더플로우
▷ 오버플로우 : 타입이 허용하는 최대값을 벗어나는 것
▷ 언더플로우 : 타입이 허용하는 최소값을 벗어나는 것
byte는 -128~127까지 지정 가능합니다.
byte a = 127; a = a + 1; 이면 결과는 -128이 출력됩니다.
byte b = -128; b = b - 1; 이면 결과는 127이 출력됩니다.
0(+), 1(-)
+127 = 0111 1111
-128 = 1000 0000
그럼 -127은?
10000000 = -128
10000001 = -127
~
111111111 = -1
00000000 = 0
00000001
~
01111111 = 127public class OverflowUnderflowExample { public static void main(String[] args) { byte var1 = 125; for(int i=0; i<5; i++) { var1++; System.out.println("var1 : " + var1); } System.out.println("---------------------"); byte var2 = -125; for(int i=0; i<5; i++) { var2--; System.out.println("var 2 :" + var2); } } }
◎ 정수 연산
▷ 산술 연산을 정확하게 계산하려면 실수 타입을 사용하지 않는 것이 좋습니다.
◎ 실수로 계산했을 때 정확한 값이 나타나지 않는 예제
public class AccuracyExample2 { public static void main(String[] args) { int apple = 1; double pieceUnit = 0.1; int number = 7; double result = apple - number * pieceUnit; System.out.println("사과 1개에서 남은 양 : " + result); } } //출력 : // 사과 1개에서 남은 양 : 0.29999999999999993
◎ 정수로 계산했을 때 정확한 값이 나타나는 예제
public class AccuracyExample { public static void main(String[] args) { int apple = 1; int totalPiece = apple * 10; int number = 7; int result = totalPiece - number; System.out.println("10조각에서 남은 조각 : " + result); System.out.println("사과 1개에서 남은 양 : " + result / 10.0); } } // 출력 : // 10조각에서 남은 조각 : 3 // 사과 1개에서 남은 양 : 0.3
◎ 나눗셈 연산 후 NaN과 Infinity 처리(나눗셈 연산에서 예외 방지하기)
▷ 나눗셈(/) 또는 나머지(%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 ArithmeticException 발생
▷ 좌측 피연산자가 실수이거나 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 됩니다.
5 / 0.0 → Infinity
5 % 0.0 → NaN
▷ Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 안됩니다.
▷ Double.isInfinite()와 Double.isNaN()을 사용해 / 와 % 연산의 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋습니다.
◎ 예외 방지 예시
public class InfinityAndNaNCheckExample { public static void main(String[] args) { int x = 5; double y = 0.0; double z = x / y; // double z = x % y; if(Double.isInfinite(z) || Double.isNaN(z)) { System.out.println("값 산출 불가"); } else { System.out.println(z + 2); } } } // 출력 : // 값 산출 불가
◎ 비교 연산자
▷ 동등(==, =!) 또는 크기(<, <=, >, >=)를 평가해서 boolean 타입인 true/false를 산출합니다.
▷ 흐름 제어문인 조건문(if), 반복문(for, while)에서 실행 흐름을 제어할 때 주로 사용합니다.
▷ 문자열을 비교할 때는 동등(==, !=) 연산자 대신 equals()와 !equals()를 사용합니다.
◎ 논리 연산자
▷ 논리곱(&&, AND), 논리합(||, OR), 배타적 논리합(^, XOR) 그리고 논리 부정(!) 연산을 수행합니다.
▷ 흐름 제어문인 조건문(if), 반복문(for, while) 등에서 주로 이용합니다.
◎ 비트 논리 연산자
▷ bit 단위로 논리 연산을 수행, 0과 1이 피연산자가 됩니다.
▷ byte, short, int, long만 피연산자가 될 수 있고, float, double은 피연산자가 될 수 없습니다.
◎ 비트 이동 연산자
▷ 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행합니다.
1 << 3 → 1000 = 8
8 >> 3 → 1
8 >> 4 → 0(초과하면 숫자를 버립니다.)
15 >>> 3 → 0001 = 1
◎ 대입 연산자
▷ 우측의 값을 좌측 피연산자인 변수에 대입합니다. 우측 피연산자에는 리터럴 및 변수, 다른 연산식이 올 수 있습니다
▷ 단순히 값을 대입하는 단순 대입 연산자와 정해진 연산을 수행한 후 결과를 대입하는 복합 대입 연산자가 있습니다.
◎ 삼항 연산자
▷ 총 3개의 피연산자를 가집니다.
▷ ? 앞의 피연산자는 boolean 변수 또는 조건식. 이 값이 true이면 콜론(:) 앞의 피연산자가 되고, false이면 콜론 뒤의 피연산자가 선택됩니다.
◎ 연산 수행 순서
▷ 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선입니다. &&보다는 >, <가 우선순위가 높습니다.
▷ 우선 순위가 같은 연산자의 경우 대부분 왼쪽에서부터 오른쪽으로(→) 연산을 수행합니다.
이렇게 연산자에 대해서 한 번 더 다뤄보았습니다.
저번에 했었던 주소는 글의 맨 윗부분에 올려두었으니 한 번 비교해보시면 될 것 같아요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~