본문 바로가기

Android

Java, 기본 데이터 타입

안드로이드는 주로 자바를 이용해 개발합니다. 그래서 자바에 대해 잘 알면 좋습니다.


오늘 다룰 주제는 기본 데이터 타입입니다. Primitive data type 이라고 불리는, 자바에서 제공하는 기본 타입입니다.


레퍼런스:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


1. boolean

boolean 타입은 true 또는 false 두 가지의 값 중 하나를 가집니다. 즉 1비트의 정보를 나타냅니다.

사이즈는 대략 1바이트로 가정합니다.


즉, 공식 문서에 따르면 그 "사이즈"는 정확히 정의되지 않았습니다. Java Virtual Machine 의 구현에 따라 다릅니다.


// boolean boolean1 = 0; // ERROR.
boolean boolean2 = false;
boolean boolean3 = true;
// boolean boolean4 = 1; // ERROR.


C 언어에서는 숫자를 입력할 수 있었지만 (0 이 false, 1이 true), Java 에서는 그렇게 할 수 없습니다. 다만 아래와 같이 수식을 이용하여 입력할 수 있습니다.


boolean boolean4 = (1 == 1);


boolean 의 사이즈를 측정해 보기위해서는 아래 링크에 나오는 방법을 한 번 시도해 보세요. (스택 오버플로우 내공 1위 존 스킷 이 답변한 내용입니다!)

https://stackoverflow.com/questions/383551/what-is-the-size-of-a-boolean-variable-in-java



2. byte

8 비트, 즉 1 바이트 크기를 가지는 데이터 타입입니다.

하드웨어, 펌웨어에서는 1바이트 크기 계산을 자주하기 때문에, 임베디드 통신에서 자주 보게 될 타입입니다.

하드웨어에서는 0x 로 시작되는 16진수를 이용하는 경우가 많은데, 바이트를 다룰때는 16진수가 편하기 때문입니다.


// byte byte1 = -129; // ERROR
byte byte2 = -128; // 최소값.
byte byte3 = (byte) 0x80; // 최소값. 16진수 표기법 Hexadecimal 로 표기가능.
byte byte4 = Byte.MIN_VALUE; // byte 최소값을 표현할 때 제일 많이 쓰는 표현.

byte byte5 = 127; // 최대값.
byte byte6 = 0x7F; // 최대값. 16진수 표기법 Hexadecimal 로 표기가능.
byte byte7 = Byte.MAX_VALUE; // 최대값.
//byte byte8 = 128; // ERROR


3. char

2 바이트이고, 보통 유니코드 한 글자를 담는데 이용할 수 있습니다.

숫자도 당연히 입력할 수 있지만, 글자 하나를 다루는데 주로 쓰입니다.

byte 와 유사하게 hexadecimal 값을 쓸 때가 많습니다.


// char char1 = -1; // ERROR

// 최소값.
char char2 = 0;

// char 최소값을 표현할 때 제일 많이 쓰고, 명확하며, 적절한 표현.
char char3 = Character.MIN_VALUE;

// 최소값. 유니코드 표기법으로, 유니코드의 제일 작은 문자.
char char4 = '\u0000';

// 최대값.
char char6 = 65535;

// char 최대값을 표현할 때 제일 많이 쓰고, 명확하며, 적절한 표현.
char char7 = Character.MAX_VALUE;
char char8 = '\uFFFF'; // 최대값. 유니코드 표기법으로, 유니코드의 제일 큰 문자.
char char9 = 0xFFFF; // 최대값. hexadecimal 표기법.
// char char10 = 65536; // ERROR.

// 곁다리 short.
// 제 경험상 잘 안쓰입니다. 임베디드에선  byte 나 char 를 많이 썼고, 메모리 부족할 일 없는 요새 환경에선
// 그냥 int 를 쓰기 때문에 잘 안쓰입니다.

// short short1 = -32769; // ERROR
// 최소값
short short2 = Short.MIN_VALUE;
short short3 = -32768;
short short4 = 0xFFFF8000;

// 최대값
short short5 = Short.MAX_VALUE;
short short6 = 32767;
short short7 = 0x7FFF;
// short short8 = 32768; // ERROR


4. int

4바이트 크기를 가지고 있습니다. 숫자, 정확하게는 음의 정수와 양의 정수를 표현할 수 있습니다.

제일 흔하게 쓰이는 데이터 타입입니다.


// int int1 = -2147483649; // ERROR

// 최소값
int int3 = -2147483648;
int int4 = Integer.MIN_VALUE;
int int5 = 0x80000000;

// 최대값
int int6 = Integer.MAX_VALUE;
int int7 = 0x7FFFFFFF;
int int8 = 2147483647;
// int int9 = 2147483648; // ERROR



5. float

float 는 소수점을 다룰 수 있는 기본 타입입니다. 32비트, 즉 4바이트입니다.

소수점 = 플로팅 포인트 floating point 연산을 할 수 있어 float 이라고 불립니다.


// 최소값. 이런 표현은 존재하지만, 잘 안쓰이지는 않을 겁니다. 이 범위 한계까지 가는 경우가 드물기 때문이죠.
float float1 = Float.MIN_VALUE;

// 최대값. 마찬가지로 이런 표현 역시 잘 안쓰입니다.
float float2 = 0x0.000002P-126f;

// 최대값. float 의 최대값을 나타내는 가장 적절한 표현이지만, float 에는 이런 연산을 하는 경우가 드뭅니다.
float float3 = Float.MAX_VALUE;

// 최대값.
float float4 = 0x1.fffffeP+127f;


// 참고로 숫자 뒤에 F 또는 f를 붙여주면 자동으로 float 로 인식합니다.
// 하지만, 소수점 계산에는 문제가 있습니다. 자바에서는 IEEE 754 표준방식으로 소수점을 구현했기 때문에,
// 소수점 계산에 오차가 생깁니다.
// https://ko.wikipedia.org/wiki/IEEE_754

float float5 = 1.33f;
float float6 = float1 * 0.33f; // 0.4389 값이어야 하지만, 0.4389002 값이 나옵니다.


// 소수점 문제를 해결하고 싶다면, BigDecimal 타입을 이용하세요.
// 숫자, 소수점 합쳐 자릿수가 Integer.MAX_VALUE 인 경우까지 처리 가능합니다.
BigDecimal bigDecimal = new BigDecimal("0.3123456789012345678901234567890");


// 나눗셈 문제도 있습니다. int 를 int 로 나눈 값은 int 타입으로 캐스팅 됩니다.
int float7 = 20;
float float8 = float7 / 3; // ERROR. 값이 6입니다.
float float9 = float7 / (float) 3; // 값이 6.6666665입니다.
float float10 = float7 / 3f; // 값이 6.6666665입니다.



6. double

float 의 두배, 64비트, 즉 8바이트입니다.

배 정밀도 = 두배의 정밀도를 가지고 있다고 해서 double 입니다.

숫자 뒤에 D 또는 d를 붙이면 자동으로 double 로 인식합니다.


// 최소값.
double double1 = Double.MIN_VALUE;
double double2 = 0x0.0000000000001P-1022;

// 최대값.
double double3 = Double.MAX_VALUE;
double double4 = 0x1.fffffffffffffP+1023;


// 소수점 정밀도, 그리고 int를 나눴을 때 문제 역시 동일하게 발생합니다.
double double5 = 0.10d;
double double6 = double5 * 3d; // 0.30000000000000004F

int double7 = 20;
double double8 = double7 / 3; // ERROR. 값이 6입니다.
double double9 = double7 / (double) 3; // 값이 6.6666665입니다.
double double10 = double7 / 3d; // 값이 6.6666665입니다.


7. long

int 의 두 배인 64비트형 정수입니다. 즉 8바이트 입니다.

실제 코딩에서는 unix time 형태로 표현된 현재 시간을 나타내는데 주로 쓰입니다.

숫자 뒤에 L 또는 l 을 붙이면 long 타입으로 인식합니다.


// long long1 = -9223372036854775809L; // ERROR
long long1 = Long.MIN_VALUE;
long long2 = 0x8000000000000000L;
long long3 = -9223372036854775808L;

long long4 = Long.MAX_VALUE;
long long5 = 0x7FFFFFFFFFFFFFFFL;
long long6 = 9223372036854775807L;

// long long7 = 9223372036854775808L; // ERROR