[Java 기초] 자바 변수
변수와 리터럴
ex. int : 정수 타입 “키워드”
- int i = 1; 이 있을때
➡️int : 정수타입 키워드
➡️ i : 하나의 값을 가질 수 있는 공간
➡️변수 1은 "정수 리터럴(literal) 1"을 말한다. - 리터럴(literal) : 변수에 입력되는 값
- 컴퓨터는 “정수 하나”를 저장하기위해 메모리에 "4byte 크기의 저장공간"을 필요로함
➡️이 메모리의 영역을 변수라고 하는 것
❓키워드
➡️java에서 정한 “예약어”
❓예약어 (=키워드) 종류
➡️class, public, static, while 등등
변수
변수의 타입
1.기본형 타입
- byte = 1byte
- short = 2byte
- int = 4byte (정수형) : 32비트의 수 표현
- long = 8byte (정수형) : 64비트의 수 표현
➡️리터럴(값)뒤에 L, l을 붙임 (ex. long x = 5L;)
➡️큰 숫자 저장 시 long타입 사용 (자바는 기본적으로 숫자는 int형 으로 인식)
- long타입 변수 y
- 숫자 5L은 long타입 리터럴
- 대문자 L을 값 뒤에 붙여서 주로 사용 - float = 4byte (실수형) : 32비트의 수 표현
➡️리터럴(값)뒤에 F, f를 붙임 (ex. float f = 2F;)
➡️소수 부분 6자리까지 오차없이 표현 - double = 8byte (실수형) : 64비트의 수 표현
➡️리터럴(값)뒤에 D, d를 붙이지만 생략 가능
➡️보통 실수를 표현 시 double 사용
➡️float보다 더 큰 값을 표현할 수 있고 소수점 이하에서 더 정교한 값을 표현가능
➡️소수 부분 15자리까지 오차없이 표현 - char = 2byte (문자형)
- boolean = 1byte (논리형)
➡️true나 false는 자바에서 미리 지정한 예약어, boolean의 기본값은 false
➡️컴퓨터의 “자료를 표현하는 최소 단위가 1byte”이지만 1비트로도 참과 거짓은 표현할 수 있다.
💡0은 거짓, 1은 참
➡️모두 소문자로 시작하며 정해진 메모리를 가진다. 즉 기본형 변수는 “값을 가진다”는 것이다.
문자(char) 타입
- 문자는 작은 따옴표로 묶음 (ex. char c = 'c';)
- 문자는 2byte 크기를 가지며 유니코드 값을 가진다.
➡️ 2byte 정수 타입이기도 하다. 따라서 char타입은 0~65535까지 저장가능한 정수 타입이기도함 - 유니코드 값 : 0000~0FFF 까지의 값을 가짐 2byte를 16진수로 표현한 것
➡️F : 16진수를 의미
➡️10진수 : 0~9까지 표현하는 것
➡️16진수 : 0~15까지 표현하는 것 (10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F) - 4bit가 표현할 수 있는 수 : 0000~1111 (즉 0~15까지 표현 가능)
➡️4bit 하나에 16진수를 표현 가능 - 1byte로 표현할 수 있는 16진수 : 00~FF까지 (4bit가 2개)
- 2byte로 표현할 수 있는 16진수 : 00 00 ~ FF FF까지 (4bit가 4개)
❓동일한 2byte크기의 char타입과 short타입 차이점
➡️둘다 2byte의 정수타입인데 short는 음수, 0, 양수를 표현하고 char는 0과 양수를 표현합니다. 💡이 차이점
▶️실습 : char타입을 int타입으로, int타입을 char타입으로 변환
char to int
char c1 = ‘a’;
System.out.println((int)c1);
- (int) 을 붙여서 강제 형변환을 시켜줄 수 있다 (명시적 형변환)
int to char
char c2 = (char)97;
System.out.println(c2);
- 97번째 유니코드 문자를 c2에 저장
▶️기본형 타입 메모리 표현
ex. int i = 1;
1byte 2byte 3byte 4byte
00000000 00000000 00000000 00000001
이처럼 1byte당 8bit로 채워진다. 가장 마지막인 최우측 비트만 1로 저장되어 1을 표현 (➡️2의 0제곱 = 1)
ex. 1byte = 8bit
byte x = 0;
➡️8개의 비트 방에 0이 모두 채워지게됨
byte x = 1;
➡️8개의 비트 방에 10진수를 2진수로 바꿔 표현 (00000001)
2^0 (2의 0제곱) = 1
1byte(=8비트)로 표현할 수 있는 가장 큰 수는 모두 1로 채워지는 것 (11111111)
💡가장 좌측의 비트가 0이면 양수, 1이면 음수를 나타냄
즉 가장 큰 수는 가장 좌측의 "부호비트"를 제외하고 01111111 이므로 양수(1111111 = 127)을 의미
➡️양수 127이 1byte로 표현할 수 있는 가장 큰 수
▶️실습 - 양수 1을 음수로 바꾸는 과정 (보수 표현)
1. 양수 1(00000001) 의 모든 부호를 반대로 치환
2. 바뀐 11111110 에서 +1 더하기
3. 그 결과 11111111 이 되는데 이를 "1을 2의 보수로 표현한 -1"이라고 한다.
❓음의 보수 표현
- 2의 보수를 사용하는 이유?
➡️1의 보수로 음수와 양수를 표현하게 되면 0이 +0, -0처럼 양수형, 음수형을 가지게되므로
➡️결국 0이 2개가 된다. 이를 해결하기 위해 등장한 것이 “2의 보수”
1byte가 표현할수 있는 가장 큰 값 01111111 (127)
➡️음의 보수 표현 : +1을 더하여 10000000
➡️만약 보수로 표현된 수를 다시 원래 값으로 돌릴때는"-1" 수행
그렇게되면 0에 1이 위에서부터 0에게 하나하나 빌려주게 되어 01111111 (-128)
⭐정리하자면 127에 +1을 더하게 되면 -128
2.참조형 타입
- String = 문자열
- ex. Book b = new Book();
➡️타입이 기본형이 아닌 타입으로 기본형타입은 소문자로 시작하는 반면 이러한 타입들은 대문자로 시작
➡️이를 "참조형타입" 이라고 부른다. - class 타입
- interface 타입
➡️참조형 타입은 값을 가지지않고 메모리의 특정위치에 있는 값을 참조하는 (=레퍼런스) 타입
변수명 규칙
- 하나이상의 글자
- 길이 제한이 없다
- 키워드는 변수명으로 사용할 수 없다 (int, short, boolean …)
- 상수 값을 표현하는 단어 true, false, null 등도 마찬가지로 변수명으로 사용할 수 없다.
변수 선언
int x;
int y;
int z;
처럼 선언만 하거나
int x = 0;
int y = 0;
int z = 0;
처럼 선언과 동시에 초기화를 해줄 수 있다.
int x, y, z
➡️이렇게 한번에 선언할 경우 초기값을 넣어주지 않으면 모두 0을 가지게된다.
타입의 변환
- double형 타입에 int형 정수값은 잘 대입됨 (작은 값이 큰 공간에 들어가게되는 것은 가능)
- int형 타입에 double형 실수값은 대입되지 않음 (큰 값이 작은 공간에 들어가는 것은 불가능)
묵시적 타입변환 (=자동타입변환, Implicit Conversion)
double d1 = 50;
double d2 = 500L;
- d1에는 int형 리터럴 50이 잘 저장되고
- d2에는 long형 리터럴 500L이 잘 저장되는 것을 확인 가능
❓정수형인 long타입이 실수형인 double타입에 저장되는 이유
➡️정수 값인 500L이 실수형으로 변환되어서 자동으로 저장되는 것
➡️반면 int형 타입에 실수를 대입하면 오류가 발생
➡️실수는 정수를 포함하지만 정수는 실수를 포함할 수 없기 때문이다.
변경내용 있으면 수정예정 :)