자료형을 기반으로 표현이 되는 상수
정수는 무조건 int형으로 인식하기로 약속하기 때문에 int형 범위를 넘어가는 값들은 자료형을 반드시 지정해줘야함
* '리터럴'이라는 표현은 '상수'라는 표현으로 대신하는 경우가 많다.
ex) int num1 = 5+7
* 메모리를 거쳐서 cpu에 가서 연산 됨
* 메모리에 5와 7이 올라가는 곳은 컴파일러가 정해주고,
메모리 공간에 기록된 수는 바꿀 수 없다.
System.out.println(3147483647 + 3147483648);
컴파일시 Integer number too large 라는 오류 발생
System.out.println(3147483647L + 3147483648L);
해결방법: l 또는 L을 붙여서 long형 리터럴로 표현
실수 리터럴: 기본적으로 double형으로 처리한다
그래서 double형 범위를 넘어가는 값은 자료형(float)을 꼭 지정해줘야함
형 변환 (Casting)
CPU가 연산 결과에 대한 응답을 할 때는 반드시 9개의 데이터 타입 중 한 개를 결정해서 그에 맞춘 응답을 주기 때문에 두 데이터 타입이 일치해야 한다.
ex 1)
int a = 21억
int b = 21억
int c = a+b
* 컴파일러는 에러가 안 나지만, 값이 나올 때 오류
int a = 10
long b = 21L
int c = a+b
* 에러이유: 결과 값이 long 타입으로 나오기 때문에
자동 형 변환 (Implicit Conversion)
• 1. 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
• 2. 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선한다.
명시적 형 변환 (Explicit Conversion)
자동 형 변환 규칙에 부합하지는 않지만, 형 변환이 필요한 상황이면 명시적 형 변환을 진행한다.
ex 1)
double pi = 3.1415;
int wholeNumber = (int)pi;
// 출력: 3 -> 소수점을 없애고 출력됨
long num1 = 3000000007L;
int num2 = (int)num1;
// long은 int보다 할당된 공간이 크기 때문에 int의 공간에 다 할당되지 못한 숫자들은 출력이 안됨
short num1 = 1;
short num2 = 2;
short num3 = (short)(num1 + num2);
* 정수 자료형의 오류
public class OperatePromotion { public static void main(String[] args) { short num1 = 11; short num2 = 22; short result = num1 + num2; System.out.println(result); } }
- 오류원인 : cpu에서 메모리로 (정수의) 결과값을 보낼 때 32bit인 JVM과 2byte(16bit)인 short 자료형 사이에 오류가 생긴다.
- 해결방법 : int 이상의 자료형으로 코드를 짜야한다.
public static void main(String[] args) {
int a = 4;
int b = 3;
double c = b / a;
System.out.println(c);
}
}
출력값: 0.0
* int인 b/a의 값은 (int)0.75 이기 때문에
소수점이 버려진 0.0으로 출력된다
해결방법
1) double c = (double)b / a;로 형 변환
2) num1, num2의 자료형 중 하나는 double로 선언
3) 연산전에 a,b 중 하나를 double형으로 명시적 형 변환
int a = 3;
int b = 4;
double result = b/ (double)a
System.out.println('A');
System.out.println('A' + 'A');
출력결과
이유 : 'A'는 문자 1개(2byte)인 Char형으로 인식하여 메모리에 65로 저장
'A' + 'A'는 Char형으로 65를 메모리에 올리고 int형으로 자동 형 변환