Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 스프링
- ./gr
- MSA
- 어노테이션
- 퍼시스턴스 계층
- 동기
- 프레젠테이션 계층
- http
- 비동기
- IPC
- 세션기반 인증
- RESTfull API
- ./gradlew docker
- formmatted
- ORM
- 스프링 부트 테스트
- 스프링부트 구조
- Java
- java I/O
- 로그인 인증 흐름
- JWT
- spring
- 로그인/로그아웃
- 토큰기반 인증
- 작업명중복
- 스프링부트 계층구조
- JPA
- 비즈니스 계층
- 스프링부트
- @temproal
Archives
- Today
- Total
[DEV] J-Jay
형 변환 본문
728x90
정수는 실수에 포함 된다
실수 | ||||
유리수 | 무리수 | |||
정수 | 정수가 아닌 유리수 | |||
양의 정수 | 0 | 음의 정수 |
double형에 정수 저장
public class DoubleToInt {
public static void main(String[] args){
double d1 = 50;
double d2 = 5000L;
}
}
- dobule형 실수 Type에 정수 값은 대입이 가능하다
Int형에 실수 저장
public class IntToDouble {
public static void main(String[] args){
int a = 50.0; //java: incompatible types: possible lossy conversion from double to int
int b = 100.5f; //java: incompatible types: possible lossy conversion from double to int
}
}
- Int형 정수 Type에 실수 값을 대응하면 오류가 발생한다
>실수는 정수를 포함하지만, 정수는 실수를 포함할 수 없기 때문에 컴파일 오류 발생
형 변환(Int정수 Type에 실수 값을 저장)
- 실수 값을 정수타입의 변수에 저장하려면 정수타입으로 형 변환 해야한다
- 변환하고자 하는 값 앞에 (int)를 추가한다
- 100.5f 라는 실수를 정수로 저장시 소수점 이하부분은 잘려서 저장한다
- 이를 명시적 타입변환(강제 타입 변환 explict conversion)이라 한다
public class IntToDouble {
public static void main(String[] args){
int a = (int) 50.0; //50
int b = (int) 100.5f; //100
}
}
크기가 큰 Type은 크기가 작은 Type을 저장할 수 있다
- long 타입의 변수는 int, short byte 값을 저장할 수 있다
- int 타입 변수는 short, byte 값을 저장할 수 있다
- short 타입 변수는 byte 값을 저장할 수 있다
public class IntToDouble {
public static void main(String[] args){
byte b = 5;
short s = b;
int i = s;
long l = i;
}
}
그럼 float(4byte) 타입은 long(8byte)를 담을 수 없을까?
public class Test {
public static void main(String[] args){
long l = 10L;
float f = l;
System.out.println(l); //10
System.out.println(f); //10.0
}
}
위와같이 정상적으로 잘 출력이 된다
작은숫자라서 그런가 싶어 MAX_VALUE로 다시 한번 해보자
public class Test {
public static void main(String[] args){
long l = Long.MAX_VALUE;
float f = l;
System.out.println(l); //9223372036854775807
System.out.println(f); //9.223372E18
}
}
정상적으로 잘 표현해준다
근데 왜?(크기가 큰 타입의 값을 작은 타입에 옮길수 없는데...)
이유는 일반적으로 메모리 설계상 정수타입보다 실수 타입이 더 크게 설정 되어 있기 때문이다
long 범위 : -9,223,372,036,854,775,808 ~ 9.223.372.036.854.755.807
float 범위 : 3.4 x 10^-38 ~ 3.4 x 10^38
[참고]
4바이트 float이 더 큰 수를 표현할수 있는 이유는 부동소수점 방식의 표현 때문이다.
부동 소수점 방식에서는 지수부와 가수부를 나누고, 가수부에는 실제 값을 지수부에는 2제곱을 얼마나 곱할지 표현하기 때문에 수의 표현 범위는 long 타입보다 더 커지게 된다
실제로 큰지 확인
public class Test {
public static void main(String[] args){
long l = Long.MAX_VALUE;
float f = Float.MAX_VALUE;
System.out.println(l >f ); //false
System.out.println(l <f ); //true
}
}
Java에서 강제 형 변환시 주의할 점!
public class Test {
public static void main(String[] args){
int i = Integer.MAX_VALUE;
short s = (short) i;
System.out.println(i); //2147483647
System.out.println(s); //-1
}
}
- int의 MAX_VALUE를 short로 강제 형변환을 할 경우 -1의 값이 나오게 된다
>이유는 2의 보수를 생각하면 알 수 있다
'Back-end > Java' 카테고리의 다른 글
비트연산자 (0) | 2023.02.19 |
---|---|
CHAR 문자 타입 (0) | 2023.02.19 |
정수/실수/산술연산자 (0) | 2023.02.16 |
논리형 TYPE/연산자 (0) | 2023.02.15 |
변수/리터럴(literal) (0) | 2023.02.14 |