변수: 단 하나의 값을 저장할 수 있는 메모리 공간
메모리 공간은 정보처리의 기초 단위인 1 Byte로 구성되어 있다. (1 byte = 8 bits)
메모리에 값을 저장하거나 읽을 때 해당 메모리 주소를 사용해야 하는데 사람이 사용하기에는 불편하기 때문에 특정 메모리 영역에 이름을 붙이고 주소 대신에 이름을 사용해서 메모리 값을 저장하고 읽을 수 있게 한 것이 변수이다. 변수 선언을 하면 메모리에 값을 저장하기 위한 공간을 마련한다.
변수 생성 규칙:
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어(ex. true) 사용 불가
3. 숫자로 시작 불가
4. 특수문자 _와 $만 허용
변수의 여러가지 형태:
Camel case: varTest
Snake case: var_test
Pascal case: VarTest (자바에서는 클래스명만 대문자로 시작하자는 암묵적인 규칙이 있어서 X)
Kebab case: var-test (자바에서는 변수이름에 "-" 안됨.)
변수의 초기화:
char 타입은 빈 캐릭터로 초기화가 안됨. 공백으로 초기화 해야 함. String 타입은 다 가능.
char c = '' //에러
char c = ' ' //초기화 성공!
String s = "" //초기화 성공!
// score: 변수
// finalScore: 상수
// 100, 1000: 리터럴
class Variable2_2 {
public static void main(String[] args) {
int score = 100;
final int finalScore = 1000;
}
}
범위가 '변수 > 리터럴'인 경우: 가능!
ex.)
int i = 'A'; int > char, 'A' = 65
long l = 123; long > int
double l = 3.14f; double > float
범위가 '변수 < 리터럴'인 경우: Error!
ex.)
int i = 30_0000_0000; int의 범위(대략 20억)를 넘습니다.
long l = 3.14f; long < float
long(8bye), float(4byte)라 가능할 것 같지만
실수형은 정수형 보다 저장 범위가 훨씬 넓기 때문에 Error가 발생합니다.
float f = 3.14; float < double;
이럴 경우 타입 캐스팅을 하면 에러가 안 난다. 하지만 데이터의 손실이 생길 순 있다.
기본형 타입은 크게 논리, 문자, 정수, 실수 형으로 나뉜다. (String 타입은 기본형이 아님!)
- n bits로 표현할 수 있는 값의 개수: 2^n
- n bits로 표현할 수 있는 부호없는 정수의 범위: 0 ~ 2^n - 1
- n bits로 표현할 수 있는 부호있는 정수의 범위: -2^(n-1) ~ 2^(n-1) - 1
- 그래서 byte 타입(1B, 8bits)의 범위가 -128 ~ 127
S: 부호, 즉 양수인지 음수인지 판단
E: 지수, 즉 2의 지수
M: 가수, 즉 소수점 이하
실수형은 정수형과는 저장방식이 다르기에 오차가 있다. 그래서 정밀도를 알아야 한다.
- float의 M 즉, 가수는 23자리인데 정규화를 통해서 24자리까지 표현 가능하다.
- 따라서 2^24 까지 표현이 가능한데 2^24는 10^7 < 2^24 < 10^8 임으로 정밀도는 7자리이다.
- 마찬가지의 이유로 double은 15자리이다.
아스키코드
128개의 문자조합을 제공하는 7비트 부호
알파벳, 숫자, 특수기호, 그 외 컴퓨터에 필요한 몇 가지만이 정의
유니코드
각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드
16비트로 표현 - 최대 65,536 자 표현 가능
UTF-8
유니코드를 사용하는 인코딩 방식 중 하나
영문/숫자/기호는 1바이트로, 한글/한자는 3바이트로 표현
전세계 모든 글자들을 한꺼번에 표현 가능
유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용
해당 변수타입의 최솟값, 최대값 범위를 넘어가면 값을 순환한다.
참조형 변수는 null 또는 메모리 주소를 저장. 항상 4 byte(64bit -> 8 byte).
4byte는 2진수로 대략 40억개로, 40억byte(4GB)의 메모리를 다룰 수 있습니다.
class Variable3_5 {
public static void main(String[] args) {
// Date import 필요!
Date date; // 참조형 변수 date 를 선언
date = new Date(); // date 에 객체의 주소를 저장 , new 는 객체를 생성하는 명령어
System.out.println(date); // Wed Jan 11 20:54:45 KST 2023
}
}