일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- kurento
- onicecandidate
- 기초
- 표준에러
- fastapi
- revert
- 표준출력
- 쿠버네티스
- Dockerfile
- 리눅스
- 독스트링
- 자바스크립트
- 미니큐브
- Python
- Docker
- 6.6.0
- JavaScript
- 7.0.0
- minikube
- 위코드
- docstring
- 파이썬
- corsmiddleware
- RTCP
- kubernetes
- Docker Compose
- underscore
- 명령어
- 도커
- stash
- Today
- Total
Devlog
데이터 타입 본문
정수 타입
정수 타입은 총 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 타입으로 선언하면 타입 변환이 발생하지 않아 실행 성능이 개선된다.