본문 바로가기
Dev/Java

[Java] 데이터 타입

by Ellen571 2024. 7. 28.
반응형

 

 

데이터 단위

길이는 mm - cm - m - km... 의 단위로 표현이 된다.

데이터도 크기를 나타내는 단위가 있다.

컴퓨터는 모든 정보를 0과 1만 이해하고 연산한다.

전기가 흐르면 1 흐르지 않으면 0

 

한 자리 단위를 1bit라고 한다.

 

1bit = 2^1: 한 자리에서 표현할 수 있는 상태는 2가지(0 or 1)

2bit = 2^2: 두 자리에서 표현할 수 있는 상태는 총 4가지(00 or 01 or 10 or 11)

 

컴퓨터에서는 8bit가 데이터를 저장하는 최소 단위이며 8bit를 1byte라고 한다.

1byte로는 2^8 256(0~255) 가지의 값을 저장할 수 있다.

8 비트(Bit) 1 바이트(Byte)
1024 바이트(Byte) 1 킬로바이트(KB)
1024 킬로바이트(KB) 1 메가바이트(MB)
1024 메가바이트(MB) 1 기가바이트(GB)
1024 기가바이트(GB) 1 테라바이트(TB)

 

 

 

데이터 타입이란 데이터의 형태를 말한다. 이 형태는 크게 두 가지로 나눌 수 있다.

객체객체가 아닌 것

 

객체가 아닌 것을 원시데이터라고 한다.

원시데이터

자료형 데이터 타입 메모리 크기 표현 범위
정수형 byte 1byte -128 ~ 127
short 2byte -32768 ~ 32767
int 4byte -2147483648 ~ 2147483647
long 8byte -9223372036854775808 ~ 9223372036854775807
실수형 float 4byte -3.4E38 ~ +3.4E38
소수점 약 6~7자리까지 높은 확률로 정확히 표현
double 8byte -1.7E308 ~ +1.7E308
소수점 약 15~16자리까지 높은 확률로 정확히 표현
문자형 char 2byte 0 ~ 65,535
논리형
boolean 1byte true, false

 

데이터 타입별로 쓰이는 메모리 크기가 다르다.

사용할 데이터의 최소, 최대 크기를 고려해 데이터 타입을 지정해야한다.

int a1 = 2147483647;
long b1 = 2147483647; // a와 똑같은 변수를 사용하는데 메모리는 2배 사용하여 용량을 낭비한다.

int a2 = 2147483648; // error: int의 최대값인 2147483647을 넘어가 오류가 발생한다.
long b2 = 2147483648; // error: 변수 타입을 long으로 바꿨지만 오류가 난다. 대입 값이 여전히 int타입으로 인식되기 때문이다.
long b2 = 2147483648L; // 그래서 끝에 소문자나 대문자 L을 붙여 타입을 명시해야 한다. 

float f = 2.2F; // float을 사용할 때는 소문자나 대문자 F를 붙어 타입을 명시해야 한다.
double d = 2.2; // double은 타입을 명시하지 않아도 된다.

char a1 = 'a';  // 문자로 표현
char a2 = 97;  // 아스키코드로 표현
char a3 = '\u0061';  // 유니코드로 표현
System.out.println(a1);  // a 출력
System.out.println(a2);  // a 출력
System.out.println(a3);  // a 출력

 

int a1 = 2147483647;
long b1 = 2147483647;

  • a에 long타입을 사용하면 메모리를 2배 사용하여 용량을 낭비한다.

int a2 = 2147483648;

  • error: int의 최대값인 2147483647을 넘어가 오류가 발생한다.

long b2 = 2147483648;

  • error: 변수 타입을 long으로 바꿨지만 오류가 난다. 대입 값이 여전히 int타입으로 인식되기 때문이다.

long b2 = 2147483648L;

  • 끝에 소문자나 대문자 L을 붙여 타입을 명시해야 한다.

float c = 2.2F;

  • float을 사용할 때는 소문자나 대문자 F를 붙어 타입을 명시해야 한다.

double d = 2.2;

  • double은 타입을 명시하지 않아도 된다.

char a1 = 'a', a2 = 97, a3 = '\u0061';

char 타입은 문자값을 표현하는 방식이 다양하다.

첫번째는 문자값, 두번째는 아스키코드값, 세번째는 유니코드값으로 표현한 것이다

 

아스키 코드 ASCII

7비트의 이진수 조합으로 만들어져 총 128개의 부호를 표현할 수 있다.

아스키는 영문 알파벳과 기본 문구들만 인코딩하기 때문에 다른 언어를 표현하기 어렵다. 그래서 유니코드를 만든다.

 

유니코드 Unicode

16비트 32비트 문자 체계, 모든 문자를 다루도록 설계되었다.

 

 

형 변환

int a = 200을 저장하면 메모리에 아래 형태로 저장된다.

00000000 00000000 00000000 11001000

float a = 200.0F로 저장하면 내용이 같을까?

01000011 01001000 00000000 00000000

완전히 다른 값이다.

형식이 다른 데이터들로 연산하려면 한 쪽 데이터를 다른 쪽 데이터 타입으로 전환해야 한다.

 

자동 형 변환

표현 범위가 좁은 데이터 타입에서 넓은 데이터 타입으로 변환되는 것을 말한다.

byte -> short -> int -> long -> float -> double

int a = 3;
float b = 1.0F;
double c = a + b;

 

정수 a와 실수 b를 더하려면 이 중 하나가 형변환해야 한다.

int와 float이 붙으면 int라 float이 된다.

float a + float b가 되는 것이다.

이 결과는 float이지만 double c에 담기면서 최종으로 double이 된다.

 

명시적 형 변환

자동 형 변환이 적용되지 않는 경우에는 수동으로 형 변환을 해야 한다.

float a = (float)100.0;
int b = (int)100.0F;

 

 

 

참고 생활코딩

https://opentutorials.org/module/516/5375

https://opentutorials.org/module/516/5326

https://opentutorials.org/module/516/5330

 

 

반응형

'Dev > Java' 카테고리의 다른 글

[Java] ==와 equals() 차이  (0) 2024.07.30
[Java] && 와 &는 동일하지 않다.  (0) 2024.07.29
[Java] JVM 구조  (0) 2024.07.27
[Java] 자바 프로그램은 어떻게 실행될까?  (0) 2024.07.27
[Java] 프로그래밍은 언제부터 시작?  (0) 2024.07.27