course 2021/JAVA

day02 - variable, datatype, type casting

코딩하는토끼 2021. 8. 12. 00:32

> 변수 variable

어떤 값을 저장하는 공간

하나의 변수에는 하나의 값만, 한가지 타입의 값만 저장될 수 있음

프로그램을 실행할 때마다 저장된 값이 바뀔 수 있음

사용범위 - 블록{ } 안에서 선언된 변수는 해당 블록 안에서만 유효 (블록이 끝나면 메모리상에서 제거됨)

{
    int a = 10;
}

System.out.println(a);
//Error

 

> 변수 선언

<data type> <변수 식별자 이름>; 

int a;

초기화 - 변수 선언 후 처음 값을 저장하는 것, 그 값을 초기값이라고 함

int a;
a = 0;

변수 선언과 초기화를 동시에 하기

int a = 0;

*같은 타입의 변수는 한번에 선언할 수 있다 

int a, b;
int a = 1, b = 2;

예)초기화 후 원하는 값 저장

int a = 1;
a = 500;

예)여러가지 값 저장

int a = 0; 
int b = 3;
a = b;
System.out.println(a);
//3
int a = 2;
int b = 3;
int c = a + b + 5;
System.out.println(c);
//10

*숫자 여러개를 , 를 이용하여 함께 출력할 수 없다

-다른 데이터타입도 마찬가지 (문자, 문자열 등)

int a = 1;
int b = 2;
System.out.println(a, b);
//Error

> data type 

정수형, 실수형, 논리형, 문자형

1. 정수형 - byte, short, int, long

주의. long 선언 시 숫자 뒤에 L 붙여주어야 함 (ex. long a = 10L;)

byte (1byte) < short (2byte) < int (4byte) < long (8byte)

정수(양의정수, 0, 음의정수)

byte → 1byte = 8bit → 2^8=256개의 숫자 표현가능 → 256/2=128, 저장 가능 범위: -128~127 

short → 2byte = 16bit → 2^16=65536개의 숫자 표현가능 → 65536/2=32768, 저장 가능 범위: -32768~32767

int → 4byte = 32bit → 2^32=4294967296개의 숫자 표현가능 → 4294967296/2=2147483648, 저장 가능 범위: -2147483648~2147483647

long → 8byte = 64bit → 2^64 (...이하 생략)

ex. byte a = 128;  ← 불가능하다 

 

*1byte (8bit) _ _ _ _ _ _ _ _ 

첫 번째 칸: 부호비트 음수(1) 양수(0) 

나머지 7칸: 2진법으로 숫자 표현

ex. 20 = 0001 0100

음수표현

1)양수의 2의 보수 취하기(1의 보수 1→ 0, 0→1 취한 후 1 더하기)

2)양수의 뒤에서부터 처음 1이 나올 때까지 (1까지) 그대로 쓰고, 나머지는 1→ 0, 0→1 바꾸기

ex. -20 = 1110 1100

 

*정수형은 2진수, 8진수, 16진수로도 값을 저장 할 수 있음 

숫자 앞에 2진수는 0b, 8진수는 0, 16진수는 0x를 붙여서 저장 

예) int a = 0b1010;  ← 2진수, 10진수로 10

int a = 064;  ← 8진수, 10진수로 4 + 8*6 = 52

int a = 0x3a4c;  ← 16진수, 10진수로 12 + 16*4 + 16*16*10 + 16*16*16*3 = 14924

**16진수 표기법: 10~15를 각각 a~f로 쓴다 (ex. 15 → f, 26 → 1a)

 

2. 실수형 - float, double

float (4byte) < double (8byte)

주의. float 선언 시 숫자 뒤에 F 붙여주어야 함 (ex. float a = 3.14F;)

실수는 소수점 아래에서 작은 오차가 생길 수 있음

float는 소수점 아래 7자리, double은 소수점 아래 13자리까지 유효

*e 표기법  (num1)e(num2) = (num1)*10^(num2)

 double a = 10e3;  ← 10000 

double b = 123e-3;  ← 0.123 

double c = 1.23e3;  ← 1230 

 

3. 논리형 - boolean

boolean (1byte)

값으로 오직 true, false 만 저장

ex. boolean a = true; (O)

boolean a = True; (X)

숫자값을 논리값으로 해석하지 않음 (0≠false, 1≠true)

boolean a = 0; (X)

다른 datatype과 형 변환 불가능하다

 

4. 문자형 - char, String 

1) char 단일문자

값은 반드시 ' ' 안에 쓴다 

ex. char c = 'A'; 

 

*아스키코드 1byte 8bit 2^7=128 (첫번째 칸 제외)

영어알파벳대문자/소문자/숫자0~9 포함한 76개의 문자를 저장

2~4번째 칸: 자료의 유형 - 대문자 100~101, 소문자 110~111, 숫자011

5~8번째 칸: 자료의 값 - A 100 0001 (65), a 110 0001 (97), 0 011 0000 (48)

ex. char c = 65; → 'A'가 저장됨

 

*유니코드 2byte 16bit 2^16=65536 (0~65535)

전세계 언어를 포함 65536가지의 문자값 표현

ex. char c = 44032; → '가'가 저장됨

'\u(16진수)' 저장하면 해당 문자가 저장됨

ex. char c = '\uAC00'; → '가'가 저장됨 (AC00 = 16*16*12 + 16*16*16*10 = 44032)

유니코드 이스케이프 시퀀스 \u : \u다음은 유니코드로 인식됨

16진수 이스케이프 시퀀스 \x : \x다음은 16진수로 인식됨

Invalid unicode 에러 - 주석에 유니코드 이스케이프 시퀀스가 포함된 경우

예)

char c1 = '가';
char c2 = 44032;
char c3 = '\uAC00';
System.out.println(c1 + c2 + c3); //132096 (44032+44032+44032=132096)
System.out.println(c1 + "" + c2 + "" + c3); //가가가

 

2) String 문자열

값은 반드시 " " 안에 쓴다

String의 S는 반드시 대문자로 쓴다

ex. String s = "안녕하세요."; 

String은 기본 데이터형이 아닌 클래스이다

 

*문자열 길이 - 변수명.length()

ex. String st = "안녕하세요";System.out.println( st.length() );5

 

*문자열은 +를 이용해 한번에 출력할 수 있다

String s1 = "안녕하세요.";
String s2 = " 반갑습니다.";
System.out.println(s1 + s2);
//안녕하세요.반갑습니다.

char형처럼 (s1 + "" + s2) 로 출력하지 않아도 됨

 

*문자열과 다른 데이터 타입의 + 연산

문자열과 다른 데이터 타입의 연산 결과는 언제나 문자열이다

문자열 앞의 숫자 연산은 먼저 계산된다

100 + 200 + "300" = 300300

000 + 1 + 4 + "300" = 5300

"300" + 100 + 200 = 300100200

"3" + 000 + 10 = 3010 (000=0)

 

참고자료


> 형 변환 type casting

데이터의 크기: byte < short = char < int < long < float < double (정수형 < 실수형, 표현가능한 값이 더 많기 때문)

String, boolean - 형 변환 불가능

1. 크기가 작은 → 큰 데이터 타입으로 변환: 자동 형 변환, 캐스트 연산자 필요X (단, byte/short 와 char 는 항상 서로 강제 형 변환)

ex. int → double,  long → float,  char → int

ex1. char → int 자동 형 변환 

char c = 'A';
int i = c;
System.out.println(i);
//65

 

2. 크기가 큰 → 작은 데이터 타입으로 변환: 강제 형 변환, 캐스트 연산자 필요O

(type)

데이터 타입이 변환되면서 값이 달라지기도 한다

ex. double → int, int → byte, int → char, byte/short ↔ char

ex1. double → int 강제 형 변환

double d = 3.14;
int i = (int)d;
System.out.println(i);
//3

ex2. int → byte 강제 형 변환

int i = 1000;
byte b = (byte)i;
System.out.println(b);
//-24 (1000 = 0011 1110 1000, byte형은 8bit이므로 앞 네자리 잘림, 1110 1000 = -24)

 

*연산에서의 형 변환

1. int 형보다 작은 type의 연산 (다르지 않더라도) - 자동으로 int형으로 변환되어 연산

ex1. byte + byte = int

byte b1 = 127;
byte b2 = 3;
System.out.println(b1 + b2);
//130 (byte 범위: -128~127, int이기 때문에 byte 범위를 넘어가도 출력됨)

short s = b1 + b2; //Error, int이기 때문

ex2. byte + byte = 결과를 byte로 받고싶은 경우 - (byte)(b1 + b2) 강제 형 변환

byte b1 = 5;
byte b2 = 10;
byte b3 = (byte)(b1 + b2);

ex3. byte/short + char = int

char c = 'A';
byte b = 127;
System.out.println(b + c);
//192 (int 이기 때문에 byte 범위를 넘어가도 출력됨)

ex4. char + char = int

char a = 'A';
System.out.println(a + 1); //66
System.out.println(++a); //B

 

2. 서로 다른 type의 데이터 연산 - 크기가 더 큰 type으로 변환되어 연산

ex1. float + int = float 

float f = 3.14f;
int i = 10;
System.out.println(f + i);
//13.14

ex2. char + int = int

char c = 'A';
int i = 2;
System.out.println(c + i);
//67

ex3. 결과를 char로 받고싶은 경우 - (char)(a + b) 강제 형 변환

int a = 2;
char b = 'A';
System.out.println( (char)(a + b) );
//C

* int / int 를 실수 범위에서 연산하고 싶은 경우

int a = 50;
int b = 4;
double c = (double)a / b;
double c = a / (double)b;  //어느 한 쪽을 double형으로 바꿔주면 double로 연산됨
double c = (double)a / (double)b;  //모두 double형으로 바꿔줘도 됨
//12.5

//만약 아래와 같이 연산하면 결과가 달라진다
double c = a / b;  //12.0  //int로 연산 후 c에 double형으로 저장됨
double c = (double)(a / b);  //12.0  //int로 연산 후 double형으로 변환됨