기록해! 정리해!

자바 - 오버플로우, 연산자 , 확인문제 본문

JAVA

자바 - 오버플로우, 연산자 , 확인문제

zsuling 2022. 7. 5. 12:58

º 오버플로우

public static void main(String[] args) {
 int v1 = 1000000;
 int v2 = 1000000;
 
 int result1 = v1 * v2;
 long result2 = (long)v1 * (long)v2; //해결방법

   System.out.println(result1); // 오버플로우 발생
   System.out.println(result2); // 정상값
}

-- 오버플로우가 되는지 안되는지 미리 확인하는 법 (81p)

package test;

public class test78 {

public static void main(String[] args) {
 try{System.out.println("Integer.MAX_VALUE:" +Integer.MAX_VALUE);
     System.out.println("Integer.MIN_VALUE:" +Integer.MIN_VALUE);
 
 int result = safeAdd(2000,100);
 System.out.println(result);
 }catch(ArithmeticException e) {
 System.out.println("오버플로우가 발생하여 정확하게 계산할 수 없음");
 }catch(Exception e) { --순서를 바꾸면 안됨
 System.out.println("예외가 발생했습니다");
 }
}

public static int safeAdd(int left, int right) {
if((right>0)) { 

System.out.println("실행1");
if(left>(Integer.MAX_VALUE-right)) { //2147483647 -ex.1 = 2147483646보다 크면안됨

System.out.println("실행2");
throw new ArithmeticException("오버플로우 발생"); //throw:예외발생 new:객체생성 
}
 }else {

 System.out.println("실행3");
 if(left>(Integer.MIN_VALUE-right)) {

System.out.println("실행4");
    throw new ArithmeticException("오버플로우 발생");
 }
 }
return left + right;
}

}

 

-- 100 : 참이면 new ArithmeticException 가 발생하는 거임

-- 2147483647 

º 정확한 계산은 정수를 사용


public static void main(String[] args) {
int apple = 1;
double pieceUnit = 0.1;
int number = 7;

double result = apple - number*pieceUnit;

System.out.println("사과 한개에서");
System.out.println("0.7조각을 빼면, ");
System.out.println(result + "조각이 남는다.");
}
}

º  

Exception e : 다 됨

ArithmeticException e : 다른 연산에서는 실행이 안되고 연산 예외에서만 실행됨.

 

package test;

public class test78 {

public static void main(String[] args) {
try {
System.out.println("시작");
int z = 5 / 0;
System.out.println("결과:+z");

}catch(ArithmeticException e) {
System.out.println("0으로 나누면 안됨!");
System.out.println(e);
}finally {
System.out.println("프로그램 종료");
}
}
}

º  

isNaN(z)); //숫자가 아니면 참

isFinite(z)); // 유한 값이면 참
isInfinite(z)); //값이 무한대이면 참

package test;

public class test78 {

	public static void main(String[] args) {
		try {
			System.out.println("시작");
			double z = 5 / 1.5 ;
			System.out.println("결과값:" + z);
			System.out.println("결과:" + Double.isNaN(z)); //숫자가 아니면 참
			System.out.println("결과:" + Double.isFinite(z)); // 유한 값이면 참
			System.out.println("결과:" + Double.isInfinite(z)); //값이 무한대이면 참
			
		}catch(ArithmeticException e) {
			System.out.println("0으로 나누면 안됨!");
			System.out.println(e);
		}finally {
			System.out.println("프로그램 종료");
		}
	}
}

5를 0.0으로 나누니까 double z = 5 / 0.0;

값이 0 이 아니라 무한대로 찍힘

º  0과 0.0은 같을까요?

if (0 == 0.0) {
System.out.println("같다");

 

같다네...

 

double z = 5 / 0.0; //하지만 나누기에서 0과 0.0은 결과가 다르다

 

º  

package test;

public class test78 {

	public static void main(String[] args) {
		try {
			int z = 5;
			if (Double.isNaN(z) || Double.isInfinite(z)) {
				System.out.println("연산불가");
			}else {
				System.out.println(z+2);
			}
			System.out.println("결과:" + Double.isNaN(z)); //숫자가 아니면 참
			System.out.println("결과:" + Double.isFinite(z)); // 유한 값이면 참
			System.out.println("결과:" + Double.isInfinite(z)); //값이 무한대이면 참
			
		}catch(ArithmeticException e) {
			System.out.println("0으로 나누면 안됨!");
			System.out.println(e);
		}finally {
			System.out.println("프로그램 종료");
		}
	}
}

º  

package test;

import java.util.Scanner;

public class test78 {

	public static void main(String[] args) {
		try {
			@SuppressWarnings("resource")
		    Scanner	z = new Scanner(System.in);
			double z1 = z.nextDouble(); //실수가 아닌 값이 들어오면 에러발생		
			
			if (Double.isNaN(z1) || Double.isInfinite(z1)) {
				System.out.println("연산불가");
			}else {
				System.out.println(z1+2);
			}
			System.out.println("결과:" + Double.isNaN(z1)); //숫자가 아니면 참
			System.out.println("결과:" + Double.isFinite(z1)); // 유한 값이면 참
			System.out.println("결과:" + Double.isInfinite(z1)); //값이 무한대이면 참
			
		}catch(ArithmeticException e) {
			System.out.println("0으로 나누면 안됨!");
			System.out.println(e);
		}finally {
			System.out.println("프로그램 종료");
		}
	}
}

º  메모리의 주소공간이 같은지 , 다른지 물어보는 것

 

new 가 생기면 힙메모리가 올라와서 새 영역으로 생김

 

equlas를 가지고 기본적인 문자연산비교

package test;

public class test78 {

	public static void main(String[] args) {
		String str1 = "신용권";
		String str2 = "신용권";
		String str3 = new String("신용권");
		String str4 = new String("신용권");
		System.out.println(str3);
		
       if(str1 == str2) { // 변수는 값이 같으면 같은 공간을 사용
	        System.out.println("같다");
		}else {
			System.out.println("다르다");
		} 
        
		if(str3 == str4) { //주소 공간 비교
			System.out.println("같다");
		}else {
			System.out.println("다르다");
		}
		

		if(str3.equals(str4)) { //주소의 값을 비교
			System.out.println("같다");
		}else {
			System.out.println("다르다");
		}
	}
}

º 논리 연산자 && , || 

package test;

public class test78 {

	public static void main(String[] args) {
		
		int a = 20;
		int b = 10;
		
		if(a>=10 && b>=20){
		 System.out.println("참");
		}else {
		 System.out.println("거짓");	
		}
		
		if(a>=10 || b>=20){
			 System.out.println("참");
			}else {
			 System.out.println("거짓");	
			}
	}
}

º 삼항 연산자

참이면 ? 뒤에 있는게 실행 됨

package test;

public class test78 {

	public static void main(String[] args) {
		
		int score = 95;
		String grade = (score>=90) ? "합격" : "불합격" ;
		System.out.println(grade);
		
		int score2 = 80;
		String grade2 = (score2>=90) ? "수" : ((score2>=80) ? "우" : "미달" ) ;
		System.out.println(grade2);
	}
}

º  확인문제

 

2)

package test;

 

public class test78 {

 

public static void main(String[] args) {

int x = 10;

int y = 20;

int z = (++x) + (y--);

System.out.println(z);

}

}

 

: 31

 

3)

package test;

 

public class test78 {

 

public static void main(String[] args) {

 

int score = 85;

String result = (!(score>90))? "가":"나";

System.out.println(result);

 

}

 

}

:가

 

4)

package test;

 

public class test78 {

 

public static void main(String[] args) {

 

int pencils = 534;

int students = 30;

 

int pencilsPerStudent = ( #1 );

System.out.println(pencilsPerStudent);

 

int pencilsLeft = ( #2 );

System.out.println(pencilsLeft);

}

 

#1 : pencils/students

#2 : pencils%student

 

5)

package test;

public class test78 {

public static void main(String[] args) {
     int value = 356;
     System.out.println (value - (vlaue%300));
}

}

 

6)

package test;
public class test78 {
public static void main(String[] args) {

int LenghtTop =5 ;
int lenghtBottom = 10;
int height =7;
double area = (#1);
System.out.println (area);
}
}

 

#1 : ((double)lengthTop+lenghBottom/2) *7

 

7)

package test;

public class test78 {

public static void main(String[] args) {
int x = 10;
int y = 5;

System.out.println ( (x>7) && (y<=5) );    -------(true)
System.out.println ( (x%3 == 2) || (y%2 !=1));;     ------(false)
}

 

8)

package test;

public class test78 {

public static void main(String[] args) {

double x = 5.0;
double y =0.0;

double z = x % y ;

if(#1) {
System.out.println("0.0으로 나눌 수 없습니다.");
}else {
double result = z + 10;
System.out.println("결과: " + result);
}
}
}

 

#1 : Double.isNaN(z)

 

º  난수

package test;

public class test78 {
public static void main(String[] args) {
    for (int i=1; i<=10; i++) {
int r = (int) (Math.random()*10);
System.out.println(r);
}
}
}

º  

 

Comments