Java

[ JAVA ] 07. 자료형을 사용할 때 고려해야 할 부분은 무엇이 있을까?

giryu 2023. 7. 7. 00:10

안녕하세요.

오늘은 저번 시간에 알아본 자료형을 사용할 때 고려해야 할 점에 대해 알아보도록 하겠습니다.

https://giryu.tistory.com/8

 

[ JAVA ] 06. 자료형에 대해 알아보자.

안녕하세요. 오늘은 자바에서 가장 기본적이지만, 중요한 개념인 자료형에 대해 알아보도록 하겠습니다. 자료형은 무엇인가? 자료형이란 변수나 메서드의 매개변수, 반환값 등을 선언할 때 사

giryu.tistory.com

자바의 자료형 기본 개념

 

자료형을 선택할 때 고려해야 할 요소

자바에서 자료형은 코드의 성능, 메모리 사용, 데이터의 정확성 등을 고려하는 중요 요소 중 하나입니다.

올바른 자료형을 선택하는 것은 코드의 효율성과 안정성에 큰 이점을 가져 올 수 있습니다.

 

기본형 타입(Primitive type)을 사용할 시 고려해야 할 사항

기본형 타입은 자바에서 미리 제공하는 형식을 정의하여 제공해주고 있습니다.

때문에, 기본형 타입을 이용하여 코드를 작성할 때 몇 가지 유의해야 할 정보들이 있습니다.

이 점들을 유의하면 더 나은 코드를 만들 수 있을 것 같습니다.

 

정수형 타입을 사용할 땐 오버플로우(overflow) / 언더플로우(underflow)를 주의

정수형 타입을 사용할 때에는 사용하려는 데이터의 최대 / 최소 표현 범위를 고려하여야 합니다.

만약 코드를 작성하다 데이터를 저장할 때 데이터가 표현할 수 있는 범위를 벗어나 저장하려고 시도하면,

오버플로우 또는 언더플로우가 발생하며 전혀 생각하지 못했던 값이 저장될 수 있습니다.

 

* 여기서 오버플로우와 언더플로우란 무엇인가?

* 오버플로우 : 데이터 타입이 표현할 수 있는 최대 표현 범위보다 큰 수를 저장할 때 발생하는 현상

* 언더플로우 : 데이터 타입이 표현할 수 있는 최소 표현 범위보다 작은 수를 저장할 때 발생하는 현상 

// byte의 표현 범위는 -128 ~ 127
// 표현 범위를 벗어난 수를 대입하려하면 에러 발생

byte max = 127; 
byte min = -128;

max++;
min--;

System.out.println(max);
System.out.println(min);

// max 출력값
// -128 오버플로우가 발생한 경우

// min 출력값
// 127 언더플로우가 발생한 경우

위와 같이 정수형 타입 중에서도 byte의 데이터 표현 범위를 벗어나는 값을 입력하면 오버플로우 또는 언더플로우가 발생하게 되므로 꼭 주의하여야 합니다.

 

실수형 타입을 사용할 때에는 유효한 자릿수를 고려

실수형 타입을 사용할 때에는 표현 범위 말고도 유효한 자릿수를 고려하여야 합니다.

보통 컴퓨터는 실수를 부동 소수점 방식을 이용하여 표현하게 됩니다.

 

* 소수점 표현 방식은 고정 소수점 방식과 부동 소수점 방식이 있다.

* 고정 소수점 방식 : 실수를 정수부와 소수부로 나누어 소수부의 자릿수를 미리 정하고 고정된 자릿수의 소수를 표현하기 때문에 표현 할 수 있는 범위가 매우 적다.

* 부동 소수점 방식 : 실수를 가수부와 지수부로 나누어 매우 큰 실수까지 표현할 수 있지만, 10진수를 정확하게 표현할 수 없어 오차가 필연적으로 발생하게 된다.

 

// float의 유효 자릿수 : 소수점 약 6자리 까지 높은 확률로 정확한 표현 가능
// double의 유효 자릿수 : 소수점 약 15자리 까지 높은 확률로 정확한 표현 가능


// float의 유효 자릿수 검사

System.out.println(1.123456789f); // 출력결과 : 1.1234568 6자리까지 정상 출력 끝자리 반올림 발생

// double의 유효 자릿수 검사

System.out.println(1.123456789d); // 출력결과 : 1.123456789 모두 정상 출력

위와 같이 타입에 따라 오차가 발생할 수 있으니, 정확한 계산이 필요한 경우엔 이러한 점도 모두 고려하여 코드를 작성할 필요가 있습니다.

 

정확한 계산이 필요한 경우엔 이것을 고려

실수형 타입은 큰 범위까지 사용이 가능하지만 오차가 필연적으로 발생하는 단점이 있다고 했습니다.

소수점이 평상시에는 사소해보이는 숫자이지만 그런 것은 절대 아닙니다.

미사일 궤적을 예로 들어보면,  소수점 오차 하나만으로 전혀 다른 위치로 떨어지기에

이러한 오차도 큰 결과를 야기할 수 있기에 중요하게 생각하여야 합니다.

 

때문에 이를 해결하기 위해서는 정수형을 사용하여 정확하게 표기하거나 BigDecimal 클래스를 이용하여야 합니다.

 

* BigDecimal 클래스란 자바에서 정확한 십진수 연산을 수행하기 위해 사용하는 클래스로, 부동 소수점 연산의 정확성 문제를 해결하기 위해 사용되며, 큰 숫자나 소수점 이하의 자릿수가 필요한 계산에 유용하게 사용된다.

 

데이터의 표현 범위가 제한되어 있기 때문에 크기가 9자리를 넘지 않으면 int를 사용할 수 있고,

18자리를 넘지 않으면 long을 사용할 수 있고,

만일 18자리를 초과하게 되면 BigDecimal 클래스를 사용하여야 합니다.

 

* BigDecimal를 사용하는 경우 : 정확한 연산을 제공하지만, 기본형 타입보다 사용이 불편하고 실행 속도가 느려지는 단점

* BigDecimal를 사용하지 않을 경우 : int, long으로 소수점을 없애는 형태로 계산 실행 속도가 빠르지만, 소수점을 직접 계산해야하는 단점

 

이와 같이 큰 수를 다룰 때에는 상황을 고려하여 유동적으로 타입을 적용할 수 있습니다.

 

문자형 타입을 사용할 때에는 이것을 고려

우리가 알기로 컴퓨터는 2진수 밖에 인식하지 못한다.

그렇기 때문에 문자도 숫자로 표현하게 됩니다. 그렇다면 문자를 어떤 숫자에 대응시킬 것인가?

우리는 이를 아스키코드(ASCII) 유니코드(Unicode)로 통일하도록 약속하였습니다.

 

자바에서는 유니코드를 사용하여 문자를 표현합니다. 아스키코드는 영문자와 숫자밖에 표현하지 못하지만,

유니코드는 모든 나라의 언어를 표현할 수 있습니다.

그 이유는 유니코드가 문자 하나를 16비트로 표현하기 때문입니다.

16비트는 총 65,536개의 문자를 표현할 수 있으므로 표현 범위가 훨씬 넓습니다.

 

* 아스키코드는 C언어에서 사용한다.

 

이상으로 자바에서 자료형을 사용할 때 고려해야할 부분에 대해 알아보았습니다.

사소하지만 꼭 필요한 정보이기 때문에 꼭 인지하고 넘어가야 할 부분이라고 생각합니다.