데이터 단위
길이는 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 |