06. 정수는 프로그램에서 어떻게 표현하여 사용하나요


강의 내용 정리

※ 자료형의 두가지 형태

기본 자료형 : JAVA에서 재공되는 자료형으로 저장할수 있는 용량이 자료형의 종류별로 정해져 있어요.

  선언에 new 를 사용하지 않고 자료형의 이름(Int,String,char)을 변수 앞에 적어서 생성할수 있습니다.

참조 자료형 : 객체(오브젝트)를 저장하고 있는데 ( 첫번쩨 값의 주소 ) 용량이 정해저 있지는 않고. new 로 만들어요.

 

 1. 기본 자료형 ( 앞글자는 바이트 단위 )

    정수형 : 1xbyte 2xshort 4xint 8xlong

    문자형 : 2xchar

    실수형 : 4xfloat 8xdouble

    논리형 : 1xboolean

 

0과 1 사이의 0.1111같은 무한한 숫자를 저장하기 위해서는 특별한 방법이 필요했는데. 

과거에는 3.14라는 수를 3과 14로 분리해서 저장했지만. 최근에는 특수한 경우 이외에는 부동 소수점 방식으로 소수점 아래의 값을 저장하는 방식을 사용해요. 4바이트 float , 8바이트 double(64bit) 데이터 타입을 사용하고 있습니다.

 

우선 정수형 데이터 타입에서 저장할수 있는 수는 3바이트로 표현할수 있는 수의 경우 2의 3승-1 으로 0~7까지 이지만.

정수형의 가장 앞의 비트는 부호를 표현하기 때문에 1바이트는 실제로 7비트 만큼의 수를 저장할수 있습니다.

2의 7승 개 만큼의 숫자와 메모리의 가장 앞 글자로 부호를 표현하여 -128~127까지 표현할수 있어요.

음악파일이나 이미지 파일의 최소 단위 또한 일반적으로 1바이트를 데이터의 최소단위로 사용하고 있어요.

 

int num = 10  은 num 이라고 하는 메모리 주소가 int 형테를 가지고 있다고 해요.  10이나 문자 같은 값을 리터널 이라고 해요. 

long lNum = 12345678900에서도 리터널은 4바이트로 기본적으로 저장되서 오류가 나요 .

long lNum = 12345678900L 처럼 숫자 뒤에 L(소문자는 1과 구분이 않되요) 을 붙여주어 사용해요.

실수도 리터널의 기본적인 데이터 형태로서 double로 저장하기 떄문에 float를 사용하려고 한다면 F를 숫자 뒤에 붙어서 사용해야 정상적으로 메모리 용량이 지정 되요.

선언한 데이터 형테보다 리터널이 크면 out of range 오류로 상황을 확인할수 있어요.


강의 내용 체크

참조 자료형 :

  배열 , 객체 , 함수 등의 타입이 여기에 포함됩니다.

  참조 자료형은 하나의 값의 메모리 위치를 가르키는 것이 아니기 때문에.  여러개의 값 중에서 가장 첫번쩨 값의 주소를 저장하고 있어요.

 

07. 자료형(data type) 실수는 어떻게 표현하여 사용하나요


강의 내용 정리

실수 리터널값은 기본적으로 double타입으로 저장됩니다.

float타입 변수에 실수가 저장 될때 리터널의 기본 저장타입은 double타입 이기 때문에 용량 오버로 오류가 발생하게 됩니다. 이럴때 숫자 뒤에 f를 붙여서 리터널을 float타입으로 명시 하여 변수의 타입과 동일하게 저장 할수 있습니다.

 

소수점이 있는 값을 저장하는 방법 : 부동소수점 방식

과거에는 3.14라는 수를 3과 14로 두가지로 나누어 따로 저장 하고 있었습니다.

현대 에 와서는 1과 0 사이의 수많은 값을 적은 메모리에 저장할수 있는 부동 소수점 방식을 사용하고 있습니다.

  표현방법:  0.1 의 경우 : 1x10의 마이너스1승 = 0.1 입니다 .

  에서 1은 지수 -1은 가수 , 10은 밑수 라는 이름을 갖고 있습니다. 

 

  부동 소수점 방식으로 소수점을 표현하기 때문에 발생하는 오류

밑수가 0이 될수 없기 때문에. 가수가 아무리 0에 가까워도 값 0을 표현할수 없기 때문에 . 오차가 발생하게 됩니다

double A = 1;
for (int i = 0; i < 10000; i++) {
	A+=0.1;
}
System.out.println(A);

밑수가 2로 표현되는 경우가 많아요.  수가 밑수보다 낮게 표현되는게 정규화 된다고 합니다.

2의 -3 이면 1.22222처럼 밑수보다 결과값의 정수가 작은 경우에요.

 

 


 

강의 내용 교차 검증

double에 정수( 우리가 일상적으로 사용하는 수들)를 넣은 상태에서 이리~저리 계산을 반복 하다보면 부동소수점 오류로 인해서 값에 오차가 발생하기 때문에 버그의 원인이 될수 있다고 해요. 

  부동 소수점 오류를 해결하는 방법.

  1. 소수점 계산에서 float 보다 double를 사용하면 더 낮은 영역에서 오류가 발생하기 떄문에 double를 사용해요.

  2. 정수가 들어있을 것이다. 라고 예상했던 실수 타입의 데이터를 바로 정수로 캐스팅(형변환) 시키면 않되요. 소수점을 자르거나 반올림을 합시다.

  3. 실수타입의 데이터가 담겨있는 변수를 비교 연산할때 =을 쓰면 않되요. 에러가 발생할수 있는 영역을 크고 같다로 표현 해야해요.

  4.  큰 수를 다룰때 작은 상수값을 사용하면 . 오류가 정수 부분에서 생길수 있어요 . 

float의 상대오차는 약 10^-7 정도라고 하고, double의 상대 오차는 약 10^-15 정도라고 해요.

버그가 생기는 원인 정수가 들어있는 실수 데이터 타입을 그대로 사용해서 계산 하다보면 정수 데이터 타입으로 캐스팅(형변환)되어 저장 되어야 할때 타입 메칭이 되지 않는 오류가 발생하기 때문이라고 해요.

그밖에 부동 소수점에 대한 대처방법은 여기에서 찾아 읽어볼수 있어요.

https://www.acmicpc.net/blog/view/37

 

 


 

학습 타이머


 

캠 스터디

내용


 

스터디 그룹

https://open.kakao.com/o/g1mXVySd

 

온라인 강의 주소

https://bit.ly/37BpXiC%EF%BB%BF

 

+ Recent posts