기본 데이터 타입 (Primitive)
정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입
구분 |
기본 타입 |
메모리 사용 크기 |
저장가능한 값 범위 |
정수 |
byte |
1byte (8bit) |
-27 ~ 27-1 (-128 ~ 127) |
char |
2byte (16bit) |
0 ~ 216-1 (유니코드 \u0000 ~ \uFFFF, 0 ~ 65,535) |
|
short |
2byte (16bit) |
-215 ~ 215-1 (-32,768 ~ 32,767) |
|
int |
4byte (32bit) |
-231 ~ 231-1 |
|
long |
8byte (64bit) |
-263 ~ 263-1 |
|
실수 |
float |
4byte (32bit) |
(+/-)1.4E-45 ~ (+/-)3.4028235E38 |
double |
8byte (64bit) |
(+/-)4.9E-324 ~ (+/-)1.7976931348623157E308 |
|
논리 |
boolean |
1byte (8bit) |
true, false |
정수 타입일 때 n 비트크기 일 경우 아래와 같은 범위를 갖는다.
(단, 항상 양수 범위 갖는 char 타입 예외)
-2n-1 ~ 2n-1-1
자바에서는 정수 연산을 기본적으로 int 로 처리한다.
실수형 float, double 의 메모리 사용은 int, long 과 같지만, 부동소수점 방식으로 저장되어
더 큰 범위의 값을 저장할 수 있다.
자바에서 실수 연산은 기본적으로 double 로 처리한다.
byte
8 bit 구성으로 -128 에서 127 까지 표현 가능하다.
최상위 비트(MSB : Most Significant Bit, 제일 앞 비트)는 정수 부호 값을 결정한다.
2 : 기본 2진법 표현
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
-2 : 1의 보수에 +1 을 해서 표현한다. (2의 보수)
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
음수의 2진수 표현 방식 방법에는 3가지가 존재한다.
1. 최상위 비트(부호 비트)를 사용, 0이면 양수, 1이면 음수
ex) 3 = 0000 0011
-3 = 1000 0011 (최상위 비트만 바꾼다.)
두 수를 더한다면?
1000 0110 = -6 (0이 나와야 하므로 적용할 수 없다.)
0의 표현이 두 가지로 나타날 수 있다.
+0 = 0000 0000
-0 = 1000 0000
음수 부 값의 크기 비교 시 서로 맞지 않다.
-3 = 1000 0011
-4 = 1000 0110
(결과적으로 -3 < -4 가 되어버린다.)
2. 1의 보수 사용 (0을 1로 뒤집은 것이 1의 보수)
ex) 3 = 0000 0011
-3 = 1111 1100
두 수를 더하면?
1111 1111 = -0 0을 정확하게 표현할 수 있다.
음수 부 값의 크기 비교 시 서로 맞는다.
-128 = 1000 0000
-127 = 1000 0001
(-128 < -127)
하지만 아직도 0의 표현이 2가지이다.
+0 = 0000 0000
-0 = 1111 1111
3. 2의 보수 사용 (1의 보수에 1을 더한 값)
1의 보수 표현방식에서 ( - ) 방향으로 1 만큼 쉬프트 시킨다.
두 수를 더하면?
+1 = 0000 0001
-1 = 1111 1111
0 = 0000 0000 으로 만족한다.
(초과된 비트는 사라진다.)
음수 부 값의 크기 비교
-128 = 1000 0000
-1 = 1111 1111
(-128 < -1) 일치
0의 표현도 한 가지만 존재
0 = 0000 0000
따라서 컴퓨터는 음수를 표현할 때 2의 보수를 사용한다.
최대값 127을 넘어가면 다시 -128부터 시작하게 된다. (overflow) : 오버플로우
public class GarbageValueExam {
public static void main(String[] args) {
byte var1 = 125;
int var2 = 125;
for (int i = 0; i < 5; i++) {
var1++;
var2++;
System.out.println("var1 : "+var1+ "\t" +"var2 : "+var2);
}
}
}
char
음수 범위 없이 유니코드(0 ~ 65535) 범위를 저장한다.
문자 직접 저장, 10진수 저장, 16진수 저장이 가능하다.
public class CharExam {
public static void main(String[] args) {
char c1 = 'A'; //문자 직접 저장
char c2 = '65'; //10 진수로 저장
char c3 = '\u0041'; //16 진수로 저장
char c4 = '가'; //문자 직접 저장
char c5 = 44032; //10 진수로 저장
char c6 = '\uac00'; //16 진수로 저장
int uniCode = c1; //유니코드 얻기 (int형으로 저장)
System.out.println(c1); //A
System.out.println(c2); //A
System.out.println(c3); //A
System.out.println(c4); //가
System.out.println(c5); //가
System.out.println(c6); //가
System.out.println(uniCode); //65
}
}
* 문자열을 저장하려면 " " 큰 따옴표로 감싸는 String (참조 변수)를 이용해야 한다.
String name = "케피";
* 주의! char 타입 변수에 문자를 대입하지 않고 초기화 할 목적으로 빈 문자를 대입 시
char c = ''; // X 공백(유니코드:32)이 없으면 컴파일 에러 발생!
char c = ' '; // O
참고) String 변수는 "" 연달아 붙인 빈 문자 가능하다.
String str = ""; // O
short
C언어와 호환을 위해 사용, 자바에서는 잘 사용하지 않음
int
정수 연산의 기본 타입
byte, short 타입을 연산 시 int 타입으로 변환되고, 연산 결과 역시 int 타입이 된다. (자동 타입 변환)
어떠한 진수로 입력하더라도 모두 2진수로 변환되어 비트에 저장된다.
10 : 00000000 00000000 00000000 00001010 (4byte)
public class IntExam {
public static void main(String[] args) {
int var1 = 10; //10 진수로 저장
int var2 = 012; //8 진수로 저장
int var3 = 0xA; //16 진수로 저장
System.out.println(var1); //10
System.out.println(var2); //10
System.out.println(var3); //10
}
}
long
수치가 큰 데이터를 다루는 프로그램에서 이용
초기화 시 정수값 뒤에 l 이나 L 을 붙일 수 있다. (컴파일러에게 long 타입임을 알린다.)
int 타입 저장 범위를 넘어서는 큰 정수는 l or L을 붙여야 한다.
public class LongExam {
public static void main(String[] args) {
long var1 = 10;
long var2 = 20L;
//long var3 = 1000000000000 컴파일 에러 (범위 초과)
long var4 = 1000000000000L;
System.out.println(var1); //10
System.out.println(var2); //20
System.out.println(var4); //1000000000000
}
}
float, double
float : 부호 (1bit) + 지수 (8bit) + 가수 (23bit) = 32bit = 4byte
double : 부호 (1bit) + 지수 (11bit) + 가수 (52bit) = 64bit = 8byte
기본 타입이 double 이므로, float 타입에 저장하려면 실수 리터럴 뒤에 f 나 F 를 붙여야 한다.
float var1 = 3.14; //붙이지 않으면 컴파일 에러!!
float var2 = 3.14F; // O
정수 리터럴에 10의 지수를 나타내는 e 또는 E가 포함되어 있으면,
실수 타입 변수 (float, double)에 저장해야 한다.
double var3 = 3e6 //3000000
double var4 = 2e-3 //0.002
public class FloatDoubleExam {
public static void main(String[] args) {
//실수 저장
double var1 = 3.14;
float var2 = 3.14F;
//정밀도 테스트
double var3 = 0.1234567890123456789;
float var4 = 0.1234567890123456789F;
System.out.println("var1 : "+var1); //var1 : 3.14
System.out.println("var2 : "+var2); //var2 : 3.14
System.out.println("var3 : "+var3); //var3 : 0.123456789012345678
System.out.println("var4 : "+var4); //var4 : 0.123456789
//e 사용
int var5 = 3000000;
double var6 = 3e6;
float var7 = 3e6F;
double var8 = 2e-3;
System.out.println("var5 : "+var5); //var5 : 3000000
System.out.println("var6 : "+var6); //var6 : 3000000.0
System.out.println("var7 : "+var7); //var7 : 3000000.0
System.out.println("var8 : "+var8); //var8 : 0.002
}
}
boolean
조건문과 제어문의 실행 흐름 변경하는데 이용
public class BooleanExam {
public static void main(String[] args) {
boolean stop = true;
if(stop) {
System.out.println("중지");
} else {
System.out.println("시작");
}
}
}
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 1. 변수, 기본 데이터 타입, 연산자' 카테고리의 다른 글
6. Java 자바 - 이항 연산자, 삼항 연산자 (0) | 2020.04.24 |
---|---|
5. Java 자바 - 단항 연산자 (0) | 2020.04.24 |
4. Java 자바 - 연산자 종류, 연산자 우선순위 (0) | 2020.04.22 |
3. Java 자바 - 자동 타입 변환, 강제 타입 변환 (2) | 2020.04.21 |
1. Java 자바 - 변수와 리터럴 (1) | 2020.04.20 |