: final로 선언된 변하지 않는 값 (변하는 값과는 반대)
final int MAX_NUM = 100; // MAX_NUM 은 상수
final float PI = 3.14f; // PI 는 상수
상수를 선언하고 재활용 할 경우 반복적으로 수정하지 않고 맨 위에 선언한 상수만 바꾸면 쉽게 바꿀 수 있다.
: 프로그램에서 사용하는 모든 숫자 값, 논리 값 ex) 10, 3.14, 'A', true
final int MAX_NUM = 100; // 100 은 리터럴
final float PI = 3.14f; // 3.14f 는 리터럴
리터럴에 해당하는 값은 특정 메모리 공간인 상수 풀(constant pool) 안에 있다. 필요한 경우 상수 풀에서 가져와서 사용하며 저장할 때는 int나 Double의 자료형 구조를 사용한다. 따라서 Long이나 Float 값으로 저장하는 경우 뒤에 식별자(l혹은 f)를 명시하여준다.
아래 그림을 참고해보자.

int iNum = 1000; // 4바이트 짜리 int iNum을 1000이라 하자.
byte bNum = (byte)iNum // iNum을 1byte짜리 Byte에 담자.
System.out.println(iNum);
System.out.println(bNum);
이렇게 출력하면 출력값은 둘 다
1000이 나와야 하지 않을까?
하지만 출력값은 다음과 같이 나온다.
출력값
1000
-24
1byte가 표현할 수 있는 정수의 범위는 -128부터 +127 까지이다.
int(=4byte)로 표현할 수 있는 정수와 1byte(=8bit)가 표현할 수 있는 정수의 범위가 다르기 때문에 int 형변수를 byte 형변수에 담아 출력하면 원하는 결과값이 나오지 않는다.
이에서 파생되는 개념이 형변환 (Type Conversion) 이다.
작은 수에서 큰 수로, 즉 더 정밀한 수로 되입되는 경우,개발자가 컴파일러에게 따로 명시해주지 않아도 자동적으로 형변환이 일어난다.
long num = 3 ; // int -> long 으로 자동변환 l을 명시하지 않아도 됨
하지만 정밀한 수에서 간단한 수(ex.실수에서 정수 등)수에 대입되는 경우
개발자는 컴파일러에 명시적으로 형변환을 해주어야 한다.
double dNum = 3.14 ;
int Num = (int)dNum ; // 자료형을 명시