[자바기초] 2. 변수와 데이터타입

변수와 데이터타입(형)

int num1 = 10;
int num2 = 20;
System.out.println(num1 < num2); 
System.out.println(num1 > num2); // 연산값이 맞는지 CPU한테 물어보고 대답을 받아서 출력되는 과정
================================
true
false


2의 보수법

실수

# 상수

  1. 정의
    상수란 1번만 선언이 가능하고 변하지 않는 수
    선언을 하고 값을 주면 다시 선언해서 값을 할당할 수 없음(초기화를 여러번하는것 안됨) / 변수 ↔ 상수
    • 변수명은 모두 대문자로 사용 / 변수명이 합성어일 경우 snake(_) 표기
    • 변수 앞에 final (상수키워드) 이 붙는 것
       final int MAX_SIZE = 100; 
      
  2. 초기화
    초기화란 값을 처음으로 메모리에 할당하는 것을 말한다
     final double PI; //변수 선언 
     PI = 3.1415; // 변수 초기화
    
  3. 활용
    상수는 중간에 값을 변경하면 안되는 경우에 사용 (값들이 정해져있는 것들에 대해 사용한다)
  4. 리터럴
    자료형을 기반으로 표현이 되는 상수 , 값을 다이렉트로 메모리 할당하는 것
    - 리터럴은 정수는 ‘int’ 실수는 ‘double’을 디폴트로 메모리에 할당하기로 “약속”
    int num = 5 + 7;           //5와 7은 '정수형 리터럴'
    double num2 = 3.3 + 4.5;   //- 3.3 4.5는 '실수형 리터럴'
    

    위에서 5나 7, 3.3, 4.5 모두 연산을 위해서 CPU로 보내기 위해 메모리에 올리는 과정이 동반된다
    그렇기 때문에 5와 7은 int형으로 4byte의 메모리 공간을 할당받게 되고 3.3과 4.5는 double형으로 8byte의 메모리 공간을 할당받게 된다 이렇게 메모리 공간을 확보한 정수와 실수 모두는 메모리 공간에 값이 기록되면 값이 변하지 않기 때문에 리터럴 이라고 표현한다
    (리터럴이라는 표현은 상수라는 표현으로 대신하는 경우가 많다.)

 System.out.println(3147483647 + 3147483647); 
 //error : 리터털은 정수를 기본타입 int로 약속했는데 int의 범위를 넘었기 때문에 long으로 명시를 해줘야함

 System.out.println(3147483647L + 3147483647L); 
 
 - 실수형은 오류가 나지는 않음 (4byte로 잡고싶다면 float 'f' 표시)
 System.out.println(3.000007 + 3.000008); 
 System.out.println(3.000007D + 3.000008D); // 명시하고 싶으면 'D' 또는 'd' 삽입

이스케이프 시퀀스

‘\b’ ‘\t’ ‘\n’ ‘\r’ : 특수문자

System.out.println("AB" + '\b' + 'C' ); 
System.out.println("AB" + '\t' + 'C' ); 
System.out.println("AB" + '\n' + 'C' ); 
System.out.println("AB" + '\r' + 'C' ); 
======================================
AC
AB  C
AB
(enter)C
CB
(enter)

★형 변환 (Casting)

short num1 = 11;
short num2 = 22;
short result = num1 + num2;
System.out.println(result); //error

## 오류 해결01
short num1 = 11;
short num2 = 22;
short result = (short)(num1 + num2);
System.out.println(result);

#오류 해결02
short num1 = 11;
short num2 = 22;
int result = num1 + num2;
System.out.println(result); 

→ error가 일어나는 이유 : 하드웨어적인 문제
short는 4byte로 cpu와 메모리 사이에 선을 16개만 사용해도되지만 하드웨어 특성상 선을 32개를 전부 사용하게 됨 ∴ int 보다 작은 정수형을 ‘연산할때’는 32개의 선을 한번에 쓰기 때문에 int 로 잡게되는 것 (int 보다 작은 범위는 어차피 32개 선을 다 사용하기 때문에 int로 쓰는게 좋다★)

int num1 = 11;
int num2 = 22;
int result = num1 + num2;
System.out.println(result);
  1. 자동형변환
    • ★★★★★ 대전제 : 연산을 할때는 데이터 타입이 ‘반드시’ 같아야한다 ★★★★★
      ; 연산할때 데이터 타입이 다르면 ‘무조건’ 데이터 타입을 맞춰줘야함!! 그런데 출력할때 에러가 안난다? → ‘자동형변환’이 일어났다는 것 ```java int num1 = 50; long num2 = 357125745L; System.out.println(num1 + num2); /* long형으로 맞춰지는것 int로 맞추려면 long을 잘라야되는데 그건 말이안됨 ∴ long으로 맞춰지는것 */

float b = 10.98f; long c = 10; long result = b + c;/* error why? 1. float의 범위가 long보다 넓다 2. 정수로 맞추면 실수의 범위 즉 소수점 뒤에 있는 값들을 날리고 출력되기 때문에 실수로 맞출수 밖에 없음 (자동형변환은 원래의 값을 보존하는쪽으로 변환됨)

2. 명시적형변환(강제형변환) <br>
: 개발자가 직접 강제로 형 변환 시키는 것
```java
double pi = 3.14;
int result = pi; // double로 맞춰야하는데 int로 result 값을 넣으려니 에러남 
System.out.println(result);

#오류 해결

double pi = 3.14;
int result = (int)pi; // int 강제로 형 변환 단, 결과는 소수점 날리고 3이 출력된다
System.out.println(result);
int a = 3;
int b = 4;
		
double result = a/b;
System.out.println(result); 
===============================
 0.0 /* a와b는 정수이기 때문에 나눈값을 더블로 담아도 뒤에 소수점 날림
정확하게 하려면 둘 중 하나를 명시적형변환 즉, double로 만들어주면됨 */

#오류 해결01

int a = 3;
int b = 4;
		
double result = (double)a/b;
System.out.println(result);

#오류 해결02

int a = 3;
int b = 4;
		
double result = a/(double)b;
System.out.println(result);
================================
 0.75

이진수, 8진수, 10진수 표현법

123 (10진수)
0123 (8진수) : 1X8² + 2X8¹ + 3X8
0x123 (16진수) : 1X16² + 2X16¹ + 3X16
byte seven = OB111 or ob111 이진수 = 7