gony-dev 님의 블로그

JAVA 기본형 데이터 타입 본문

JAVA

JAVA 기본형 데이터 타입

minarinamu 2025. 12. 31. 15:00
지난 시간에는 JAVA 데이터 자료형의 기본형 타입과 참조형 타입에 대해 각 종류와 특징에 대해 알아보았다.
[JAVA] - JAVA 변수 종류
이번 시간에는 기본형 타입에 대해 더 자세히 알아보도록 하겠다.

 

1. 기본형 타입 - 정수형

자바 언어의 기본형 타입 중 정수형은 총 4가지로, byte, short, int, long이다.

int, long이 대부분 사용되며, byte, short는 나도 프로젝트에서 사용해 본 적이 거의 없다..

타입 기본값 할당되는 메모리 크기 데이터 표현 범위
byte 0 1 byte -128 ~ 127
short 0 2 byte -32,768 ~ 32,767
int 0 4 byte -2,147,483,648 ~ 2,147,483,647
long 0L 8 byte -9,223,272,036,854,775,808 ~ 9,223,272,036,854,775,807

 

long 변수에 값을 대입할 때는 int 자료형의 최대 크기보다 큰 경우, 'L'을 반드시 붙혀주어야 한다.

'L'이 누락된다면, 컴파일 에러가 발생한다.


정수 오버플로우 / 언더플로우

메모리 크기를 고려하지 않는다는 가정하에 정수형 데이터를 모두 long으로 치부해도 되겠지만,
그렇지 않은 경우에 자신이 사용하고자 하는 데이터의 최소/최대 크기를 반드시 고려해야 한다.

이를 고려하지 않고 데이터를 저장하게 되면, 오버플로우/언더플로우가 발생하여 전혀 다른 값이 저장될 수 있기 때문이다.

  1. 오버플로우 | 해당 타입이 표현할 수 있는 최대 표현 범위보다 큰 수를 저장할 때 발생하는 에러
  2. 언더플로우 | 해당 타입이 표현할 수 있는 최소 표현 범위보다 작은 수를 저장할 때 발생하는 에러

예시 코드를 통해 알아보자.

public class MyClass {

	public static void main(String[] args){
		
            byte max = (byte) 245;
            System.out.println(max);
    }

}

 

byte 자료형의 데이터 표현 범위는 -128 ~ 127이다.

하지만 max 변수에 32637을 저장한다면 크기 범위를 넘어서는 행위이기에 오버플로우가 발생하여 잘못된 결과가 저장된다.


2진수 / 8진수 / 16진수

int 자료형은 10진수로 제공되지만 2진수, 8진수, 16진수로 변환하고 싶다면 다음과 같이 약속된 기호를 도입하면 된다.


2. 기본형 타입 - 실수형

자바의 실수 자료형은 float, double이 있다.

과거에는 실수를 표현할 때 float를 많이 사용했지만, 기술의 발달로 메모리 공간이 증가하게 되면서 double형의 사용 빈도수가 늘어나
현재는 double형을 가장 많이 사용한다.

타입 할당되는 메모리 크기 데이터 표현 범위 literal 타입 접미사
float 4 byte (3.4 X 10^-38) ~ (3.4 X 10^38)의 근사값 F 또는 f
double 8 byte (1.7 X 10^-308) ~ (1.7 X 10^308)의 근사값 D 또는 d(생략 가능)

실수의 표현 오차

정수형에도 표현할 수 있는 표현 범위가 제한되어 있듯이, 실수형에도 소숫점을 표현하는 범위가 존재한다.

소숫점은 경우에 따라 무수히 많은 숫자를 포함한 계산 결과를 제공한다. 이러한 한계를 최소화하기 위해서 컴퓨터는 소수를 이진법으로 표현할 때 고정 소수점 방식이 아닌 부동 소수점 방식을 사용한다.

(부동 소수점 방식은 소수점 위치를 고정하지 않고, 가수와 지수로 나누어 표현하는 방식이다.

 

부동 소수점 방식을 사용하여 큰 범위의 실수까지도 표현이 가능하다는 장점이 있지만, 100% 정확하게 표현하는 것이 아니라서, 소수 연산 시 부정확한 실수의 계산값을 초래할 수 있다.

 

이러한 문제에 대해 자바는 두 가지 방법을 제안한다.

  1. 실수를 int, long 정수형 타입으로 치환하여 계산
  2. BigDecimal 클래스 사용

1번의 경우에는 소수점의 실수들을 정수로 바꿀 만큼의 10의 n제곱 연산을 하여 나온 두 정수들을 연산한 후에 다시 실수형으로 되돌리는 방식이다.(ex. 12.34 + 23.45 (치환)-> 1234 + 2345 -> 3579 (다시 변환)-> 35.79)

2번의 경우에는 소수의 크기가 9자리를 넘지 않으면 int를, 18자리를 넘지 않으면 long 타입을 사용하면 되지만 그 이상 넘어갈 경우에는 BigDecimal 클래스를 사용하여 표현 범위를 늘릴 수 있다.


실수의 유효 자릿수

실수의 유효 자릿수는 곧 정밀도를 의미한다.

타입 지수의 길이 가수의 길이 유효 자릿수
float 8 bit 23 bit 소수점 약 6~7자리까지 높은 확률로 정확히 표현
double 11 bit 52 bit 소수점 약 15~16자리까지 높은 확률로 정확히 표현

 

타입에 따라 유효 자릿수가 달라지며, 이 유효 자릿수는 좌측부터 시작되는 숫자 개수이다.


실수 오버플로우 / 언더플로우

실수형에서도 정수형과 마찬가지로 오버플로우, 언더플로우가 발생할 수 있다.

  1. 오버플로우 | 무한대
  2. 언더플로우 | 양의 최소값보다 작은 값으로 0이 된다.

3. 기본형 타입 - 논리형

2진수처럼 두 결과를 제공하는 논리형 자료형은 연산 결과에 대한 결과값이 제공된다.

진위를 가려내는 용도로 많이 사용되므로 if 연산자와 함께 종종 사용된다.


4. 기본형 타입 - 문자형

char형은 하나의 문자에 대한 자료형으로 사용된다.(문장이 아닌 문자 하나이다!)

char a = 'a';

 

위와 같이 사용되며 주의할 점은 작은 따옴표를 사용해야 한다는 점이다.

큰 따옴표는 문장을 의미하므로 char에 사용한다면 에러가 난다.

 

현재 위의 char형인 a는 문자 그대로 'a'를 출력하지만, 아스키코드나 유니코드를 통해서도 'a'를 출력할 수 있다.

  1. 아스키코드 | 1962년 "ANSI"가 정의한 미국 표준 정보교환 코드이며, 1963년 ASA에 의해 미국의 표준 부호가 됨.
    • 7비트의 이진수 조합으로 만들어져 총 129개의 부호 사용 가능
    • 아스키코드의 처음 32개는 프린터나 전송 제어용으로 사용되며, 나머지는 숫자와 로마 글자, 문장 기호를 나타낸다.
  2. 유니코드 | 각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
    • 사용 중인 운영체제, 프로그램, 언어에 관계없이 문자마다 고유한 코드 값을 제공
    • 모든 문자를 16bit로 표현
아스키코드와 유니코드




5. 문자열 자료형

문장을 의미하는 자료형으로, char형이 작은 따옴표로 감쌌던 대신 문자열 자료형은 큰 따옴표로 감싼다.

자바에서 사용되는 String 클래스는 문자열을 위해 제공되었으며, char[] 배열과 같은 동작 방식을 갖는다.

 

String 자료형을 이용하여 문자열 변수를 표현하는 방법은 두 가지가 있다.

String str1 = "Hello World!";
String str2 = new String("Hello World!");

 

두 객체를 비교하였을 때, 이 둘은 같다고 말할 수 있을까? 정답은 "아니다."

 

str1은 리터럴 표기 방식이며, JVM 내 힙 영역의 String Constant Pool에 저장된다.

상수풀에 저장되기 때문에 같은 문자열 value를 가진다면 재사용이 가능하다.

 

str2는 생성자 방식이며, str1과 마찬가지로 JVM 내 힙 영역의 String Constant Pool에 저장되고,
추가로 객체로 생성된다는 차이가 있다.

때문에 동일한 내용이라도 매번 새로운 객체가 생성된다. 이는 메모리 사용의 증가로 이어지므로 리터럴 표기를 권장한다.

 

또한 String 인스턴스는 한 번 생성되면 변경할 수 없다는 특징이 있다.

이를 불변 객체(Immutable Object)라고 불리며, 만약 자바에서 덧셈 연산자를 사용하여 문자열 결합을 수행하면, 기존 문자열의 내용이 변경되는 것이 아닌 내용이 합쳐진 새로운 String 인스턴스가 생성되게 한다.

 

 

출처

1- Inpa Dev 

2- velog.io/@hyeonseob22