변하지 않는 것을 상수(Constant), 그리고 변하는 것을 변수(Variable)
그리고 Java에서 변수는 변하는 하나의 값을 저장할 수 있는 저장공간을 의미한다.
반대로 상수는 변하지 않는 하나의 값을 저장할 수 있는 저장공간을 의미한다.
Java 프로그램에서 값을 다루려면 값을 저장할 저장공간이 필요하다.
저장공간을 선언할 때, 이 공간에 저장할 값의 타입과 이름을 명시하여 선언한다.
e.g. Int number; // number라는 이름의 int형 저장공간 선언
선언 이후에 값을 저장한다면 일반적인 ‘덮어쓰기’ 이다.
e.g. int number = 12; // 12라는 값을 number라는 저장공간에 덮어씌움
1. 논리형 변수: Boolean
True/False 값만 저장한다.
2. 문자형 변수: char
‘A’, ‘3’ 와 같은 문자 하나만 저장한다. 참고로 ‘’로 문자를 저장해주어야 문자 하나로 인식한다.
3. 정수형 변수: int, byte, short, long
0, 1, 33 과 같은 정수형 숫자 값을 저장한다.
정수형 변수 표현 범위
4. 실수형 변수: float, double
0.12, -0.00001 과 같은 소수점 실수 값을 저장한다.
Float: 3.4E +/- 38(7자리 숫자)
Double: 1.7E +/- 308(15자리 숫자)
Float은 4byte만 사용하지만, 부동 소수점 방식으로 숫자를 저장한다. 즉, 기수와 지수를 구분하여 저장하고 이들을 곱한 값을 표현하는 방식
실수 자체가 표현범위가 너무 넓어서 정수형 변수에서 담지 못할 수 있다.
long num = 3.14f; // long < float 자동 형변환 불가
1. 문자열 변수: String
“Apple“ 과 같은 문장을 저장한다.
2. 그 외: Object, Array, List, …
객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장한다.
Wrapper Class라는 이름과 같이 기본형 변수를 클래스로 한번 감싸는 변수를 의미한다.
모든 기본 타입에는 이 래퍼 클래스가 존재하며, 기본형 변수 타입명에서 첫 글자를 대문자로 바꿔서 래퍼 클래스를 정의했다.
| 기본 타입 | 래퍼 클래스 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Char |
| boolean | Boolean |
int number = 21;
Interger num = new Integer(number); // 구형 방식
Integer num = number; // 요즘은 이런 식으로 이렇게 표현할 수 있음
저장공간에 저장하는 값은 0, 1을 통한 숫자 값을 저장한다. 문자의 경우는 매핑을 통해 숫자와 짝을 지어서 표현한다. 여러가지 매핑 방법이 있지만, Java에서는 기본적으로 아스키코드를 사용한 문자 저장 방식을 사용하고 있다.

문자(char): 문자 1개만 저장하며 ‘’를 사용하여 값을 지정한다.
문자열(string): 문자 여러 개를 문장형태로 저장하며 “”을 사용하여 범위를 지정한다.
문자(char): 문자 뒤에 \0(null 문자)가 없다. (1byte만 사용하기 때문에)
문자열(string): 문장의 끝에 \0문자가 함께 저장이 된다.
다른 기본형 변수가 실제 값을 저장하는 저장공간이라면, 참조형 변수는 실제 값이 아닌 원본 값의 주소 값을 저장한다. (참조형 변수 = 주소형 변수)
저장 관점에서 보면, 기본형 변수는 원본 값이 Stack 영역에 있지만, 참조형 변수는 원본 값이 Heep영역에 있다.
Stack 영역에는 따로 저장해둔 원본 값의 Heap 영역 주소를 저장한다.
Java를 사용하다 보면 이러한 변수형을 변경하고 싶을 때가 있다. 입력 받은 숫자가 문자열인 경우 이것을 숫자형으로 변경하고 싶다 거나 등등 (e.g. 실수를 정수로 변환할 때)
float float_num = 10.1010f;
int int_num;
int int_num = (int)float_num;
// int_num의 출력값은 10으로 소수점 아래는 삭제된다.
// 반대의 경우(float, double)는 10.0으로 소수점 아래 1자리를 생성해준다.
Java는 자동 형변환을 해주기도 하는데, 앞의 ‘(int)’ 이러한 부분 없이 할당해도 할당한 저장 공간의 타입으로 형변환이 진행된다. 또한, 작은 타입과 큰 타입이 계산될 때에는 큰 타입으로 계산된다.
다만, 문자의 경우에는 ASCII 코드로 변환되기 때문에 주의할 필요가 있다.
자동 형변환은 더 큰 표현범위를 가진 타입으로 변환되는 것이라 값의 손실이 없기 때문에 컴파일러가 자동으로 형변환을 해준다.
하지만 강제 형변환(캐스팅)의 경우, 더 작은 표현범위를 가진 타입으로 변환되는 것이라 값의 손실이 생긴다.
따라서 컴파일러가 자동으로 해주는 것이 아닌 개발자가 직접 선택하여 형변환을 진행해야 한다.