만자의 개발일지

[Java] 리터럴(literal)이란? 본문

Java/Java

[Java] 리터럴(literal)이란?

박만자 2021. 6. 18. 20:11

자바의 타입은 크게 두가지로 나뉩니다.

하나는 원시타입(primitive type) 또 하나는 참조타입(reference type) 입니다.

원시타입은 우리가 흔히아는 byte, int, short, long, float, double ,boolean, char가 원시타입이고 

String, Integer, Object 등등.. 원시타입을 제외한 대부분의 타입들은 참조타입이라 생각하시면 됩니다.

 

자 그럼 리터럴은 무엇일까요?

리터럴(literal)

리터럴이란 변하지 않는 데이터 그 자체를 의미합니다. 쉽게 상수라고 생각하시면 됩니다.

리터럴의 종류에는 원시타입과 String 이 있습니다.

 

예시를 들어보죠

int a = 10;

자 여기서 a라는 변수에 10이라는 값을 직접적으로 초기화시켜주었죠? 10과 같이 변하지 않는 고정적인 값을 리터럴이라고 부릅니다. 

 

int a = 10;
int b = 10;

이 코드를 한 번 보시죠

int형 변수 a 와 b 모두 10이라는 값을 가지고 있습니다.

위 코드를 실행시키면 자바내부에서는 무슨 일이 일어날까요?

 

일단 10이라는 값을 Heap 메모리 영역 안에 있는 Constant Pool 이라는 메모리 영역에 할당하게 됩니다.

근데 보시다시피 10이라는 값을 두번이나 호출하고있는데 똑같은 값을 메모리 영역에 여러번 할당하면 메모리 낭비가 일어나겠죠?

 

그렇기 때문에 자바는 똑같은 값을 또 호출 했을 때 전에 할당했던 메모리 주소를 넘겨주게 됩니다.

a == b 가 true 가 나오는 이유도 a 와 b가 똑같은 메모리 주소를 가르키고 있기 때문입니다.

**==은 메모리 주소를 비교합니다.**

만약 아직 할당 받지 않은 새로운 값이 들어온다면 Constant Pool 영역에 새롭게 메모리 영역을 할당 받게 되겠죠?

 

그렇다면 String의 경우 어떻게 처리하게 될까요?

String의 경우 원시타입이 아닌 참조 타입이지만 자바는 조금 특별한 방식으로 String을 처리합니다. 바로 String Constant Pool 이라는 영역을 따로 관리하고있는데요, 

원시타입과 마찬가지로 같은 값을 호출할 시에 새로운 메모리를 할당하지 않고 String Constant Pool영역에 이미 할당되어 있는 값을 가르키게 됩니다.

아래는 리터럴방식으로 할당한 문자열의 메모리주소를 정수값으로 출력하는 코드입니다. 보시다시피 결과가 같은 것을 보실 수 있습니다. 

public class Main {
	
	public static void main(String[] args) {
		String a = "str";
		String b = "str";
		
		System.out.println(System.identityHashCode(str));	//result:2008362258 
		System.out.println(System.identityHashCode(str2)); 	//result:2008362258
	}
	
}

 

이처럼 리터럴이 메모리를 할당받는 방식에 대해 조금이나마 이해하고 계신다면 나중에 자바의 equals 와 == 의 차이 

, new 연산자 등등 자바의 기초적인 지식을 이해하시는데 많은 도움이 되실겁니다.

 

이상 리터럴의 개념과 리터럴의 메모리 할당 방식에대해 간략하게 알아보았습니다.😀

 

 

Comments