자료형이란?
- 자료형은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정된다.
- 자료형은 크게 기본 자료형(primitive type)과 참조 자료형(reference type)으로 구분할 수 있다.
- 기본 자료형 : 변수와 변수의 데이터가 모두 스택 메모리 영역에 저장된다. 즉, 기본 자료형은 데이터를 저장할 때 변수에 데이터의 실제 값이 저장된다.
- 참조 자료형 : 변수는 기본자료형과 동일하게 스택 메모리에 저장되지만 변수에 할당된 데이터 값은 힙 메모리 영역에 저장된다.
즉, 데이터를 힙 메모리에 저장한 후 힙 메모리의 주소 값이 변수에 저장된다.
- 참조 자료형은 기본 자료형 8가지를 제외한 모든 자료형이며, 직접 정의할 수도 있다.
기본 자료형(primitive type)
자료형 | 자료형의 크기 | 범위 | |
논리 | boolean | 1byte | true, false |
정수 | byte | 1byte | -2⁷ ~ 2⁷-1 |
short | 2byte | -2¹⁵ ~ 2¹⁵-1 | |
int | 4byte | -2³¹ ~ 2³¹-1 | |
long | 8byte | -2⁶³ ~ 2⁶³-1 | |
실수 | float | 4byte | ±(1.40×10⁻⁴⁵ ~ 3.40×10³⁸) |
double | 8byte | ±(4.94×10⁻³²⁴ ~ 1.79×10³⁰⁸) | |
문자 | char | 2byte | 0 ~ 2⁶-1 |
부호 비트 | 가수 비트 | 지수 비트 | 정밀도 | |
float | 1 | 23 | 8 | 7자리 |
double | 1 | 52 | 11 | 15자리 |
- 지수 비트 : 값의 범위
- 가수 비트 : 값의 정밀도
- 부호 비트 : 음수와 양수의 구분
논리 자료형 - boolean
- 참 또는 거짓을 저장할 수 있는 데이터 타입으로 오직 true 혹은 false를 값으로 가진다.
- 따라서 1bit로도 값을 저장할 수 있지만 JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이므로 1byte가 할당된다.
boolean isRainy = true;
boolean isAdult = false;
정수 자료형 - byte, short, int, long
- 할당된 값의 범위가 byte와 short 타입에 저장할 수 없는 범위라면 정수 리터럴은 모두 int 타입으로 인식된다.
또한 long 타입에 정수 리터럴을 저장할 때도 기본적으로 int 타입으로 인식된다. - 따라서 long 타입 리터럴의 경우 리터럴 뒤에 L(l)을 붙여야 정수 리터럴이 long 타입으로 인식된다.
일반적으로 숫자 1과 혼동을 방지하기 위해 대문자 L을 붙인다.
// 예시
byte byteNum = 123;
short shortNum = 12345;
int intNum = 123456789;
long longNum = 12345678910L; // 정수에 L을 붙여 long타입의 정수라고 표기
// 자료형의 범위를 벗어난 값을 할당할 경우 에러 발생
byte byteNum = 130;
short shortNum = 123456;
int intNum = 12345678910;
// 언더바 사용 가능(구분하기 위해서)
int intNum = 12_345_678;
int longNum = 12_345_678_910L; // 정수에 L을 붙여 long타입의 정수라고 표기
실수 자료형 - float, double
- Java는 실수 리터럴을 기본적으로 double 자료형으로 인식한다.
- float형 자료형에 값을 할당하기 위해서는 f(또는 F)를 붙여 float자료형이라고 인식할 수 있게 해야 한다.
기본적으로 f를 붙여 사용한다.
// float형 리터럴을 float형 변수에 할당
float value = 3.14f // long과 동일하게 f를 붙여 float타입의 실수라고 표기
// double형 리터럴을 double형 변수에 할당
double value = 3.141592d;
double value = 3.141592; // f는 생략할 수 없지만 d는 생략 가능
문자 자료형 - char
- char는 문자를 저장하는 자료형으로, 문자를 작은 따옴표('') 안에 표기한다. (큰 따옴표를 사용한 리터럴은 문자열 리터럴로 인식)
- 메모리에는 2진수의 값(0과 1)만 저장할 수 있기 때문에 자바는 모든 문자에 숫자 코드 번호를 부여한 유니코드로 문자를 저장하고 출력한다.
- 따라서 문자 자료형에 문자가 아닌 정수를 할당할 수 있으며, 정수를 할당하게 되면 할당된 정수와 유니코드 번호가 일치하는 문자를 출력하게 된다.
char letter1 = 'a';
char letter2 = 'ab'; // 에러 : 단 하나의 문자만 할당 가능
char letter3 = "a"; // 에러 : 작은 따옴표가 아닌 큰 따옴표 사용
char letter4 = 65;
System.out.println(letter4); // 출력 결과 : A (유니코드 65번의 문자)
타입 변환 (형변환)
boolean을 제외한 기본 자료형 7개는 서로 타입을 변환할 수 있다.
위에서 작성한 내용과 같이 정수나 실수 리터럴을 리터럴에 L 또는 f를 붙여 long, float으로 타입 변환할 수 있다.
long 변수명 = 값 + L;
long 변수명 = 값 + l;
float 변수명 = 값 + F;
float 변수명 = 값 + f;
// 자료형의 크기(범위)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
자동 타입 변환 (자동 형 변환)
- 자료형의 범위가 작은 타입에서 큰 타입으로 변환할 때 (업캐스팅 up-casting)
- 자료형의 크기(범위)가 작은 타입에서 큰 타입으로 변환될 때는 어떠한 데이터 손실도 발생하지 않으며, 컴파일러가 자동으로 타입 변환을 실행한다.(Ex : byte -> int)
- 정밀도가 상대적으로 낮은 타입에서 높은 타입으로 변환할 때 (Ex : 정수 -> 실수)
수동 타입 변환 (강제 형 변환)
- 자료형의 범위가 큰 타입에서 작은 타입으로 변환할 때 (다운캐스팅 down-casting)
- 큰 범위의 타입에서 작은 범위의 타입으로 변환될 때는 데이터의 손실이 발생할 우려가 있으므로 컴파일러가 자동으로 타입 변환을 실행하지 않는다.
- 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장하기 위해서는 개발자가 명시적으로 타입을 변환을 수행해야 한다.
- 타입 변환 방법은 변환 대상 앞에 (변환할 타입명)을 표기하면 된다.
//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환
int intValue = 128;
byte byteValue = (byte)intValue;
System.out.println(byteValue); // 출력 결과 : -128
'Langauge > Java-basic' 카테고리의 다른 글
[Java] 제어문 (조건문 / 반복문 / 제어키워드) (0) | 2022.07.08 |
---|---|
[Java] 연산자 (0) | 2022.07.07 |
[Java] 리터럴 (Literal) (0) | 2022.07.05 |
[Java] 변수 (0) | 2022.07.04 |
[Java] Java - 미완 (0) | 2022.07.04 |