[java] 원시타입 Primitive type

참고

Java tutorial : Language Basics-Variables-Primitive Data Types Java tutorial : Numbers and Strings-Numbers

원시타입 Primitive

자바에는 8개의 원시 데이터 타입이 있다.

정수형

데이터 타입 메모리의 크기 표현 가능 범위 비고
byte 1 byte (8bit) -128 ~ 127 큰 배열에서 메모리를 절약용으로 사용. int가 제한되는 곳에서도 쓰인다.
short 2 byte (16bit) -32,768 ~ 32,767 큰 배열에서 메모리를 절약용으로 사용.
int 4 byte (32bit) -2,147,483,648~2,147,483,647 (-231 ~ 231-1) Java SE 8 + 에서는 int를 사용하여 최소값이 0이고 최대 값이 232-1 인 부호없는 32 비트 정수를 나타낼 수 있다.
long 8 byte (64bit) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-263 ~ 263-1) Java SE 8 + 에서는 long을 사용하여 최소값이 0이고 최대 값이 264-1 인 부호없는 64 비트 long을 나타낼 수 있다.

실수형

데이터 타입 메모리의 크기 표현 가능 범위 비고
float 4 byte (32bit) ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) 부동 소수점 숫자의 큰 배열에 메모리 절약용으로 double 대신 float를 사용. 정확한 값을 알수는 없기 때문에 BigDecimal 써야한다.
double 8 byte (64bit) ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) 10진수 값의 경우 이 데이터 타입이 기본이다. 이 것도 역시 통화 같은 정확한 값을 얻어야 하는 곳에 쓰이면 안된다.

기타

데이터 타입 메모리의 크기 표현 가능 범위 비고
boolean 1bit true / fasle 보통 조건식의 결과로 이 데이터 타입을 사용한다.
char 2 byte (16bit) '\u0000' (or 0) ~ \uffff' (or 65,535) 유니코드

문자열 String

String은 원시타입이 아닌 객체이지만 원시타입처럼 선언과 초기화 및 할당을 하여 사용하기도 한다.

원시 타입의 기본값

필드로 선언만 하고 초기화를 하지 않으면 기본으로 컴파일러가 값을 넣는다.
단, 로컬변수에는 해당되지 않는다.

Data Type Default Value (for fields)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object) null
boolean false
int test;
public void testInt(){
  int test1;		
  System.out.println(test); // 0 -  기본값이 출력된다.
  System.out.println(test1); // compile-error: The local variable test1 may not have been initialized
}

원시 타입 선언 및 할당

원시타입은 클래스로부터 생성된 객체가 아니므로 new 키워드를 통해 생성되지 않는다.
리터럴로 값을 할당해 주면 된다.
예를 들면, int i으로 int타입 변수 i선언, = 2474829734;으로 값을 할당해 주면 된다.

byte b = 100;
short s = 10000;
int i = 2474829734;
boolean b = true;
char c = 'a'; // string과 다르게 홑따옴표 안에 넣어야 한다.

정수 리터럴

정수 리터럴의 마지막에 L을 붙이면 그 값은 long 타입이고 그 외에는 int 타입니다. long 타입은 int 타입의 표현 범위를 포함하므로 가능한 일이다.
정수 리터럴로 정수 타입의 byte, short, int, long 타입도 만들 수 있다. 또한 정수 리터럴은 10진수, 16진수, 바이너리를 표현할 수 있다.

int decVal = 26; // The number 26, in decimal
int hexVal = 0x1a; //  The number 26, in hexadecimal
int binVal = 0b11010; // The number 26, in binary
long l = 2474829734L; // 알패벳 L로  long 타입을 명시하여 int와 구분

부동 소수점 리터럴

부동 소수점 리터럴의 마지막에 f 혹은 F를 붙이면 float 타입이고 d 혹은 D를 붙이면 double 타입인데 보통 double 타입은 생략한다.

double d1 = 123.4;
double d2 = 1.234e2; // same value as d1, but in scientific notation
float f1  = 123.4f;

문자와 문자열 리터럴

문자와 문자열리터럴은 유니코드(UTF-16)로 되어 있다. '\u0108' 혹은 "S\u00ED Se\u00F1or" 처럼 유니코드를 표현해야 한다. 위 예시처럼 문자 리터럴은 홑따옴표, 문자열 리터럴은 겹따옴표로 표현해야 한다.
이스케이프 시퀀스를 지원한다.
null 리터럴도 있는데 원시타입을 제외하고 모든 변수에 할당할 수 있지만 존재 여부 판단외에는 거의 할 일이 없다. 그래서 null은 종종 객체를 사용할 수 없음을 나타낼 때 마커로 사용되기도 한다. 클래스 리터럴이란 것도 있다.

숫자 리터럴 언더바(_) 사용

자바 7 이상에서 언더바를 숫자와 숫자리터럴 사이에서 사용할 수 있다. 예를 들어 콤마로 큰 자리 숫자를 구분하는 것처엄 긴 숫자군의 구분을 하기 위해 사용하기도 한다. 단, 값의 처음 혹은 끝, 부동 소수점 리터럴에서 소수점에 인접, F 또는 L 접미사 앞, 숫자 문자열이 예상되는 위치에서 사용할 수 없다.

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;