float 형은 4byte
double 형은 8byte
크게 3개의 칸이 있다
첫번째 칸은 - + 를 표현하는 부호비트, 지수부, 가수부 칸이 있다.
예를들어 13.625 를 2진수로 변환하면
1101.101(2) 로 변환이 된다.
이를 컴퓨터는정규화
를 거쳐 1101.101 == 1.101101 x 2^3 으로 표현하게 된다.
여기서 3승은 가수부로 들어가게되고 지수부는 나머지 1.101101 부분에 들어가서 실수를 표현하게 된다.
이렇게 하는 이유는 실수의 오차를 최대한 줄이기 위해 사용한다.
class Customer 를 만들면 main 메서드 에서
Customer cus = new Customer();
이런 식으로 인스턴스화를 시킨다.
Coustomer 클래스의cus
는레퍼런스 변수
라고 한다. 4byte의 크기를 갖는다.
그리고 heap 영역에 Customer 인스턴스 객체의 데이터가 들어가게 된다.
stack에는 cus레퍼런스변수
가 들어가게된다. 이것은 heap 에 들어간 객체 정보를 참조하기 위해 넣은 4byte의 레퍼런스 변수이다.
여기에 값이 들어간 것은 아니고 데이터 위치를 참조하는 데이터만 들어가있다.
heap에서는 객체가 생성되면 메모리를 생성하고 해제해줘야하는데 JAVA의 경우에는 가비지 컬렉터(GB)로 알아서 메모리가 할당되고 해제된다.
long b = 10;
int a = b; // error
타입이 다른상황에서 넣으면 에러가 발생한다.
이를 변환하고 싶다면 캐스팅(형변환)을 사용한다.
int a = (int)b;
여기서 JAVA는 암묵적인 형변환
(implicit conversion)이 일어난다. 데이터가 손실되지 않거나 손실이 제한적인 범위 내에서 암묵적으로 형을 변환한다.
- 자료형이 다른 변수에 값을 할당하는 경우 float f = 10;
- 자료형이 다른 값을 연산하는 경우 double d = 10.0 + 20;
long(정수) 8바이트 타입과 float(실수) 4바이트 타입이 연산을 하게 된다면 long 타입이 아닌 float 타입으로 변환되어 값이 나온다.
왜냐하면 float 타입이 표현할 수 있는 수의 범위가 더 크기 때문이다. (정수 < 실수)
명시적인 형변환(explicit conversion)을 하는 것을캐스팅
(casting) 이라고 한다.
자동 형변환 규칙에 위배되는 상황임에도 강제적으로 형 변환시 데이터 손실의 위험이 있다.
int i1 = 20.5 // error
int i2 = (int)20.5 // 20