Java에서 진수로 입력하는 규칙은 아래 예시를 참고하자. 아래 예시는 숫자 '10'을 10, 2, 8, 16진수로 표현한 것이다.
public static void main(String[] args) {
int num = 10; //10진수
int bNum = 0B1010; // 2진수
int oNum = 012; // 8진수
int hNum = 0XA; // 16진수
System.out.println(num);
System.out.println(bNum);
System.out.println(oNum);
System.out.println(hNum);
}
32bit로 정수를 표현했을 때 가장 왼쪽에 존재하는 비트(MSB, Most Significant Bit)가 부호비트다. 부호비트가 0이면 양수, 1이면 음수를 나타낸다.
먼저 -5를 표현하는 방법을 단계별로 보면 아래와 같다.
step 1. 양의 정수를 표현한다.
0000..0101
step 2. 1의 보수(0이면 1, 1이면 0)를 취한다.
1111..1010
step 3. 1을 더한다.
1111..1011
정상적으로 음의 정수가 표현되었는지를 확인하기 위해 5를 이진수로 표현한 것과 -5를 이진수로 표현한 것을 더해보자.
0000..0101 + 1111..1011
자릿수가 33으로 바뀌고 맨 앞의 숫자가 1, 나머지는 모두 0이 된다. 33자리 숫자는 32bit으로 표현할 수 없기 때문에 맨 앞 숫자가 제외되므로, 합은 0으로 처리된다.
이것을 코드로 확인해보면 아래와 같다.
public static void main(String[] args) {
int num1 = 0B00000000000000000000000000000101; // 5
int num2 = 0B11111111111111111111111111111011; // -5
int sum = num1 + num2; // 0
System.out.println(num1);
System.out.println(num2);
System.out.println(sum);
}
변수가 사용할 공간의 크기와 특성에 따라 자료형을 사용하여 변수를 선언한다.
long lNum = 30L;
float fNum = 3.14F;
컴퓨터에서는 문자도 내부적으로는 비트의 조합으로 표현되며, 자바에서는 문자를 2바이트로 처리한다. 이때 문자를 특정한 숫자 값으로 변환하는 것을 인코딩, 숫자 값을 원래의 문자로 변환하는 것을 디코딩이라고 한다. 인코딩, 디코딩 과정에서 변환 숫자 값이 필요한데, 이것을 정해놓은 것이 문자세트이다. 문자세트에는 ASCII, Unicode 등이 있다.
이처럼 변수를 선언할 때, 자료형을 함께 사용하는 이유는 해당 변수가 사용할 메모리 크기와 타입을 구분하기 위해서다. 만약 자료형을 함께 입력하지 않는다면(자료형 대신 var을 쓰는 경우), 지역 변수 자료형 추론(local variable type inference)으로 변수에 대입되는 값(literal)을 보고 컴파일러가 추론해서 자료형을 지정해준다.
상수는 변하지 않는 값으로, 선언하기 위해서는 final 키워드를 사용한다.
Example.
public static void main(String[] args) {
final int MAX_NUM = 100;
final double PI = 3.14;
final int STUDENT_NUM = 30;
int num = 0;
if (num == STUDENT_NUM) {}
System.out.println(STUDENT_NUM);
}
final로 선언된 상수에 다른 값을 대입하면 에러가 난다. 프로그램 내에서 변경되지 않아야 하는 값을 상수로 선언해두고 혹시 변경되는 경우 선언된 값만 수정하는 식으로 사용한다.
리터럴은 프로그램에서 사용하는 모든 숫자, 값, 논리 값을 의미한다. 예를 들어 10, 3.14, 'A', true가 리터럴에 해당된다. 리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀(constant pool)에 있는데, 필요한 경우 상수 풀에서 가져와서 사용한다. 상수 풀에 저장할 때, 정수는 int, 실수는 double로 저장되므로 long이나 float 값으로 저장해야 하는 경우에는 식별자(L, l, F, f)를 명시해야 한다.
자료형을 변환하고 싶을 때는 (변환 후 자료형) literal 형식으로 써주면 된다. 아래는 예시 코드이다.
public static void main(String[] args) {
double dNum = 3.14;
iNum = (int)dNum; // 3
System.out.println(iNum);
float fNum = 0.9F;
int num1 = (int)dNum + (int)fNum; // 3
int num2 = (int)(dNum + fNum); // 4
System.out.println(num1);
System.out.println(num2);
}