본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 02-2 기본 타입

by 달님🌙 2021. 7. 21.
반응형

출처  기본자료형 & 참조자료형 — NO XX KEEP GOING ON (tistory.com)

 

종류

기본타입 : 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"다

 

메모리 사용 크기

JAVA 자료형

 

아스키코드

 

아스키 코드

  - 키보드에 있는 문자들을 숫자로 1:1 maping 해놓은 표

 

 

인코딩

활성 코드 페이지 949

 

활성 코드 페이지 65001

 

- 인코딩을 어떻게 하느냐에 따라 깨지기도 하고 잘 출력되기도 함

 

 

정수 리터럴

- 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 으로 계산되지 않는 문제점이 발생하므로

 

-5 비트 계산

 

범위를 벗어났을때 생기는 에러

 

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

반응형

댓글