본문 바로가기



프로그래밍/JAVA

int (integer) 와 float 자료형은 어떻게 다른가? JAVA에서...

int 타입과 float타입의 설명을 보면, 실수타입인 float가 정수타입인 int에 비해 더 큰 수를 저장할  수 있다고 설명되어있다. 언뜻보고 지나가면 그렇지 하고 지나갈 수 있는데. 한글의 어려움이 바로 이런 부분인듯 싶었다. 분명히 float가 int자료형보다 큰 범위 값을 저장할 수 있다고 하는데 왜 int형을 float형으로 변환하면 근사치(정밀도가 떨어짐)이 발생하는지 의문이 생겼다. 자료를 아무리 봐도 설명을 봐도 이해가 갈듯말듯 한상태에서 좀더 들어가 보았다.

일단 int 타입 과 float타입은 같은 4바이트를 쓰지만 float 그 4바이트를 부호 2비트 + 지수 8비트 + 가수 23비트로 쓰고 있다. 그러니까 가수23비트부분이 실제로 표현할 수 있는 부분이고 앞에 10비트는 아예 다른 용도로 지정된 비트 구간인것이다. 그러니 23비트를 초과하는 데이터를 float로 처리하면 문제가 생기는것이다. 실제 범위는 float가 실수 범위이므로 훨씬 표현 범위가 넓다는것이지 숫자가 크다는게 아니였던것이다. 다시 말해 정수보다 실수 집합의 크기가 자연수 집합의 크기보다 크다는 수학적인 의미를 응축하고 있었다. 컴퓨터쪽에서 설명을 보면, 실수타입인 float가 정수타입인 int에 비해 더 큰 수를 저장할 수 있다고 설명되어있다.   

다시 말해 정수보단 실수가 더 많지않은가? 이거다 그 정밀도(가수부분에 해당되는것 같다)는 int 보다 떨어질 수 밖에 없는것이다. 그래서 이 경우에는 Double 로 처리해야되는 경우가 결국 발생하게 되는것이다. 

Double의경우 지수 11비트 + 가수 52비트이므로 훨씬 넓은 범위를 저장할 수 있어서 정밀도가 더 높아지게 된다. 애초에 자바가 Dobule을 실수 기본타입으로 여기기 때문에 실수리터럴(소스에 직접 입렫된 값)을 저장할려면  뒷부분에 f나 F를 붙여야 하는 것이다. 

다음코드로 실습해보자. 

// 파일이름은 literMaxGet.java 이다
public class literalMaxGet {

	public static void main(String[] args) {

		double varDoublePie = 3.14;
		float varFloatPie= 3.14;
		float varFloatfPie= 3.14f;
		float varFloatFPie= 3.14F;
		
		
	}

}

실행중에 에러가 발생할지도 모르는데 실행하겠냐고 Proceed with launch?라고 물어볼것이다. Proceed를 눌른다. 그다음  디버그 switch를 물을것이다 "No"를 선택한다.   그러면 실행되다가 에러 부분에서 Pause가 걸려 있을것이다 F8을 눌러 그대로 실행한다. 그러만 아래와 같은 에러메시지가 나온다.

type missmatch : cannot convert from double to float 메시지가 나오는것을 확인 할 수 있다.  에러발생 라인을 확인해보면 float에 값을 넣고 f를 붙이지 않아서 double로 인식되어 일어난 에러임을 알 수 있다.

자바 강좌를 한바퀴돌고 다시 보는중에 생긴 의문들이 굉장히 많아서 앞으로도 이런 의문들에 대해서 이렇게 정리해 놓을 생각이다. 자료형의 경우에 일부 답변들을 보면 컴퓨터 구조강좌를 참조하면 알 수 있다는 내용들이 꽤 있었는데, 자바나 파이썬같은 언어를 먼저다루는 분들에게는 오히려  수학적인 설명보다 더 어렵게 느껴질 수 있다고 생각한다.