본문 바로가기
Development (국비 복습 )/자바

[2023-03-14]연산자,캐스팅

by Puddingforever 2023. 3. 14.

x + x = n 

x:피연산자 

+:연산자

정수가 기본으로 메모리에 저장될 때는 int를 기준으로 저장됨

실수가 기본으로 메모리에 저장될 때는 double을 기준으로 저장됨 

 

1.타입이 int 보다 작은 경우,  int로 자동변환된다

byte + byte =>  int + int

2. 타입이 int보다 큰 경우, 큰 타입으로 자동변환된다. 

short + long => long + long

3. 반면 float 는 int보다 많은 수를 담을 수 있기에 float유지된다.

float + float = > float + float

4.float 과 double 중에 double이 크기 때문에 double로 변환

float + double => double + double

 

[에러케이스]

byte x = -100; 
byte result = 0;

result = -x; // byte * byte = int 
result = +x // byte * byte = int

result는 byte 타입인데 결과는 int라서 에러가 난다. 

 

double범위는 int보다 크기 때문에 에러가 안난다

byte x = -100;
double result = 0.0;
result = +x; // byte + byte = int 이지만 double이 더 크기 때문에 에러가 안남

int 처리된 것을 막으려면 casting을 해준다.

byte x = -100;
byte result = 0;

result = -x ; //에러 int 값이라서
result = (byte)-x; // 강제 타입 변환

 

 

결론 큰 타입에서 작은 타입으로 가려고 하면  항상 casting을 해준다. (부자집이 가난한 집 되는거로 생각하자 ) 

 

bte -> short->int->long->float->double

 

 

작은집 -> 넓은집: 자동으로 변환되고 에러도 안난다.
넓은집->작은집: 가난해지는 거니까 자동으로 되지 않고 에러가 난다. 

 

작은집 -> 넓은 집 (부자가 됨!)

class Main {
  public static void main(String[] args) {
    // int 타입 변수 생성
    int num = 10;
    System.out.println(num);

    // double 타입으로 변환 (작은거->큰거) : 에러안남 !! 
    double data = num;
    System.out.println(data);
  }
}

 

2. 넓은집->작은집 (범위를 줄이는 캐스팅) 
가난해짐..
에러가 남

 

class Main {
  public static void main(String[] args) {
    // double 타입 변수 생성
    double num = 10;
    System.out.println(num);

    // int 타입으로 변환 (큰거->작은거) : 에러남 !! 
    int data = num;
    System.out.println(data);
  }
}

 

 

 

에러 예시2)

long num = 2000L;
int result = num; //에러

이제 이러한 에러를 피해야함 
캐스팅을 해준다.

 

class Main {
  public static void main(String[] args) {  
    double num = 10.99;
    int data = (int)num; // double(큰)->int(작은)으로 들어가려 하니까 에러가 남 . 캐스팅으로 고침
    System.out.println(data);
  }
}


long num = 100L;
int num2 = (int)num; //long이 int로 가려는데 에러가 남,  캐스팅으로 고침 
byte num = 100;
short num2 = (short)num;//byte가 short로 가려니까 에러가 남 , 캐스팅으로 고침

 


자바에서는 문자열이 숫자열로 자동변환이 안된다. 

int num = 1*"1"; // 에러

parse()를 사용 

Integer.parseInt("숫자문자열")
Long.parseLong("숫자문자열")
Float.parseFloat("실수숫자문자열")
Double.parseDouble("숫자문자열")

 


 

float과 double은 정확한 값을 구할 수 없는 경우가 발생하기도 한다. 

둘은 아주 근소한 부분까지도 담으려고 하기 때문에 정확한 결과를 얻으려고 할 때 사용하면 안된다.

double num = 0.015;
double num2 = 0.024444;
System.out.println(num2-num);

0.009444000000000001

 

 

float num = (float)0.015;
float num2 = (float)0.024444;
System.out.println(num2-num);

0.009444001

 

따라서 정확한 답을 구하고 싶으면 정수로 곲해준 후 , int값으로 만든 후 다시 소수로 바꿔준다 .

 

예제1)

 

     float num = 0.55F;
     float num2 = 0.66F;
     
     double result = (100*num)*1/100+(num2*100)*1/100;

 

예제2)

int apple = 1;
float pieceUnit = 0.11F; 
		
		// 원래 값을 쓰려고 할 때는 apple - pieceUnit인데 int화 시킨 후, 계산한다. 
float result = apple - (pieceUnit*100)*1/100;
System.out.println(result);

자바에서는 정수 0으로 나누려고 하면 에러가 발생한다.

나머지를 구하려고 할 때도 0으로 나눠서 구하려고 하면 안된다. 

 

public class Ari04InfinityAndNaNCheckExample {
	public static void main(String[] args) {	
		int x1 = 5;
		int y1 = 0;
		int z1 = 0;	
        
		z1 = x1/y1;
		System.out.println(z1);	
        
		z1 = x1 % y1;
		System.out.println(z1);
	}

}

java.lang.ArithmeticException: / by zero

 

 

 

정수타입에서는 에러가 났지만 , float 타입은 에러가 안남 

float x2 = 5.0F;
float y2 = 0.0F;
float z2 = 0.0F;

z2 = x2 / y2;
System.out.println(z2);

z2 = x2 % y2;
System.out.println(z2);

Infinity , NaN

 

infinity는 float값이나 double로 나오는거니까 Double.isInfinite(실수 변수) or Double.isNaN(실수변수)를 쓴다 //false true값 반환  

 

 

 

0으로 나눠지면 에러가 나기 때문에 소스를 짜둔다 

public class Main{
    public static boolean checkValid(int num){
        if(num==0){
            return false;
        }
        return true;
    }
    
    public static void main(String[] args){
        int x = 1;
        int y = 0;
        int result =0;
        if(checkValid(y)){
            result = x / y;
        }else{
            System.out.println("계산 할 수 없습니다");
        }
    }
}

 

 


변수에 infinity랑 nan이 대입되게 만들기 

double myDouble = 0.0;	
float myFloat = 0.0F;

myDouble = Infinity;		
myDouble = NaN;		
myFloat = Infinity;		
myFloat = NaN;

 

변수에 담고, valueOf()를 사용하여 쓴다.

double myDouble = 0.0;	
float myFloat = 0.0F;

String myInfinityStr = "Infinity";
String myNaN = "NaN";

myDouble = Double.valueOf(myInfinityStr);
System.out.println(myDouble);
myDouble = Double.valueOf(myNaN);
System.out.println(myDouble);

myFloat = Float.valueOf(myInfinityStr);
myFloat = Float.valueOf(myNaN);

 


비교연산자 유형 

동등비교 연산자 : == , !=  : 모든 타입에 사용가능

대소비교 연산자 :> >= < <= :숫자에만 사용가능

true or false를 반환한다.

 

int num1 = 10;
long num2 = 10L;
double num3 = 10.0;
float num4 = 10.0F;

System.out.println("num1==num2"+(num1==num2));
System.out.println("num1==num3"+(num1==num3));
System.out.println("num1==num4"+(num1==num4));
System.out.println("num2==num3"+(num2==num3));
System.out.println("num2==num4"+(num2==num4));

타입은 다르지만 값이 모두 같기 때문에 전부 true가 나온다. 


삼항연산자 

 

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        
        String grade = (input>90)?"A":(input>80)?"B":(input>70)?"C":(input>60)?"D":F;
        
        System.out.println(grade);
    }
}

 

댓글