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);
}
}
'Development (국비 복습 ) > 자바' 카테고리의 다른 글
[2023-03-16]입력값을 받는 Scanner객체, String객체,Null (0) | 2023.03.16 |
---|---|
[2023-03-15]for문 활용 (0) | 2023.03.15 |
[2023-03-13]메모리 구조(heap,stack영역), 기본타입 (0) | 2023.03.13 |
[2023-09-09]DOM,노드추가 방법 (0) | 2023.03.09 |
[2023-03-07] 비밀번호 전방탐색(?=n) (0) | 2023.03.07 |
댓글