변수의 타입= 기본형(primitive type) + 참조형(reference type)
변수의 타입에는 기본형 8개가 있고 그 외 나머지는 전부 참조형입니다.
기본형은 실제 값(리터럴)을 저장하는 데에 반해, 참조형은 객체의 메모리 주소를 저장합니다.
기본형 종류: boolean, byte, short, char, int, float, long, double
얘네를 종류와 크기별로 정리해 봅시다.
1byte | 2byte | 4byte | 8byte | |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
하나하나 훑어봅시다
그전에 알아두면 좋을 정보
✔️ 변수란? 하나의 값을 저장할 수 있는 메모리 공간
✔️ 리티럴=값
✔️ 1비트(bit)는 2진수 한자리(0 또는 1)를 표현할 수 있습니다.
✔️ 1바이트(byte)=8비트. 1byte는 2진수 8자리를 표현할 수 있습니다.
✔️ 자바에서 데이터를 다루는 최소 단위는 1바이트입니다.
🔹boolean (1byte, 논리형)
boolean은 true와 false만을 값으로 합니다.
boolean 타입은 0(false)과 1(true)로 이루어지기 때문에 1비트만 있어도 되지만, 자바 데이터 최소 단위인 1바이트를 사용합니다.
boolean isReady = false;
🔹byte (1byte, 정수형)
byte는 1byte로 8비트 정수(2진수 8자리)입니다.
0과 1로 표현 가능한 최소값 1000 0000(-128), 최대값 0111 1111(127)
아래 코드로 Byte 최소값, 최대값을 찍어보면 각각 -128과 127이라고 나옵니다.
System.out.println(Byte.MIN_VALUE); //-128 출력
System.out.println(Byte.MAX_VALUE); //127 출력
값이 전부 정수이죠? 자바에서는 byte와 short 타입의 변수에 값을 할당할 때 int 리터럴을 사용합니다.
범위를 벗어나는 128을 할당하면 어떻게 될까요?
byte b = 128;
컴파일 오류가 납니다(java: incompatible types: possible lossy conversion from int to byte)
byte타입 변수에 저장할 수 있는 범위를 벗어났기 때문입니다.
🔹short (2byte, 정수형)
short는 2byte로 16비트 정수를 표현합니다.
자바에서 정수의 기본타입인 int(4byte) 보다 작아서 short라고 부릅니다.
short의 값의 범위를 알아볼까요?
System.out.println(Short.MIN_VALUE); //-32768 출력
System.out.println(Short.MAX_VALUE); //32767 출력
short의 값 표현 범위는 -32768 ~ 32767입니다.
short 값도 byte처럼 int 리터럴을 사용하며, 필요한 경우 캐스팅을 해야 합니다. 예: short s = (short)100;
short는 int보다 작은 범위의 정수를 다룰 때 메모리를 절약하기 위해 사용되지만, 일반적으로 int를 더 많이 사용합니다.
🔹char (2byte, 문자형)
char 타입은 문자형이지만 정수형의 특징도 가집니다.
기본적으로 char는 문자 하나를 저장할 수 있습니다. 문자 리터럴은 '(홑따옴표)로 감쌉니다.
char는 16비트 부호 없는 정수로 표현됩니다. 값의 범위는 0에서 65,535로 모든 유니코드 문자를 표현할 수 있습니다.
0~65535 사이의 정수를 입력하면 유니코드 문자를 반환해 줍니다.
char c = 44403;
System.out.println(c); //굳 출력
char c2 = 'A';
c++;
System.out.print(c); //B 출력
문자 A에 증감연산자로 1을 더했는데 어떻게 B가 출력되는 걸까요?
문자 A의 유니코드 값은 65입니다. 65++은 66이고, 66은 B의 유니코드 값입니다.
이렇게 문자형이지만 산술연산도 가능합니다.
char에 자주 쓰이는 리터럴은 0~9, a-z, A-Z, +, -, *, / 등이 있습니다.
🔹int (4byte, 정수형)
int는 자바의 정수형 기본타입입니다.
기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주합니다.
int 값의 범위는 -2147483648 ~ 2147483647로 대략 -21억 ~ 21억 정도입니다.
int i = 100; //**접두사 없으면 기본은 10진수**
int oct = 0100; //64이다. 접두사 0이 앞에 붙으면 8진수
int hex = 0x100; //256이다. 접두사 0x가 붙으면 16진수
🔹long (8byte, 정수형)
정수 리터럴이 int타입의 허용범위(대략 -21억~21억)를 초과하는 경우 long타입을 사용합니다.
long 타입의 범위는 대략 -922경 ~ 922경입니다.
long타입은 수치가 큰 데이터를 다룰 때 주로 사용됩니다. 대표적인 예가 은행이나 과학 관련 프로그램입니다.
long타입에 int 범위에 해당하는 값을 넣어도 무방합니다.
하지만 int 값 범위를 벗어날 때는 값 끝에 L을 붙여줘야 합니다.
int 범위를 벗어나는 22억 정도의 값을 long 타입에 그대로 넣으면 컴파일 오류가 납니다.
리터럴에 접미사 L을 붙여줘야 정상적으로 컴파일됩니다.
long l = 100;
long l2 = 2222222222L;
long l3 = 2222222222; //에러(java: integer number too large)
🔹float (4byte, 실수형)
float는 보통 소수점 이하 약 7자리까지 나타내는 정밀도를 갖습니다.
float의 표현범위는 양수 기준 1.4E-45에서 3.4E38입니다. 여기서 E는 뭘까요?
지수를 나타내는 표기법입니다. E가 포함된 숫자 리터럴은 지수와 가수로 표현된 소수점이 있는 10진수 실수로 인식합니다.
1.4E-45는 1.4*10⁻⁴⁵과 같고 3.4E38은 3.4*10³⁸과 같습니다
사실 저는 수포자라 머리로는 이해가 안 됩니다. 그냥 double보다 범위가 좁고 정밀도가 낮은 실수형이라고 인식하고 있어요.
자바의 기본 실수형 타입이 double이기 때문에 double과 구별하기 위해 float는 리터럴에 접미사 f를 붙여줘야 합니다.
float f = 3.14f;
float f2 = 3.14; //에러(java: incompatible types: possible lossy conversion from double to float)
🔹double (8byte, 실수형)
double은 자바의 실수형 기본타입입니다. 자바가 실수 리터럴은 기본적으로 double타입으로 해석합니다.
float 정밀도의 두 배라고 하여 double이라고 부릅니다. double은 소수점 이하 15자리까지 오차 없이 나타냅니다.
표현 범위는 4.9*10⁻³²⁴에서 1.8*10³⁰⁸입니다.
double 타입이 float 타입보다 정밀도가 좋기 때문에 보다 정확한 데이터 저장이 가능합니다.
double d = 3.14; //OK
double d2 = 3.14d; //OK. double타입은 d 생략가능
'Back-end' 카테고리의 다른 글
[Java] Servlet 서블릿과 톰캣 서버 이해하기 - 자바 웹 애플리케이션의 기초 (1) | 2024.10.02 |
---|---|
HTTP란? HTTP프로토콜 이해하기 (0) | 2024.09.12 |
MVC 패턴이란? - Model View Controller 디자인 패턴 알아보기 (0) | 2024.08.30 |
[Database] OracleDB 주요 SQL 정리 (0) | 2024.08.22 |
[Java] 자바란 무엇인가? - 자바의 개념, 자바 특징 (0) | 2023.12.09 |