안녕하세요.
오늘은 저번 시간에 알아본 자료형을 사용할 때 고려해야 할 점에 대해 알아보도록 하겠습니다.
자바의 자료형 기본 개념
자료형을 선택할 때 고려해야 할 요소
자바에서 자료형은 코드의 성능, 메모리 사용, 데이터의 정확성 등을 고려하는 중요 요소 중 하나입니다.
올바른 자료형을 선택하는 것은 코드의 효율성과 안정성에 큰 이점을 가져 올 수 있습니다.
기본형 타입(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언어에서 사용한다.
이상으로 자바에서 자료형을 사용할 때 고려해야할 부분에 대해 알아보았습니다.
사소하지만 꼭 필요한 정보이기 때문에 꼭 인지하고 넘어가야 할 부분이라고 생각합니다.
'Java' 카테고리의 다른 글
[ JAVA ] 09. 객체(Object)와 인스턴스(Instance)는 같은 개념인가? (0) | 2023.07.09 |
---|---|
[ JAVA ] 08. 객체(Object)란 무엇인가? (0) | 2023.07.08 |
[ JAVA ] 06. 자료형에 대해 알아보자. (0) | 2023.07.06 |
[ JAVA ] 05. 클래스(Class)의 구성 요소인 생성자(Constructor)는 무엇인가? (0) | 2023.07.04 |
[ JAVA ] 04. 클래스의 구성 요소인 메서드(Method)는 무엇인가? (0) | 2023.07.03 |