본문 바로가기

Hub Development/JavaScript

[JS] JavaScript와 Java의 변수 메모리 할당 방식 차이

728x90

👻 JavaScript vs Java : 언어 유형과 실행 방식의 차이


🔹javascript는 스크립트 언어인 반면에 java는 컴파일 언어이다. 스크립트 언어와 컴파일 언어는 어떤 차이가 있을까?

 

스크립트 언어의 특징은 위에서 부터 끝까지 코드를 차례대로 실행한다는 것이다. 만약 100줄의 코드가 정의되어 있다면 1줄을 실행하고 다음 한 줄을 실행하고 하는 방식으로 100번째까지 실행해 나간다. 반면에 컴파일 언어는 100줄의 코드가 있다면 100줄을 모두 한번에 읽어 들여서 전체를 파악하고 코드를 실행해 나갑니다. 코드의 순서도 꼭 차례대로가 아니라 가다가 함수나 메소드를 만나면 그 안으로 들어가 그 안의 내용을 먼저 실행하기도 한다.

 

또한, 자바는 JRE와 JDK를 설치하여 JVM을 이용해, JAVA가 OS에 구애받지 않고 메모리 재사용을 가능하게 해 준다. 자바스크립트는 JVM을 사용하지 않아도, 웹브라우저 위에서 실행되고, 별도의 환경설정은 필요하지 않다. 변수에 값을 할당할 때 동적으로 메모리가 할당되며, C언어와 같은 경우는 메모리를 할당하고 해제해야 하지만, 자바와 자바스크립트는 가비지 컬렉션을 활용하여 더 이상 사용되지 않는 객체를 자동 수거한다. 따라서 프로그래머는 대부분의 경우에 동적 메모리 할당 및 해제를 직접 다룰 필요가 없다.

 

이와 같은 Java와 Javascript의 차이는 변수의 메모리 할당 방식에서도 나타난다.

 

📑 JavaScript의 변수 메모리 할당 방식


🔹 JavaScript 의 경우 java 와 다르게 변수를 선언할 수 있는 이유가 궁금했다. JavaScript가 var 라는 키워드에 int, boolean, string 등 다양한 타입의 데이터를 마음대로 변환하여 대입할 수 있는 이유는 아래와 같은 방식으로 데이터를 할당하기 때문이다.

// 할당방식 1
var a;
a = 'abc';

// 할당방식 2
var a = 'abc';

JavaScript의 메모리 할당 방식

위에서 보여지는 두가지 방식 모두 같은 결과를 반환하게 된다. JavaScript 는 a라는 식별자에 바로 데이터를 저장하지 않고, abc라는 값을 저장할 새로운 공간을 찾거나 없으면 만든 뒤에 해당 값을 저장한 후, 해당 주소값을 a에 저장한다.

 

Int와 같은 숫자 자료형이나 String과 같은 문자열 자료형 등 각각의 데이터는 미리 확보하는 데이터 공간의 크기가 제각각인데 ( 숫자 - 8 byte, 영어- 1byte 등..) 만약 변수영역에 바로 값을 대입한다고 가정하고 미리 잡아놓은 공간보다 큰 데이터가 새로 할당이 된다면 부족한 공간 만큼 늘리는 작업이 필요할 것 이다. 이 주소공간이 어떤 데이터들의 사이에 존재한다면 해당 데이터의 뒤에 존재하는 모든 데이터를 뒤로 옮기고 식별자를 다시 연결하는 작업이 필요할 것 이다.

 

변수영역에서 값을 바로 할당하지 않고 저장하려는 데이터에 따라서, 데이터 영역의 공간을 새로 만들고, 그곳의 주소를 변수 영역에 할당하는 것이 이러한 이유이다. 즉, 이러한 메모리 영역을 코드로 작성하기 위해서는 "변수영역에 데이터 영역의 주소를 할당한다" 라는 생각으로 코드를 작성해야 한다.

 

🤔 JavaScript와 Java의 비교


🔹 자바에서도 메모리는 변수 영역과 데이터 영역으로 나뉘어 관리된다. 그렇기 때문에 JavaScript와 자바의 변수 할당 방식에 어떤 차이가 있는지 비교해봤다.

 

1. JavaScript의 변수 할당 방식 :  

 

    ◈ JavaScript에서 변수를 선언하면, 해당 변수에는 데이터가 직접 저장되는 것이 아니라 데이터가 저장된 메모리 주소가 할당된다. 이때 실제 데이터가 저장된 메모리 주소가 변수에 할당된다.

    ◈ 데이터 할당 시에는 해당 데이터의 크기를 고려하여 새로운 공간을 할당하고, 그 주소를 변수에 할당한다. 따라서 데이터의 크기에 상관없이 식별자(변수)의 크기는 동일하다.

 

2. Java의 변수 할당 방식 :

 

    ◈ Java에서도 변수는 메모리에 저장된다. 그러나 변수에 직접 데이터를 저장하는 것이 아니라, 데이터가 저장된 메모리 주소를 변수에 할당한다. 이를 "참조 변수"라고 한다.

    ◈ 자바의 변수는 데이터 타입에 따라 메모리 크기가 결정되며, 이는 변수의 선언 시점에서 결정된다. 따라서 변수의 크기는 데이터 타입에 의해 결정되고, 실제 데이터가 저장된 메모리 공간과는 별개이다. 

 

 그럼 JavaScript의 메모리 할당 방식이 더 효율적인거 아닐까

 

🔸  결론적으로, JavaScript에서는 변수의 크기가 동적으로 결정되지 않고, 모든 변수의 크기가 동일하며 변수는 데이터가 아니라 데이터가 저장된 메모리 주소를 가리키는 것이므로, 변수 자체의 크기는 주소를 저장하기 위한 고정된 크기를 가진다. 이러한 방식은 메모리 사용이 효율적으로 이루어질 수 있다. 또한, 변수의 크기를 고려하지 않고 프로그래밍을 할 수 있어 개발자에게 편의를 제공할 수 있다.

 

반면, 자바는 정적 타입 언어로서 컴파일 시점에 변수의 타입이 결정되며, 변수를 선언할 때 사용하는 데이터 타입에 따라 변수의 크기가 결정되고, 이는 변수의 선언 시점에서 고정된다. 이러한 방식은 성능 최적화 및 메모리 관리를 위한 목적으로 이루어지는데, 변수의 크기가 미리 결정되면 메모리를 효율적으로 할당하고 관리할 수 있다. 또한, 자바의 강한 타입 시스템은 코드의 안정성을 높이는 데 도움이 된다.

 

따라서 언어마다 메모리 할당 방식이 다르며, 각각의 방식은 해당 언어의 설계 목표와 사용 환경에 적합한 방식으로 결정된다. JavaScript의 동적 메모리 할당 방식이 유리한 상황도 있을 수 있지만, 자바의 정적 타입 시스템과 메모리 관리 기능은 다른 상황에서 더 적합할 수 있으므로 각 방식마다 장점에 따라서 사용을 해야한다.

 

⚙️ 효율적인 메모리관리


🔸 이렇게 변수영역과 데이터영역을 나눠서 관리되는 것은 반복적인 데이터를 저장할때도 도움이 된다.


ex) 숫자 5를 500개의 변수에 할당하는 작업을 한다고 가정


변수영역에 값을 바로 할당한다면, 숫자형은 8byte를 사용하니, 8 * 500 = 4000byte가 필요하게 된다. 하지만 변수영역과 데이터영역을 나눈다면, 주소공간의 크기를 2byte라고 했을 때, 2 * 500 + 8 = 1008 byte 공간이 필요하게 된다. 굳이 불필요한 메모리를 사용할 필요가 없게된다.

 

📸 참조


https://galid1.tistory.com/661