자료형
언어마다 다양한 변수의 타입을 지원하며, 값의 범위와 종류는 다르다.
기본 자료형과 참조 자료형으로 나눌 수 있는데 다음과 같다
기본 자료형 (8) = boolean, char, byte, short, int, long, float, doule
참조 자료형 = 기본 자료형을 제외한 나머지 타입(클래스, 인터페이스, 배열, 열거 타입)
기본 자료형은 실제 값을 저장하고, 참조 자료형은 값이 저장되어 있는 주소를 저장한다.
그래서 기본 자료형은 스택 메모리에 저장되며 비 객체 타입이라 null 값을 가질 수 없고, (만약 null 값을 넣고 싶다면 Wrapper Class를 활용해야 한다.) 자료형의 길이가 불변이다. 하지만 참조 자료형은 Null 값을 가질 수 있으며, new를 이용해 생성하는 모든 객체는 메모리 영역인 Heap 영역에 생성하고, GC(가비지 컬렉터)가 돌면서 불필요한 메모리를 해제한다.
기본 자료형
논리형인 boolean은 1bit의 크기를 가지고 있으며 기본값이 false이다.
논리형인 불린은 실제로 1bit면 충분하나, 데이터를 다루는 최소 단위가 1byte이기에 메모리 크기가 1byte이다.
문자형 char는 2byte의 크기를 가지고 있으며 기본값이 |u0000으로 나오는데, 이는 공백을 의미한다.
문자형은 문자 하나를 입력하는 데이터 형이다.
정수형 byte는 1byte의 크기를, short는 2byte의 크기를, int는 4byte, long은 8byte의 크기를 갖고 있으며 모든 정수형의 기본값은 0이다.
마지막으로 실수형 float는 4byte, double는 8byte의 크기를 갖고 있으며 역시 기본값이 0이다.
가수를 표현할 때, double형이 float형보다 표현 가능 범위가 더 커 double형이 보다 정밀하게 표현할 수 있으며, 실수형은 실수를 가수와 지수 형식으로 저장하는 부동소수점 방식으로 저장된다.
(소수점을 처리하기 위해 사용)
위에서 정리한 것 처럼 float는 32bit로 표현되며, double는 64bit로 표현된다. = 메모리 공간을 차지
(바이트로 바꾸면 float는 4byte, double은 8btye)
이 두 소수점은 간단한 계산에서는 사용해도 무방하지만, 돈 계산, 깊은 소수점 계산같이 중요한 부분을 다루게 된다면 이 두 타입(float, double)을 사용하면 안된다. 이유는 해당 자료형이 표현할 수 있는 크기인 4byte와 8byte를 넘어선다면 그 값의 정확성을 보장하지 못하기 때문이다. 때문에 더 정확한 소수점 계산을 위해서는 java.math의 BigDecimal이라는 클래스를 사용해야 한다.
자바에서는 IEEE 754 부동 소수점 방식을 사용해서, 정확한 실수를 저장하지 않고 근사치에 가까운 실수를 저장한다. 그래서 더욱 정확한 실수 계산을 하려고 한다면 BigDecimal 클래스를 사용해야만 한다.
https://stackoverflow.com/questions/322749/retain-precision-with-double-in-java/322875#322875
그럼 BigDecimal은 float와 double형보다 왜 더 정밀할까?
실수형 float와 double형은 내부적 수를 저장할 때 이진수의 근사치를 저장한다고 설명했다. 그래서 이렇게 저장된 근사치 값을 다시 십진수로 변환하면 오차가 발생한다.
그러나 BigDecimal 타입은 내부적으로 수를 십진수로 저장해 정밀도가 높다.
고정 소수점과 부동 소수점
고정 소수점은 10진수를 2진수로 변환하고, 그 변환한 내용을 그대로 사용하는 방식이다. 비트체계에 따라서 정수부와 소수부로 나누고, 소수점의 위치를 미리 정해두고 남는 뒷자리는 다 0으로 채우게 되는데, 구현에 있어서 편리함은 있으나 정밀도 측면에서는 낮아 자주 사용하지 않는다.
부동 소수점은 고정 소수점과 다르게 2진수로 변환한 결과 값을 그대로 사용하지 않고, 몇 가지 과정을 추가로 거치게 된다. (정규화라는 과정을 거치게 된다.)
예를들어 111.101이라는 결과 값을 도출했으면, 정규화를 통해 1.11101 * 2^2로 만드는 것을 정규화라 한다.
(정수부에 1만 남을 때까지 소수점을 왼쪽으로 이동시키고 이동한 칸 수(n)만큼 표시 2^n)
참고
https://gsmesie692.tistory.com/94
https://stackoverflow.com/questions/3413448/double-vs-bigdecimal
참조 자료형
주소를 가지고 있는 변수로, 기본 자료형을 제외한 나머지 타입은 모두 참조 자료형이다. 참조 자료형은 대부분 여러 데이터를 다루는 자료들이기에, 효율적으로 값을 관리하기 위해서는 일반 변수가 사용하는 공간이 아닌 다른 공간에 데이터를 모아서 연결지어 관리한다. 그래서 변수에 다른 공간의 주소를 저장해 변수를 부를 때마다 주소값을 찾아 그 데이터들을 참조한다.
'Language > Java' 카테고리의 다른 글
객체 지향적 설계? (0) | 2022.11.21 |
---|---|
문자열 나누기 - StringTokenizer (0) | 2022.08.03 |
String 과 JVM (0) | 2022.05.22 |
예외 처리(Exception) (0) | 2022.05.15 |
인터페이스와 추상클래스 그리고 Enum (0) | 2022.05.14 |