JAVA
JAVA 데이터 타입
짱코딩러
2022. 7. 6. 14:43
기본형 타입(Primitive type)
크기(byte) | 1 | 2 | 4 | 8 |
정수형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int (default) | long |
실수형 | float | double (default) |
boolean: 1비트, true 또는 false
char: 2바이트, Unicode
byte: 1바이트, -128~127
short: 2바이트, -32768~32767
int: 4바이트, -2^31~3^31-1(-20억~20억)
long: 8바이트, -2^63~2^63-1(-800경~800경)
float: 4바이트, -3.4E38~3.4E38
double: 8바이트, -1.7E308~17E308
+10의 지수를 나타내는 E 또는 e가 붙으면 실수값
예시
public class TypeTest {
public static void main(String[] args) {
// ######boolean 타입
boolean b1 = true;
System.out.println("b1의 값은 :" + b1);
System.out.println("b1의 값은 :" + !b1); //!b1을 적어줬다고 b1이 계속 false인건 아님.
b1 = !b1; // 변수값이 계속 false이길 바라면 아예 값을 넣어줘야 합니다.
System.out.println("b1의 값은 :" + b1);
// int 1 = b1; ->err boolean타입은 형변환이 안 됨.
byte by =127; //byte = 1byte = 정수형
// by = by + 1; ->err 그냥 이렇게 쓰면 1을 int로 인식함.
// 변수가 byte 타입이라 int를 넣으면 크기가 안맞어~~
by++; // by = by + 1 증감 연산자로 증가시켜주시면 댐니당
System.out.println(by);
// -> -128로 출력됨. 왜??! byte 범위(-128~-127)를 벗어나면 다시 첨으루 돌아감 (순환)
by = -128;
by--;
System.out.println(by);
// -> 127로 출력됨. -128이랑 127이 연결되어 있다고 볼 수 있다.
// ######char 타입
char c1 = 'A';
System.out.println(c1);
char c2 = 65; //A의 10진 (아스키코드)
System.out.println(c2);
char c3 = '\u0041'; //A의 16진 u니코드값
System.out.println(c3);
// char 타입은 엄밀히 따지면 정수타입!
// 왜냐, 유니코드 값(아스키코드)을 알아듣자너? 즉, 정수형이랑 호환이 된다~
System.out.println(c1 + '\t' +c2);
// -> 65 + 9 + 65 \t(tab)가 아스키코드에서 9임.ㅡㅡ; \n = 10
// **작은따옴표 지켜주기! 큰따옴표는 문자열~
String s1 = "hello";
System.out.println(s1 + '\n' +c2);
// 만약 하나라도 문자열(String)이라면..? \n이 줄바꿈 역할을 하게 됨.
// ######short 타입
short sh1 = 32767; // 2byte -32768~32767 C언어 호환용.
sh1++;
System.out.println(sh1);
// -> -32768 출력됨.
// ######int 타입
int i1 = 100;
byte v1 = 10;
byte v2 = 20;
// v1 = v1 + v2; ->err 같은 byte타입이라도, 연산하는 순간 int(디폴트)가 됨.
// 같은 정수타입이래도 타입 맞춰줘야돼요~
v1 = (byte)(v1 + v2);
long l1 = 128; //여기서 128이 int인건 맞는데 long의 그릇이 더 크기 때문에 문제없음.
// ######long 타입
long l2 = 9_223_372_036_854_775_807L; //int값(32bit=2^31 -1)을 넘으면 항상 L표시.
long l3 = 2_147_483_648L;
int i2 = 2_147_483_647;
System.out.println("int 최대값 " + i2);
System.out.println("long 최대값 " + l3);
}
}
public class TypeTest2 {
public static void main(String[] args) {
// ######float 타입 float(4byte), double(8byte) 정밀한 값을 쓸 때 사용함니다
float f1 = (float)3.14; //(float)이렇게 표시해줘도 되지만
float f2 = 3.14f; //보통 뒤에 f를 붙여 표시해요
f2 = f1 + f2; //얘는 byte때랑 다르게 잘 됨.
System.out.println(f1);
// ######double 타입
double d1 = 1.5;
System.out.println(d1 + f2); // ->7.7800002~~ 출력값 옘병남
// ->float과 double은 지수부와 가수부에 배정된 메모리 사이즈가 다른데,
// 컴터는 소수점 자리를 맞춰서 계산할 줄 모르기 때문에
// 난리가 난거임~ 그니까 혼용해서 쓰면 정확한 값을 얻을 수 없어요
f1 = 3.1415926535897932846f;
d1 = 3.1415926535897932846; //뒤에 암것두 안붙이면 double
System.out.println(f1); //가수부가 짤림
System.out.println(d1);
System.out.println(3.14/0); // ->Infinity(무한루프)
System.out.println(0/0.0); // ->NaN(Not A Number)
// 0으로 나눌때는 예외처리로 소스에 제한을 두는게 좋음.
}
}
public class TypeTest3 {
public static void main(String[] args) {
// ######String
String toolName = "JDK"; //1.문자형 리터럴로 어사인해서 만들 수 있음. ->상수영역에 들어감.
String toolName2 = "JDK";
String toolName3 = "JDK";
String toolName4 = "JDK";
String toolName5 = "JDK"; //상수 영역에 있는 애를 여러개 만들면 메모리가 낭비됨.
// 하지만 문자열 자체로 어사인해서 문자열 객체를 만들면 상수영역에서 관리가 되기 때문에
// 중복해서 적은 경우 하나만 올려놓고 기존에 있는 객체가 재활용됨.
// 5개가 1개의 객체를 가리키는 셈.
String s1 = new String("JDK"); //2.정석대로 생성자를 이용해 만들 수 있음.
System.out.println(toolName); // ->toolName
// (Hello2030 -10)주소가 찍히지 않는 이유! toString메소드(객체의 정보를 리턴해줌)를 찍어주기 때문에(디폴트 패키지라 그냥 됨)
System.out.println(toolName + 1.8); // ->JDK1.8
// 문자열과 어떤 값을 연산하면 그 값도 문자열로 연산 됨.
System.out.println("(" + 3 + "," + 5 + ")"); // ->(3,5)
// 문자열로 시작했으니까 나머지도 싹 문자열로 출력됨
int i = 0; //변수는 쓰기 전에 항상 초기화~!
System.out.println(i);
String s2 = " "; //얘도 값 넣어줘야돼연
System.out.println(s2); // 공백(0)이 출력됨.
}
}
참조형 타입(Reference type)
String: 문자열. 자바에서 제공하는 클래스(java.lang패키지)
Array
Enumeration
Interface
+기본값
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 |