자바에서의 리터럴은 그 자체로 값을 의미하는 것을 말한다.
int A = 10; //자료형(정수형) 변수명 = 10(리터럴, int)
하지만 변수와 리터럴의 타입이 불일치해도 괜찮을 경우가 있다.
- 변수의 타입의 범위 > 리터럴 타입의 범위
- byte, short 변수에 int리터럴 저장
종류 | 리터럴 | 접미사 |
---|---|---|
논리 | false, true | 없음 |
정수 | 123, 0b0101, 077, 0xFF, 100L | L |
실수 | 3.14, 3.0e8, 1.4f, 0x1, 0p-1 | f, d |
문자 | '가', 'A','\n' | 없음 |
문자열 | "가나다", "A", "true" | 없음 |
true(참)과 false(거짓)중 하나를 값으로 갖는 자료형 ,조건문과 논리적 계산에 사용된다.
논리형 타입 | 크기 | 표현범위 |
---|---|---|
boolean | 1 byte | true, false |
boolean bool = true;
boolean bool = (1 > 2) // false boolean bool = (2 = 2) // true
if(2 = 2){ System.out.println("2는 2입니다."); }
정수 자료형은 정수를 저장하는데 사용되는 자료형이다.
논리형 타입 | 크기 | 표현범위 |
---|---|---|
byte | 1 byte | -128 ~127 |
short | 2 byte | -32,768 ~ 32,767 |
int | 4 byte | -2,147,483,648~2,147,483,647 |
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
long 타입의 리터럴에는 접미사 'L'을 추가하며 그외의 리터럴은 int 타입이다.
long 변수에 값을 저장 할때 int 자료형의 범위를 넘어간 값일 경우 접미사 'L'을 붙여야한다.
- 접미사는 대소문자를 구분하지 않지만 소문자 'L'사용사 숫자 '1'과 혼동할 우려가 있기 때문>에 대문자를 사용한다.
long A = 2,147,483,800L
변수의 타입의 범위 > 리터럴 타입의 범위
int A = 'a'; int > char long B = 13; long > int
변수의 타입의 범위 < 리터럴 타입의 범위, 에러
int A = 2,147,483,800L // int의 범위를 넘어간다 long B = 3.14f // 정수의 범위는 보통 실수의 범위보다 작다.
byte, short 변수에 int리터럴 저장
byte A = 100; // byte의 범위(-128 ~127)에 속함
10진수를 제외한 2진수/8진수/10진수는 접두사를 붙여 표현한다.
- int 타입의 리터럴을 사용하되, 약속된 접두사를 붙여 구분한다.
int binary = 0b0101; // 숫자 '0', 문자'b', "0b"을 붙여준다. int octal = 077; // 숫자 '0', "0"을 붙여준다. int decimal = 10; int hexadecimal = 0xFF; //자 '0', 문자'x', "0x"을 붙여준다.
- 언더스코어 표기법은 정수형 리터럴 중간에 구분자로'_'(언더바)를 사용하는 표기법이다.
큰 숫자에 ','(콤마)를 넣어 표현하듯이 사용한다.int A = 100_000_000; // 100,000,000
실수 자료형은 실수 값을 저장하는데 사용되는 자료형이다.
논리형 타입 | 크기 | 표현범위 | 정밀도 |
---|---|---|---|
float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | 7 |
double | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | 15 |
float F = 3.14f; double D = 3.14d;
double D = 3.14;
float F = 3.14; //float 타입의 범위에 속한 값이더라도 에러가 발생한다. float F = 3.14d;
실수를 컴퓨터에서 표현하는 방식으로는 대표적인 고정 소수점 방식과 부동소수점 방식으로 나눌 수 있다. 메모리는 한정적이기 때문에 컴퓨터는 소수를 이진법으로 표현할 떄 고정 소수점 방식이 아닌 부동 소수점 방식을 이용한다.
10진수로 표현된 실수를 이진수로 변환하고 결과 값을 각각 정수부, 소수부 메모리 비트에 넣어주기만 하면 표현이 된다.
직관적적으로 메모리에 실수를 표현할 수 있다는 장점이 있지만, 정수부가 큰 실수가 있을수도 있고 반대로 소수박 큰 실수다 있을수도 있기 때문에 표현 가능한 범위가 매우 적다는 단점이 있다.
실수의 값 자체를 가수부(23bit)에 넣어서 표현한다.
지수(e) 표기법?
- 지수 표기범은 아주 큰 숫자나 아주 작은 숫자를 간단하게 표기할 떄사용되는 표기법이다.
double D = 3.14e+10; // e(E)로 지수부 시작. 3.14 * 10^10 = 31,400,000,000 double D1 = 3.14e10; // +는 생략 가능. 31,400,000,000 double D = 3.14e-2; // 0.0314
- 변수의 타입의 범위 < 리터럴 타입의 범위에 포함 되므로 에러가 발생한다.
long L = 3.14f
부동 소수점 방식을 사용하면 매우 큰 범위의 실수까지도 표현할 수 있어 보다 정밀하게 소수를 표현할수는 있지만 그래도 완전히 정확하게 표현하는 것이 아니다. 이는 소수를 연산하는데 부정확한 결과값이 나오게 되고 오차가 발생한다는 것을 의미한다. 컴퓨터의 실수 연산은 소수점 단의 값을 정확히 표현하는 것이아니라 근사값으로 처리하기 떄문에 오차가 발생하는 것이다.
자바는 IEEE 754 표준 방식을 따른다.
부동 소수점 방식은 하나의 실수를 가수부와 지수부로 나누어 표현한다.
±(1.가수부)×2^지수부-127
아래는 실수를 부동 소수점으로 변환하는 예시이다.
- 부호비트를 설정, 음수이면 1 양수이면 0이다.
- 10진수로 표현된 실수를 이진수로 변환
- 100.5 => 1100100.1
- 정규화를 통해 정수부가 한자리가 되도록 변환, 지수를 사용하여 표현(부동 소수점)
- 정규화 : 소수점을 이동 시키는 것
- 1.1001001 * 2^6
- 가수부 에 소수점 아래 부분의 실수 값 그대로 넣는다. 나머지는 0으로 채운다.
5.지수에 bias(127)을 더하고 이진수로 변환후, 지수부 비트에 넣는다.
- 6 + 127 = 133 => 10000101
- bias는 지수가 음수가 될 수 있기 때문에 사용한다.
- 10진수로 표현된 실수(0.625)를 이진수로 변환했을 때 0.101가 된다.
- 0.101를 정규화를 하게 되면 1.01 * 2^-1가 나오고 음수인 지수 -1이 나온다.
- 음수 지수를 8비트로 표현하기 위해 127을 더해준다. 이는
- 8bit로는 256 개의 수를 표현할 수 있는데, 양/음수를 표현하기위해 일단 지수에서 127을 더해 음수는 (0 ~ 127) 까지, 양수는 (128 ~ 155) 까지 구분하기 위해서이다. 따라서 지수에 bias 값을 더해 127보다 적으면 음수, 크면 양수로 구분할 수 있다.
자바에서 실수를 표현하는데 타입별로 정밀도가 있다. 정밀도가 결정나는 이유는 부동소수점 표현 방식에 따른 결과로, 가수부를 표현할 수 있는 크기에 따라 결정되기 떄문이다.
논리형 타입 | 크기 | 표현범위 | 정밀도 |
---|---|---|---|
float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | 7 |
double | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | 15 |
float형은 가수의 길이가 23 bit 이지만 정규화를 통해 실제로는 24자리 까지 저장할 수 있다. 2^24는 10^7보다 크고 10^8보다 작기 때문에 정밀도는 7이된다.
double형은 가수의 길이가 52 bit 이지만 정규화를 통해 실제로는 53자리 까지 저장할 수 있다. 2^53은 10^15보다 크고 10^16보다 작기 떄문에 정밀도가 15이다.
정밀도가 7이라는 것은 7자리의 10진수를 오차없이 정확하게 표현할 수 있다는 뜻이다. 마찬가지로 정밀도가 15이라는 것은 15자리의 10진수를 오차없이 정확하게 표현할 수 있다는 뜻이다.
float을 사용하여 연산속도 향상이나 메모리의 절약을 필요로 하는경우가 아니라면보다 높은 정확도를 필요로 할 경우 double 타입을 사용하면 된다는 것이다.
문자 자료형은 문자를 저장하는데 사영되며, 변수 당 하나의 문자만을 저장할 수 있다.
논리형 타입 | 크기 | 표현범위 |
---|---|---|
char | 2 byte | 0~65,535 |
문자 자료형 char은 문자값을 '(작은 따옴표)로 감싸야한다.
char C = 'C';
위 문장은 'C'(문자)가 저장되는 것 같지만 실제로는 문자가 아니라 해당 문자의 '유니코드'(정수)가 저장된다. 컴퓨터는 숫자만을 알기 때문에 모든 데이터를 숫자로 변환하여 저장하는 것이다.
문자 'C'는 유니코드는 67이기 때문에 변수 C에는 정수 67이 저장된다.
문자 리터럴 대신 유니코드를 직접 저장할 수 있다.
- 문자'C'의 유니코드는 10진수로 이므로 동인한 결과를 얻는다.
char C = 'C'; char C1 = 67;
변수의 타입이 정수형 일경우에는 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드 문자를 출력한다.
short I = 67; // 67출력 char C = 67; // C출력
이처럼 값을 어떻게 해석하느냐에 따라 결과가 달라지므로 값만으로는 값을 해석할 수 없다. 값의 타입까지 알아야 올바르게 해석할수 있다.
영문자 이외에 특수문자를 저장하려먼 특수한 방법을 사용한다.
특수 문자 | 문자 리터럴 |
---|---|
tab | \f |
backspace | \b |
form feed | \f |
new line | \n |
carriage return | \r |
역슬래쉬() | \ |
작은따옴표 | \' |
큰따옴표 | \" |
유니코드(16진수)문자 | \u유니코드 (\u0041) |
char tab = '\tab'; char backspace = 'abc\b'; // ab char newline '\n'; // 개행 char quote = '\"\''; // "'