하나의 값을 저장하는 메모리 공간
값을 저장할 공간을 마련하기 위해 선언한다
int age; // 선언
age = 27; // 초기화
String s = "dev"; // 선언과 동시에 초기화
지역 변수는 읽기 전에 꼭 초기화 해야 함
변수 : 하나의 값을 저장하기 위한 공간, 변경 가능
상수 : 한 번만 값을 저장하는 공간, 변경 불가능
리터럴 : 그 자체로 값을 의미하는 것
int score = 100;
score = 200; // 변경 가능
final int MAX = 100; // MAX는 상수
MAX = 200; // 에러
데이터 타입은 기본 타입과 참조 타입으로 분류된다.
// 기본 데이터 타입
byte b = 1;
char c = 'a' // 한 글자
int i = 1000; // 정수 리터럴
float f = 3.14f;
double d = 3.141592; // 실수 리터럴
// Overflow
int i3 = (int)1000000000000l;
System.out.println(i3); // -727379968
정수 리터럴
실수 리터럴
문자 리터럴
논리 리터럴
오버플로우 현상은 데이터 타입의 값의 범위를 초과할 때 발생하는 현상으로 엉뚱한 값이 변수에 들어가게 된다.
String s = "ABC"; // s라는 주소에 "ABC" 저장
Date today = new Date(); // today라는 주소에 새로운 객체 생성
기본형을 제외한 나머지 타입 (System, String 등)
실제 값을 저장하는 대신 메모리 주소를 저장 (4byte, 8byte)
int i2 = 'A';
System.out.println(i2); // 97 묵시적 형변환
System.out.println((char)i2); // 'A' 명시적 형변환
타입 변환은 컴파일러가 자동으로 하는 묵시적 형변환과 직접 변환 시키는 명시적 형변환이 있다.
int i = 'a'; // int > char
long l = 123; // long > int
double d = 3.14f; // double > float
int i = 30_0000_0000; // int의 범위 밖
long l = 3.14f; // long < float
float f = 3.14d; // float < double
byte b = 100; byte의 범위에 속함
byte c = 128; byte 범위를 벗어나서 에러
char ch = 'a'; // 문자
char ch2 = ''; // 에러 무조건 하나의 문자가 들어가야 함
String s = "ABC"; // 문자열
String s2 = ""; // 빈 문자열
문자열은 어느 타입이든 결합 시 문자열로 타입 변환한다
int x = 10, y = 20;
int tmp; // 빈 변수
tmp = x; // x의 값을 tmp에 저장
x = y; // x의 값을 y에 저장
y = tmp; // tmp의 값을 y에 저장
두 변수의 값을 교환하기 위해서는 하나의 빈 변수가 필요하다
다른 타입 간의 연산은 피연산자들을 먼저 모두 같은 타입으로 만든 후에 수행된다
메모리에 할당받은 바이트 크기가 작은 타입에서 큰 타입으로의 타입 변환은 생략 가능
하지만 큰 타입에서 작은 타입으로의 변환은 데이터의 손실 발생
// 1. 묵시적 형변환 (자동 타입 변환)
double num1 = 10;
int num2 = 3.14; // 데이터 손실
double num3 = 7.0f + 3.14;
int num4 = 9876543210L; // int 범위 밖
float num5 = 3.14; // type missmatch
// 2. 명시적 형변환 (강제 타입 변환)
int num = 1, num 2 = 4;
dobule result1 = (double) num1 / num2;