이번 시간에는 Java에서 변수의 기본형 타입(Primitive Type), 참조형 타입(Reference Type)이 무엇인지와, 기본형 타입의 여러 가지 종류, 기본형 타입의 데이터 표현 범위에 대해 알아보도록 하겠습니다
1. 기본형 타입(Primitive Type)과 참조형 타입(Reference Type)의 정의
1-1. 기본형 타입(Primitive Type)
- Java에서 변수의 기본형 타입은 총 8가지가 존재하며 기본형 타입의 변수는 실제 데이터를 저장하기 위해 사용되는 변수 타입입니다. 기본형 타입은 원시 타입이라고 불리기도 합니다.
- 기본형의 여러 가지 타입은 Java의 기본적인 자료형(Data type) 체계에 의해 분류되며, 아래에서 더 자세하게 다뤄보도록 하겠습니다.
1-2. 참조형 타입(Reference Type)
- 참조형 타입의 경우 기본형 타입을 제외한 나머지 변수 타입을 참조형 타입이라고 합니다.
- 사용자에 의해 생성된 객체(Object)의 주소를 저장하고 있습니다.
- null 값, 또는 객체의 주소를 가지게 됩니다.
- 아래에서 설명드리겠지만, 분류하면 크게 4가지의 타입인 배열(Array), 열거(Enumeration), 클래스(Class), 인터페이스(Interface)로 분류됩니다.
2. 기본형 타입(Primitve Type)의 8가지와 값의 표현범위
- 기본형 타입은 아래 표와 같이 총 8개의 기본 타입이 존재합니다.
- Java에서 미리 표준 형식을 제공하고 있으며 Default 값이 존재하기에 Null 값이 따로 존재하지 않습니다.
- 변수가 기본형 타입으로 선언된다면 실제 값을 저장하는 것이기에, 메모리의 스택(Stack) 영역에 저장됩니다.
- 기본형 타입의 경우 선언과 동시에 값을 저장하는 변수 초기화가 가능하며 프로그래밍 시, 아래 표에 해당되는 각 기본형 타입의 표현범위를 벗어나는 데이터를 저장하게 되면 컴파일 에러가 발생하는 점에 유의해야 합니다.
타입(Type) | 할당되는 메모리 크기 | Default value | 해당 타입의 표현범위 | |
논리형 | boolean | 1 byte | false | true, false |
정수형 | byte | 1 byte | 0 | -128 ~ 127 |
short | 2 byte | 0 | -32,768 ~ 32,767 | |
int (defalut type) |
4 byte | 0 | -2,147,483,648 ~ 2,147,483,647 | |
long | 8 byte | 0L | -9,233,372,036,854,775,808 ~ 9,233,372,036,854,775,807 | |
실수형 |
float | 4 byte | 0.00f | (1.4E-45 ~ 3.4E38)의 근삿값 |
double (defalut type) |
8 byte | 0.0 | (4.9E-324 ~ 1.7E308)의 근삿값 | |
문자형 | char | 2 byte | \u0000 | 모든 유니코드 문자열 |
3. 기본형 타입 사용 시 유의사항
3-1. 정수형 타입(byte, short, int, long) 시 해당 타입의 표현 범위를 항상 고려한다.
- 기본형 타입 중에서 정수형 타입을 사용하고자 하는 경우 정수의 최대 / 최소 표현범위를 고려해 주어야 합니다.
- 만약 타입 별로 표현 가능한 데이터의 최대 범위보다 큰 값을 저장하는 경우 오버플로우(Overflow)가 발생하고, 데이터의 최소 범위보다 작은 값을 저장하면 언더플로우(Underflow)가 발생하게 됩니다. 오버플로우나 언더플로우가 발생하면 변수에는 사용자가 의도하지 않은 값이 저장되므로 표현 범위에 유의하며 정수형 타입을 사용해야 합니다.
- 오버플로우(Overflow) : 특정 타입의 변수에 저장될 수 있는 최대 표현 범위보다 큰 값을 저장하여 발생하는 현상.
- 언더플로우(Underflow) : 특정 타입의 변수에 저장될 수 있는 최소 표현 범위보다 작은 값을 저장하여 발생하는 현상.
3-2. 실수형 타입(float, double) 사용 시, 유효 자릿수를 항상 고려한다.
- 실수형 타입을 사용하고자 하는 경우 최대 / 최소 표현 범위와, 유효 자릿수를 고려해 주어야 합니다.
- 일반적으로 컴퓨터는 실수를 표현할 때, 부동 소수점(Floating point) 방식을 이용하여 실수를 표현하게 됩니다.
(1) 부동 소수점(Floating point) 방식 : 실수를 가수부와 지수부로 나누어 표현하는 방법
- 매우 큰 실수까지도 표현할 수 있지만 10진수를 정확히 표현할 수 없기에 오차가 발생하게 됩니다.
(2) 고정 소수점(Fixed point) 방식 : 실수를 정수부와 소수부로 나누어 표현하는 방법
- 소수부의 자릿수를 미리 정한 상태에서 고정된 소수를 표현하기에 정확히 값을 표현할 수 있으나 표현 범위가 매우 적습니다.
- 위의 부동 소수점의 특징인 실수를 지수부와 가수부로 나누는 특성으로 인해 정수형 타입 int와 실수형 타입 float가 같은 4 byte라는 같은 메모리 크기를 할당받았음에도 불구하고, float 자료형에 더 많은 표현범위의 데이터가 저장될 수 있게 됩니다.
- 다만 단점도 분명히 존재합니다. 실수형 타입을 사용하는 경우 실수를 지수부, 가수부로 나누기 때문에 필연적으로 오차가 발생하게 되므로 정밀도가 중요해지고, 이때 정밀도를 실수형의 경우 유효 자릿수를 통해 판단하여 어떤 타입을 사용해야 할지 결정할 수 있습니다.
- 정밀도 : 특정한 값을 몇 자리까지 오차없이 표현할 수 있는지에 대한 지표
- 실수형 타입 float, double의 유효 자릿수는 다음 아래 표와 같습니다.
실수형 타입 | 지수의 비트 길이 | 가수의 비트 길이 | 유효 자릿수 |
float | 8 bit | 23 bit | 소수점 약 6자리까지 정확히 표현 |
double | 11 bit | 52 bit | 소수점 약 15자리까지 정확히 표현 |
- 여기서 핵심은 정수형 타입과 달리 실수형 타입을 사용할 땐, 최대 / 최소 표현 범위와 유효 자릿수까지 항상 고려해 주어야 합니다.
- 단순히 수의 표현 범위로만 봤을 땐 어떠한 자료형이나 사용해도 무방할 것 같지만 정확한 계산을 요구하는 상황이라면 위와 같은 정밀도 요소가 매우 중요해집니다. 이런 경우 float 자료형보단 double 자료형을 사용하는 것이 일반적입니다.
- double 자료형의 위와 같은 특성 때문에 실수형 타입의 경우 Default type이 double형으로 채택되었습니다.
4. 참조형 타입(Reference Type)의 종류
- 참조형 타입의 변수는 기본형 타입을 제외한 모든 타입을 의미합니다.
- 참조형 타입은 기본형 타입과 달리 빈 객체(Empty Object)를 의미하는 Null 값이 존재합니다.
- 참조형 타입의 변수는 값이 저장되어 있는 변수의 메모리 주소를 저장하는 공간으로 메모리 영역의 힙(Heap) 영역에 저장됩니다.
- 문법 상의 오류로 인한 컴파일 에러는 발생하지 않지만, 참조형 타입의 특성 상 배열이나 객체를 Null 값으로 받으면 런타임 시, NullPointException 에러가 발생하는 점을 알아두어야 합니다.
- 아래 표는 참조형 타입을 크게 4가지로 나눈 표입니다.
참조형 타입 | 참조형 변수의 예시 | 기본값(Default value) | 할당되는 메모리 크기 |
배열 (Array) |
int[] arr = new int[5]; | Null | 4 byte (객체의 주소값 저장) |
열거 (Enumeration) |
Null | ||
클래스 (Class) |
String str = "test"; NewClass cls = new NewClass(); |
Null | |
인터페이스 (Interface) |
Null |
- 참조형 타입에 대해선 이후 객체지향 개념에서 다시 한 번 나오게 되는 내용이며, 이후에 자세히 설명해 드리도록 하겠습니다. 이번 포스팅에선 Java의 변수의 종류로는 기본형 타입, 참조형 타입이 존재하며 기본형 타입에 초점을 조금 더 맞춰주셨으면 좋겠습니다.
이번 포스팅에선 Java의 변수의 타입인 기본형 타입, 참조형 타입에 대해 알아보았습니다. 다음 포스팅에선 상수(Constant)와 리터럴(Literal)에 대해 알아보도록 하겠습니다.
======================================================================
해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.
이에 대해 지적해 주시면 감사하겠습니다.
'백엔드(Back-End) > Java' 카테고리의 다른 글
[Java] - 여러 가지 기본형 타입의 변환 (0) | 2022.09.03 |
---|---|
[Java] - 문자형, 문자열 자료형의 정의와 여러 가지 특징 (0) | 2022.09.03 |
[Java] - 상수(Constant)와 리터럴(Literal), 리터럴의 접미사(Suffix) (0) | 2022.08.29 |
[Java] - 변수의 선언과 초기화, 변수의 종류 (0) | 2022.08.27 |
[Java] - Java란 무엇인가? (0) | 2022.08.05 |
댓글