리터럴(literal)?
자바에서의 리터럴은 그 자체로 값을 의미하는 것을 말한다. 기존의 수학에서의 상수와 같은 의미지만 자바에서 상수(constant)를 '한번 만 값을 저장 가능한 변수' 라는 의미로 정의했기 때문에 구별하기 위해 따로 리터럴(literal)이라는 단어를 사용한다
.
프로그램의 로딩 과정에서 명시된 리터럴들은 constant pool에 저장되고, 이후에 사용되는 경우 constant pool에서 가져와 사용한다. ( 프로그램이 컴파일되는 시점에서 정해져서 바뀌지 않는다. )
- 리터럴은 Heap 메모리 영역 안에 잇는 메모리 공간인 상수 풀(constant pool)에 위치한다.
- 똑같은 값을 메모리에 여러번 할당하면 메모리 낭비가 일어나기 때문에 같은 메모리 주소 값을 가져 같은 값을 사용하는 경우 메모리 주소를 대입/복사하는 방식으로 리터럴을 사용한다.
int A = 10; //자료형(정수형) 변수명 = 10(리터럴, int)
int B = 10;
A == B // true, 같은 메모리 주소를 가진다.
종류 | 리터럴 | 접미사 |
논리 | false, true | 없음 |
정수 | 123, 0b0101, 077, 0xFF, 100L | L |
실수 | 3.14, 3.0e8, 1.4f, 0x1, 0p-1 | f, d |
문자 | '가', 'A','\n' | 없음 |
문자열 | "가나다", "A", "true" | 없음 |
- constant pool에 저장할 때에 정수는 int, 실수는 double 타입으로 저장된다.
- 타입이 여러개인 정수와 실수는 별도로 다른 타입으로 저장하고 싶은 경우 접미사를 명시해줘야 한다.
- 접미사는 대소문자를 구분하지 않는다.
int i = 10L;
- 변수의 타입의 범위 < 리터럴 타입의 범위'인 경우 에러가 발생한다. 하지만 변수와 리터럴의 타입이 불일치해도 괜찮을 경우가 있다.
- 변수의 타입의 범위 실수 타입의 범위
- byte, short 변수에 int리터럴 저장
논리 리터럴
true(참)과 false(거짓)중 하나의 값으로 자료형( boolean ),조건문과 논리적 계산에 사용되는 리터럴
논리형 타입 | 크기 | 표현범위 |
boolean | 1 byte | true, false |
boolean bool = true;
boolean bool = 10 > 0; // true
- 연산의 결과
boolean bool = (1 2) // false
boolean bool = (2 = 2) // true
- 조건문
if(2 = 2){
System.out.println("2는 2입니다.");
}
정수 리터럴
- 자바에서 주로 사용하는 정수 자료형은 int와 long이며 byte, short는 잘 쓰이지 않는다.
논리형 타입 | 크기 | 표현범위 |
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 타입이다.
- byte는 이진 데이터를 다루는데 사용하고, short는 C언어와의 호환을 위해 추가되었다.
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 decimal = 10;
int binary = 0b0101; // 2진수 리터럴 : 숫자 '0', 문자'b', "0b"을 붙여준다.
int octal = 077; // 8진수 리터럴 : 숫자 '0', "0"을 붙여준다.
int hexadecimal = 0xFF; // 16진수 리터럴 : 숫자 '0', 문자'x', "0x"을 붙여준다.
언더스코어 표기법(underscore)
- 언더스코어 표기법은 정수형 리터럴 중간에 구분자로'_'(언더바)를 사용하는 표기법이다. 큰 숫자에 ','(콤마)를 넣어 표현하듯이 사용한다.
int A = 100_000_000; // 100,000,000
실수 리터럴
소수점 형태나 지수 형태로 표현한 값으로 실수 리터럴은 실수 리터럴은 folat / double으로 컴파일 된다.
논리형 타입 | 크기 | 표현범위 | 정밀도 | |
float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | 7 | |
double | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | 15 |
실수 자료형은 float / double 두가지가 있는데 실수형 리터럴에는 접미사를 붙여서 타입을 구분한다. float 리터럴에는 'f', double 타입 리터럴에는 'd'를 붙인다. (대소문자를 구분하지 않는다.)
float F = 3.14f;
double D = 3.14d;
- double타입 리터럴은 기본 자료형이기 때문에 'd'는 생략할 수 있다.
double D = 3.14;
- float 타입 변수에 double 타입 리터럴을 저장할 경우, 에러실수의 표현 방식
float F = 3.14; //float 타입의 범위에 속한 값이더라도 에러가 발생한다. float F = 3.14d;
문자 리터럴
논리형 타입 | 크기 | 표현범위 |
char | 2 byte | 0~65,535 |
- 문자 리터럴은 값을 '(작은 따옴표)로 감싸야한다.
char C = 'C';
- 위 문장은 'C'(문자)가 저장되는 것 같지만 실제로는 문자가 아니라 해당 문자의 '유니코드'(정수)가 저장된다.
- 컴퓨터는 숫자만을 알기 때문에 모든 데이터를 숫자로 변환하여 저장하는 것이다.
- 문자 'C'는 유니코드는 67이기 때문에 변수 C에는 정수 67이 저장된다.
문자 리터럴 대신 유니코드를 직접 저장할 수 있다.
- 문자'C'의 유니코드는 10진수로 이므로 동인한 결과를 얻는다.
char C = 'C';
char C1 = 67;
- 문자형 자료형은 문자를 저장할 변수를 선언하기 위한 것이지만, 실제로는 문자가 아닌 문자의 유니코드가 저장되고 정수형과 달리 음수를 나타낼 필요가 없으므로 같은 2byte인 short형과 표현할 수 있는 범위가 다르다.
변수의 타입이 정수형 일경우에는 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드 문자를 출력한다.
short I = 67; // 67출력
char C = 67; // C출력
- 이처럼 값을 어떻게 해석하느냐에 따라 결과가 달라지므로 값만으로는 값을 해석할 수 없다. 값의 타입까지 알아야 올바르게 해석할수 있다.영문자 이외에 특수문자를 저장하려먼 특수한 방법을 사용한다.
특수문자 리터럴
- 영문자 이외에 특수문자를 저장하려먼 특수한 방법을 사용한다.
특수 문자 | 문자 리터럴 |
탭(tab) | \t |
백스페이스(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 = '"''; // "'
문자열 리터럴
문자열은 기본 타입이 아닌 참조형 리터럴으로 "(큰 따옴표)로 문자열을 표현한다.
String s = "JAVA";
문자열(String)은 참조형이지만 기본형의 constant pool과 같이 같은 값을 호출할 때 메모리에 새로 할당하지 않고 Stirng constant pool이라는 영역에서 할당되어 메모리 주소를 대입/복사하는 방식으로 리터럴을 사용한다.
null 리터럴
null 리터럴은 참조형 변수에 대입해서 사용한다.
int i = null; // 에러
String str = null;
'Java' 카테고리의 다른 글
[JAVA] 연산자(operator) (0) | 2023.08.05 |
---|---|
[JAVA] 형변환(casting) (0) | 2023.08.05 |
[JAVA] 변수(variable)의 기본형과 참조형 (0) | 2023.08.05 |
[JAVA] 변수(variable)와 상수(constant) (0) | 2023.08.05 |
[JAVA] JVM(Java Virtual Machine) (0) | 2023.08.05 |