종류
기본타입 : byte, short, char, int, long, float, double, boolean
참조 타입 : 배열, 클래스 -> 나중에 배울 예정
자료형이 왜 필요한가
1. 현실적인 문제 (비용)
- 냉장고, TV 등 가전제품(Device)에도 컴퓨터의 CPU, 기억장치(메모리)와 같은 역할이 들어있다.
- 가전제품은 복잡한 기능이 필요없고 0과 1만 저장하면 되는 간단한 작업만 수행
- 그럼에도 굳이 int type (4byte) 메모리를 넣을 필요가 있을까.
- 단가가 올라갈 뿐이다
- 결론 : 제품의 상품성을 위해 자료형이 존재
2. 해석의 차이 (아래 아스키코드, 인코딩 먼저 읽어보고 오기)
- 임베디드, IOT -> 디바이스 => "C"
- 어떤 자료형을 선택하느냐에 따라 그걸 어떻게 해석하냐가 달려있음
int var1 = 65;
char var2 = 65;
char var3 = 'C'; //----> 67 인코딩
System.out.println(var1); //65
System.out.println((char)var1); //A
System.out.println(var2); //A
System.out.println(var3); //C
System.out.println(var1+2); //67 --> 'C' 디코딩
}
- 숫자로 표현 ->int
- 문자로 표현 -> char
결론 : 변수 타입에 따라 출력값이 다름
int d1 = 3;
double d2 = 3;
System.out.println(d1); //3
System.out.println(d2); //3.0
- 정수로 표현 -> int
- 소수로 표현 -> double
결론 : 메모리에 있는 값을 해석하는 방법의 본질은 자료형이다
언어별 비트 범위 차이
- 맨앞 비트는 부호를 의미함
예) 1000 0001 (2) = -127
- 자바에서 바이트로 최댓값은 127, C에서 최댓값은 255
- 자바는 항상 signed, C는 unsigned byte 기능이 있어서 0 ~ 255 까지 가능
- 자바와 C의 8비트 표현시 가짓수는 같고 범위만 다름
- 자료형에 유리한 언어는 "C"다
메모리 사용 크기
아스키코드
- 키보드에 있는 문자들을 숫자로 1:1 maping 해놓은 표
인코딩
- 인코딩을 어떻게 하느냐에 따라 깨지기도 하고 잘 출력되기도 함
정수 리터럴
- 2진수 : 0b로 시작
- 8진수 : 0으로 시작
- 10진수 : 그냥 씀
- 16진수 : 0x로 시작
int var1 = 0b1011; //11
int var2 = 0206; //134
int var3 = 365; //365
int var4 = 0xb3; //179
int a = 031; // 3*8+1=25
int b = 0b000000000000000000011; // 3
int c = 0x0f; // 15*1 = 15
** 리터럴 (Literal) 의미
- 숫자면 그 숫자 그자체를 의미, 데이터 자체를 의미한다.
- 변하지 않는 데이터
음수의 2진수 구하는법
1단계. 음수에서 (-)부호를 제거한 수를 2진법으로 변환한다.
2단계. 모든 비트를 0 -> 1 로, 1 -> 0 으로 반전시킨다.
3단계. 맨오른쪽 비트에 1을 더한다.
예시) -5 의 비트 구하기
1단계. -5 에서 (-)부호를 제거하면 5가 되고 2진수로 0000 0101 이다.
2단계. 모든 비트를 0 -> 1 로, 1 -> 0 으로 반전시키면 1111 1010 이 된다.
3단계. 맨오른쪽 비트에 1을 더하면 1111 1011 이 된다.
10진수 계산 : 5 + (-5) = 0
2진수 계산 : 0000 0101 + 1111 1011 = 0000 0000
결과 : -5 (2) = 1111 1011
**이렇게 하는 이유?
이 방법으로 안하면 5 + (-5) = 0 으로 계산되지 않는 문제점이 발생하므로
범위를 벗어났을때 생기는 에러
byte var1 = -128;
byte var2 = -30;
byte var3 = 0;
byte var4 = 30;
byte var5 = 127;
byte var6 = 128; //컴파일 에러
// 에러 설명 - Type mismatch: cannot convert from int to byte
/*
* 기본적으로 자바 컴파일러는 정수 리터럴을 int 형으로 간주한다.
* long 타입임을 명시적으로 컴파일러에게 알려줘야 한다.
*/
long var1 = 10; // 10
long var2 = 20L; // 20
long var3 = 1000000000000; // 에러 발생
long var4 = 1000000000000L; // 10000000000 (8byte)
char 타입
char c1 = 'A'; // 문자를 직접 저장
char c2 = 65; // 65번째 아스키코드 = A
char c3 = '\u0041'; // 4 * 16 + 1 = 65
char c4 = '가'; // 문자를 직접 저장.
char c5 = 44032; // 44032번째 아스키코드 = 가
char c6 = '\uac00'; // 10*16^3 +12*16^2 = 44032
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); // 가
String 타입
//char 타입 : 문자 , ' '
//String 타입 : 문자열 , " "
char var1 = "A"; // 에러 발생
char var2 = "홍길동"; // 에러 발생
String var1 = "A";
String var2 = "홍길동";
이스케이프 문자
- \t 탭만큼 띄움
- \n 줄 바꿈
- \r 캐리지리턴
- \" " 출력
- \' ' 출력
- \\ \출력
- \u16진수 16진수 유니코드 해당 문자 출력
System.out.println("Hello");
System.out.print("Hello\n");
System.out.println("번호\t이름\t직업");
System.out.print("행 단위 출력\n");
System.out.print("행 단위 출력\n");
System.out.println("우리는 \"개발자\" 입니다.");
System.out.print("봄\\여름\\가을\\겨울");
실수타입
1. 실수값 저장
float var1 =3.14; // 컴파일 에러
float var2 = 3.14f; // 3.14
double var3 = 3.14; // 3.14
2. 정밀도 테스트
float var4 = 0.1234567890123456789f;
double var5 = 0.1234567890123456789;
// 출력할때 타입별 비트값에 의해 보장이 안되는 뒷부분은 잘림
System.out.println("var4: " + var4); // var4: 0.12345679
System.out.println("var5: " + var5); // var5: 0.12345678901234568
** float 타입 vs double 타입
- float 타입 : 4byte, 소수점 이하 7자리까지 허용
- double 타입 : 8byte, 소수점 이하 15자리까지 허용
-> double 타입이 float 타입보다 두 배 이상 더 정밀하다.
3. 실수 리터럴 (e를 사용)
double var6 = 3e6; // 3.0 * 10^6
float var7 = 3e6F; // 3.0 * 10^6
double var8 = 2e-3; //2.0 * 10^(-3)
System.out.println("var6: " + var6); // var6: 3000000.0
System.out.println("var7: " + var7); // var7: 3000000.0
System.out.println("var8: " + var8); // var8: 0.002
** e를 사용해야하는 이유 : 0.00...000003 등의 형태로 쓰면 0의 갯수를 세기 불편함
논리타입 (boolean 타입)
사용하는 예 ) 조건문과 제어문의 실행 흐름을 변경하는데 자주 사용된다.
boolean stop = true;
if(stop) {
System.out.println("중지합니다.");
}
else {
System.out.println("시작합니다.");
}
21.07.21
'👨💻 2. 웹개발_Back end > 2-1 Java' 카테고리의 다른 글
[JAVA] 02-4 변수와 시스템 입출력 (0) | 2021.07.23 |
---|---|
[JAVA] 02-3 타입변환 (0) | 2021.07.21 |
[JAVA] 02-1 변수 (0) | 2021.07.20 |
[JAVA] 01-3 자바 프로그램 개발 과정 (0) | 2021.07.20 |
[JAVA] 01-2 이클립스 개발 환경 구축 (0) | 2021.07.20 |
댓글