변수는 값을 저장할 수 있는 메모리의 특정 주소에 붙이는 이름이다.
자바의 변수는 다양한 타입의 값을 저장할 수 없다.
정수타입 변수에는 정수값만 저장, 실수 타입 변수에는 실수값만 저장 할 수 있다.
값을 아직 가지지 않고 변수를 선언
int age;
double value;
int x,y,z
변수가 값을 가지고 있게 초기화
int score;
score = 90;
변수가 초기화되면 메모리 주소 정보를 갖게 되고 해당 메모리 주소에 값이 저장된다.
ex)
public class variable {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a;
int sum = a + b;
String printResultAB = String.format("a+b is %d", sum);
String printResultAC = String.format("a+c is %d", a+c);
System.out.println(printResultAB); // a+b is 30
System.out.println(printResultAC); // a+c is 20
}
}
변수를 선언할 때 타입을 같이 선언해야한다.
구분 | 분류 | 종류 |
---|---|---|
정수 타입 | byte, char, short, int, long | |
기본 타입 | 실수 타입 | float, double |
논리 타입 | boolean |
type | 메모리 사용 크기 | 허용 크기 |
---|---|---|
byte | 1byte, 8bit | -128 ~ 127 |
short | 2byte, 16bit | -2^15 ~ 2^15-1 |
char | 2byte, 16bit | 0 ~ 65535(유니코드) |
int | 4byte, 32bit | -2^31 ~ 2^31-1 |
long | 8byte, 64bit | -2^63 ~ 2^63-1 |
만약 타입에서 메모리 허용 크기를 벗어난다면 컴파일 에러가 발생한다.
ex)
int a = 130 // compile error
int a = 123 // good
정수 리터럴을 사용해서 2진수,8진수,10진수 같은 수도 인식이 가능하다.
// 2진수 0b or 0B 시작
0b1011 => 11
0B0011 => 3
// 8진수 0 시작
013 => 11
0206 => 134
// 10 진수
123 => 123
// 16진수 0x or 0X 시작
0xB3 => 179
그 외 실수, 논리 타입이 존재한다.
두 변수의 타입이 동일할 경우 한쪽 변수값을 다른 쪽 변수에 복사해서 저장할 수 있다.
만약 두 변수의 타입이 다르다면 어떻게 될까
byte a =10;
int b = a; // byte 타입 변수 a에 저장된 값을 b에 복사 저장
자동으로 타입 변환이 일어나는 것이다.
작은 허용 범위(byte) => 큰 허용 범위(int) 만 허용된다.
char 같은 경우 int 로 변환시 유니코드 값으로 변경된다.
char a = "A"
int b = a // 65
자동 타입 변환가 다르게 강제로 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것
캐스팅 연상자 괄호()를 사용해 안에 들어가는 타입을 나누는 단위로 사용한다.
int intValue = 10;
byte byteValue = (byte) intValue; // 10
double doubleValue = 3.14;
int intValue = (int) doubleValue; // 3
정수
정수 타입 변수가 산술 연산에서 피연산자로 사용되면 int 보다 작은 byte, short는 int로 변환되어 연산을 수행한다.
자동으로 변환되기 때문의 연산의 결과값의 변수는 int여야 한다.
실수
실수도 마찬가지다.
피연산자 중 하나가 double 이라면 다른 피연산자도 double 타입으로 자동 변환되어 연산을 수행한다.
따라서 연산 결과는 double 이어야한다.