본문 바로가기

카테고리 없음

[java] 이것이 자바다 ch3 연산자

728x90
반응형

연산자는 종류가 좀 많아서 제가 이전에 작성했던 블로그 링크를 아래 두겠습니다.

 

https://bobo12.tistory.com/10

 

[java]연산자

1. 연산자의 종류와 우선순위 연산자는 특정한 연산을 수행하기 위해 사용하는 기호입니다. 연산자를 한 줄에 여러개를 사용해도 우선 적용되는 순서가 있습니다. 연산자 우선순위 종류 연산자

bobo12.tistory.com

 

예제로 다뤄볼게요!!

 

 

◎ 부호/ 증감 연산자를 이용한 예제 학습 


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 = 127


public 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이면 콜론 뒤의 피연산자가 선택됩니다.

 

 

◎ 연산 수행 순서

   ▷ 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선입니다. &&보다는 >, <가 우선순위가 높습니다.

   ▷ 우선 순위가 같은 연산자의 경우 대부분 왼쪽에서부터 오른쪽으로(→) 연산을 수행합니다.

 

 

 

이렇게 연산자에 대해서 한 번 더 다뤄보았습니다.

 

저번에 했었던 주소는 글의 맨 윗부분에 올려두었으니 한 번 비교해보시면 될 것 같아요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형