# 7.Java 기본 타입

# **기본 타입**

자바가 제공하는 기본 타입은 8개가 있습니다.

| 정수 타입 | 실수 타입 | 논리 타입 |
| --- | --- | --- |
| int , byte, char , long , short | float, double | boolean |

| 타입 | 메모리사용크기 | 저장되는 값의 허용 범위 |
| --- | --- | --- |
| byte | 1byte/8bit | \-2^7 ~ (2^7-1) / -128 ~ 127 |
| short | 2byte/16bit | \-2^15 ~ (2^15-1) / -32.768 ~ 32.767 |
| char | 2byte/16bit | 0 ~ (2^16-1) / 0 ~ 65535 |
| int | 4byte/32bit | \-2^31 ~ (2^31-1)/ -2.147.483.648~ 2.147.483.647 |
| long | 8byte/64bit | \-2^63 ~ (2^63-1) / -9.223.372.036.854.775.808 ~ 9.223.372.036.854.775.808 |

각 타입에 저장되는 메모리 사용 크기를 알고 있어야 오류없이 잘 사용할수 있습니다.  
예를들어서 2.147.483.647를 넘는 숫자를 변수에 넣어야하거나 출력할때는  
long 타입을 사용해야 합니다.

char 타입은 문자를 사용할때 쓰는 타입입니다.  
char var1 = 'A' 라고 선언하면 //10진수 65(유니코드) 의 값을 가집니다.  
ex)

```java
char var1 = 'A';
int var2 = 'A';
System.out.println(var1);
System.out.println(var2);
```

이렇게 코드를 작성하면  
A를 출력하고  
65를 출력합니다.

byte와 short 그리고 Int , long 의 범위를 잘 확인하고 사용해야 합니다.

#### 실수 타입

float과 double은 실수 리터럴을 저장할 수 있는 타입 입니다.  
메모리 사용 크기와 허용 범위는 이렇게 됩니다.

| 타입 | 메모리사용크기 | 저장되는 값의 허용 범위(양수기준) | 정밀도 |
| --- | --- | --- | --- |
| float | 4byte/32bit | (1.4 *10^-45) ~ (3.4* 10^38) | 7자리 |
| short | 8byte/64bit | (4.9 *10^-324) ~ (1.8* 10^308) | 15자리 |

**double이라는 이름은 float 타입보다 약 2배의 정밀도를 갖는다는 의미에서 붙여진 것이라고 합니다**

#### 논리 타입

Java에서는 참과 거짓을 의미하는 논리 리터럴로 true와 false를 사용합니다.  
논리 리터럴은 1byte 크기의 boolean 타입 변수에 저장할 수 있습니다.

boolean stop = true;  
boolean state = false;

주로 상태값에 따라 조건문이나 제어문의 흐름을 변경하는 데 사용합니다.

### String 타입(클래스 타입)

자바에서 큰따옴표로 감싼 문자들은 문자열이라고 부릅니다.  
작은따옴표는 문자 리터럴을, 큰따옴표는 문자열 리터럴을 구별하는 기호로 사용됩니다.  
문자열을 변수에 저장하고 싶으면 String 타입을 이용합니다.

## 타입 변환

두 변수의 타입이 동일할 경우, 한쪽 변수값을 다른 쪽 변수에 복사해서 저장할 수 있습니다.  
만약 두 변수의 타입이 다르면 값의 저장이 가능할 수도 있고 그렇지 않을 수도 있습니다.

a 변수에 저장된 값을 b 변수에 복사해서 저장하는 코드를 작성해보겠습니다.

```java
byte a = 10;
int b = a;
```

byte 타입의 값이 int 타입의 값으로 변환되었습니다.  
Java에서는 이것을 타입 변환이라고 합니다.  
Java의 타입 변환은 기본적으로 두 가지 방식으로 이루어집니다:

자동 타입 변환: Java는 작은 크기의 데이터 타입을 더 큰 크기의 데이터 타입으로 자동으로 변환합니다.  
예를 들어, `int`를 `long`으로 변환할 때  
ex)  
`int myInt = 100; long myLong = myInt; // 자동 타입 변환`

**강제 타입 변환**  
큰 데이터 타입을 작은 데이터 타입으로 변환할 때, 데이터 손실이 발생할 수 있으므로 명시적으로 변환해야 합니다.  
예를 들어, `long`을 `int`로 변환할 때:  
ex)  
`long myLong = 100; int myInt = (int) myLong; // 강제 타입 변환`

이렇게 타입 변환을 통해 다른 타입의 변수에 값을 할당할 수 있습니다. 자동 타입 변환은 데이터 손실이 없지만, 강제 타입 변환은 데이터 손실이 발생할 수 있으므로 주의해야 합니다.
