: 값을 저장할 수 있는 메모리 공간을 확보하고 사람이 식별할 수 있는 이름을 붙인 것
class Example {
public static void main(String[] args) {
int num1 = 1; // int형 변수 num1을 선언 후 1을 할당.
int num2 = 2;
int num3 = 3;
...
}
}
// 변수 num1은 int형이다. → int형은 4byte다. → 4byte의 메모리 공간을 확보
→ 공간의 이름에 num1을 붙인다. → num1에 1을 할당해준다.(초기화)
int num1;
: 타입에 해당하는 메모리 공간을 확보하고 저장 공간에 이름을 붙인다.
num1 = 1;
: 선언한 변수에 값을 저장한다.
String CamelCase;
String 10A // Error
int byte; // Error
int class; // Error
int abstract; //Error
: 변수와 같이 선언하고 할당하여 사용할 수 있지만, 재할당이 금지
상수는 final이라는 키워드를 사용해 선언
관례적으로 대문자에 언더바_를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용
final double CALCULATOR_PI = 3.141592;
재할당시 에러가 발생하여 실수 방지 가능
값을 상수명으로 사용해 코드 가독성 향상
코드 유지관리가 쉬워짐
: 값의 유형 및 종류
-기본타입
: 실제값이 저장
-참조타입
: 객체의 주소를 저장
public class Example {
public static void main(String[] args) {
int primitive = 1;
Object reference = new Object();
System.out.println(primitive); // 1 (기본타입은 값을 저장한다)
System.out.println(reference); // java.lang.Object@626b2d4a (참조타입은 주소값을 저장한다.)
}
}
타입 | 메모리 | 표현 범위 |
---|---|---|
byte | 1byte | -128(-2^7) ~ 127(2^7 - 1) |
short | 2byte | -32,768(-2^15) ~ 32,767(2^15 - 1) |
int | 4byte | -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 - 1) |
long | 8byte | -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 - 1) |
byte byteNum = 123;
short shortNum = 12345;
int intNum = 123456789;
long longNum = 12345678910L;
// long 타입 리터럴의 경우에는 리터럴 뒤에 접미사 L을 붙여준다.
int intNum = 12_345_678_91;
long longNum = 12_345_678_91L;
// 숫자가 길면 언더바(_)로 구분해주어도 된다.
표현범위를 벗어나게 되면 오버플로우, 언더플로우가 발생
오버플로우
: 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환
언더플로우
: 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환
byte형의 경우
127 + 1은 128이 아닌 -128(최소값)이 된다.
-128 - 1은 -129가 아닌 127(최대값)이 된다.
타입 | 메모리 | 표현 범위 | 정밀도 |
---|---|---|---|
float | 4byte | 음수 : -3.4 x 10^38 ~ -1.4 x 10^-45 // 양수 : 1.4 x 10^-45 ~ 3.4 x 10^38 | 7자리 |
double | 8byte | 음수 : -1.8 x 10^308 ~ -4.9 x 10-^324 // 양수 : 4.9 x 10^-324 ~ 1.8 x 10^308 | 15자리 |
// float형 리터럴을 float형 변수에 할당 (반드시 접미사 f 를 붙여준다.)
float num1 = 1.23f;
// double형 리터럴을 double형 변수에 할당 (접미사 d 자율적으로 )
double num2 = 1.23456d;
double num2 = 1.23456;
오버플로우
: 양의 최대, 음의 최소 범위를 넘어서면 오버플로우가 발생하며 값은 무한대
언더플로우
: 양의 최소, 음의 최대 범위를 넘어서면 언더플로우가 발생하며 값은 0
타입 | 크기 | 표현 |
---|---|---|
booelan | 1byte | true / false |
boolean isTrue = true;
boolean isTrue = false;
// 논리타입은 boolean 형만 존재하며 true 혹은 false를 값으로 가진다.
타입 | 크기 | 표현 |
---|---|---|
char | 2byte | 'a' |
char letter1 = 'a';
char letter2 = 'ab'; // Error : 단 하나의 문자만 할당가능
자바는 유니코드로 문자를 저장한다.
char letter1 = ‘a’ ;와 같이 문자형 리터럴을 문자형 변수에 할당하면 letter1에는 영문자 a의 유니코드 숫자값이 저장된다.
char letter = 97; // 숫자를 문자형 변수에 할당가능.
System.out.print(letter); // 출력 결과 : a
숫자를 문자형 변수에 할당시 해당 숫자가 그대로 저장
나중에 변수를 참조할 때 숫자값을 유니코드로 인식하여 해당 숫자와 일치하는 코드를 가진 문자로 변환해준다.
바이트 크기가 더 큰 타입으로 변환할 때 (예 : short → long)
더 정밀한 타입으로 변환할 때 (예 : 정수 → 실수)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
//float 은 4byte이나 정수형보다 더 정밀한 실수형이기 때문
// float이 long보다 정밀하므로, 자동으로 타입이 변환됩니다.
long longValue = 1234L;
float floatValue = longValue;
System.out.println(floatValue); // 출력 결과 : 1234.0 (자동으로 타입변환됨)
//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환합니다.
int intValue = 127;
byte byteValue = (byte)intValue; //
System.out.println(byteValue); // 127