Devlog

데이터 타입 본문

언어/Java

데이터 타입

ehdrb92 2023. 6. 7. 21:26

정수 타입

정수 타입은 총 5개로, 다음과 같이 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다.

타입 메모리 크기 저장되는 값의 허용 범위
byte 1byte 8bit -128 ~ 127
short 2byte 16bit -32,768 ~ 32,767
char 2byte 16bit 0 ~ 65535 (유니코드)
int 4byte 32bit -2,147,486,648 ~ 2,147,483,647
long 8byte 64bit -9,223,372,036,854,775,808 ~ -9,223,372,036,854,775,807
  • 2진수: 0b 또는 0B로 시작하고 0과 1로 작성
int x = 0b1011; // 10진수 = 11
  • 8진수: 0으로 시작하고 0~7 숫자로 작성
int x = 013; // 10진수 = 11
  • 16진수: 0x 또는 0X로 시작하고 0~9 숫자나 A~F 또는 a~f로 작성
int x = 0xB3; // 10진수 = 179

문자 타입

하나의 문자를 작은 따옴표로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장되는데, 유니코드는 세계 각국의 문자를 0~65535 숫자로 매핑한 국제 표준 규약이다.

char var1 = 'A'; // 'A' 문자와 매핑되는 65로 대입
char var2 = '가'; // '가' 문자와 매핑되는 44032로 대입

char 타입의 변수를 단순 초기화 목적으로 하려면 작은 따옴표안에 빈 공백 하나를 넣어줘야 컴파일 에러가 발생하지 않는다.

char c = '' // 컴파일 에러
char c = ' ' // 컴파일 성공

실수 타입

타입 메모리 크기 저장되는 값의 허용 범위 (양수 기준) 유효 소수 이하 자리
float 4byte 32bit 1.4*10^-45 ~ 3.4*10^38  7자리
double 8byte 64bit 4.9*10^-324 ~ 1.8*10^308 15자리

double 타입이 float 타입보다 큰 실수를 저장할 수 있고 정밀도 또한 높다.

 

자바는 IEEE 754 표준에 근거해서 float 타입과 double 타입의 값을 부동 소수점 방식으로 메모리에 저장한다.

논리 타입

참과 거짓을 의미하는 논리 리터럴은 true와 false이다.

boolean stop = true;
boolean stop = false;

문자열 타입

큰 따옴표로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다. 이들은 문자열이라고 부르면 String 타입을 사용해야 한다.

char var1 = "A"; //컴파일 에러
char var2 = "홍길동"; //컴파일 에러

String var1 = "A"
String var2 = "홍길동"

주의해야 할 것은 String 타입의 자바의 기본 타입이 아닌 참조 타입으로 데이터가 힙 영역에 객체로 저장된다.

자동 타입 변환

자동 타입 변환은 값의 허용 범위가 작은 타입의 데이터를 허용 범위가 큰 타입으로 대입될 때 발생한다.

byte byteValue = 10;
int intValue = byteValue; //여기에 대입된 byteValue는 자동으로 int 타입으로 변환

char charValue = 'A';
int intValue = charValue; //65로 저장

byte byteValue = 65;
char charValue = byteValue; //컴파일 에러

byte 타입을 char 타입으로 대입할 때 에러가 발생하는 이유는 char 타입은 음수를 포함하지 않지만, byte는 포함하기 때문이다.

강제 타입 변환

큰 허용 범위의 타입을 작은 허용 범위의 타입으로 대입하는 것은 기본적으로 불가능하다. 하지만 캐스팅 연산자 괄호 ()를 사용하여 큰 허용 범위의 데이터를 쪼개어 변환하는게 가능하다.

int -> byte

int intValue = 10;
byte byteValue = (byte) intValue;

int 타입의 데이터를 byte 타입으로 쪼개면서 4byte에 해당하는 int 타입에서 앞쪽 3byte가 삭제되면서 1byte에 해당하는 부분만 남기게 된다.

실수 -> 정수

실수 타입은 정수 타입보다 항상 큰 허용 범위를 가진다. 따라서 해당 변환에서는 항상 강제 타입 변환이 필요하다.

double doubleValue = 3.14;
int intValue = (int) doubleValue; // 정수 부분인 3만 저장

연산식에서 자동 타입 변환

자바는 실행 성능 향상을 위해 컴파일 단계에서 연산을 수행한다.

byte result = 10 + 20; //컴파일: byte result = 30

자바 컴파일러는 컴파일 단계에서 10+20을 미리 연산해서 30을 만들고 result 변수에 30을 저장하도록 바이트 코드를 생성한다. 따라서 실행 시 덧셈 연산을 하지 않아 실행 성능이 좋아진다.

 

하지만 정수 리터럴이 아닌 변수가 피연산자로 사용될 때는 바이트 코드 실행 시 연산을 수행하게 된다. 또한 장수 타입 변수가 피연산자로 사용될 때는 결과 값은 int로 자동 변환되게 된다.

byte x = 10;
byte y = 20;
byte result = x + y; //컴파일 에러
int result = x + y;

결과 값은 무조건 int로 변환되기 때문에 byte로 명시하면 컴파일 에러가 발생한다.

 

그리고 특별한 이유가 없다면 결과 값은 무조건 int 타입이 되기 때문에 그 전에 피연산자에 해당하는 변수도 int 타입으로 선언하면 타입 변환이 발생하지 않아 실행 성능이 개선된다.