2016년 7월 4일 월요일

Java Programming [10강] RAM의 구성

오늘은 프로그래밍보다는 컴퓨터 구조적인 이야기를 해볼까 합니다.
메모리에 관한 이야깁니다.
프로그램을 만든다는 것은 메서드에 필요한 데이터를 선언하고 데이터의 값을 처리하는 일련의 동작을 구성하는 것입니다. 즉, 프로그램은 데이터를 처리하는 방법을 작성하는 작업이라고 할 수 있습니다.

그렇다면 "데이터"는 물리적으로 컴퓨터의 어느 부분에 존재하는 것일까요?
정답부터 말하면, RAM이라고 부르는 메모리에 저장됩니다.
그럼 RAM의 구성(구조)에 대해서 알아봅시다.
1) RAM의 구성
우리가 여태 선언한 "변수" 컴퓨터의 스택(stack)영역에 존재합니다. 이 영역은 정형적 구조를 갖는 메모리가 존재하는 공간으로, 변수가 선언된 메서드가 실행되는 동안에는 스택영역에 메모리가 존재하게 됩니다. 메서드가 종료되면 없어지게 되죠. 어쨌든 메서드 실행 동안에는 보장되는 영역이라고 볼 수 있습니다.
변수를 선언할 때는 다음과 같다.
자료형 변수이름 = 값;(초기화)
ex) int num = 10;
이러한 선언방식을 기본형(primitive) 방식이라고 합니다. 즉, 선언하는 변수의 데이터 타입에 따라 메모리의 크기가 정해져있죠. int면 4byte이렇게 말이죠. 즉, 변수를 이용한 메모리 할당은 사용자가 원하는 대로 메모리 크기를 할당하는 것이 불가능 합니다. 메서드 내에서 선언된 변수를 {}영역 내에서만 존재한다고 해서 지역변수라고 부릅니다.

이와는 대조적이게도 클래스 객체나 배열은 사용자가 원하는 크기만큼의 메모리를 할당할 수 있습니다. 이 때문에 정형적인 메모리 공간인 stack영역에 존재할 수 없고, 대신 클래스 객체나 배열은 힙(heap)영역에 존재합니다. 클래스 객체와 배열을 전역변수, 흔히 Java에서는 인스턴스 변수라고 부릅니다.

지역변수와 인스턴스 변수, stack영역에 존재하는 메모리와 heap영역에 존재하는 메모리는 또한가지 중요한 차이가 있습니다.
지역변수로 메모리를 할당하면 변수의 이름으로 그 안의 데이터를 호출하는 것이 가능합니다. 그러나 인스턴스 변수는 heap영역에 사용자가 설정한 크기만큼의 메모리를 할당 할 뿐 메모리에 이름을 지어주지 않기 때문에 그 메모리 안의 데이터를 호출할 수 없습니다. 즉, 인스턴스 변수는 변수의 선언 만으로는 메모리를 이용하는 것이 불가능합니다. 따라서 heap영역에 할당한 메모리의 주소를 담는 변수를 선언해 이름을 지어줌으로써 그 이름으로 heap영역에 존재하는 메모리의 데이터를 처리할 수 있습니다. 이 방법은 밑에서 배열을 생성하는 방법을 설명할 때 자세히 설명하겠습니다.

마지막으로 인스턴스 변수에 "static"이라는 키워드를 붙인 것을 클래스 변수라고 부릅니다. 클래스 변수는 데이터 영역(다른말로는 static영역)에 존재합니다.

우리가 주목해야 할 메모리영역은 바로 heap영역입니다.

인스턴스 변수가 여러개 모여 메모리 덩어리를 이루면 그것을 객체라고 부릅니다. 다시 말하면, 객체 안에는 인스턴스 변수(전역 변수)가 여러개 모여있는 것이죠.

객체는 class또는 배열로 생성할 수 있습니다.

그럼 다음시간에는 배열에 대해서 공부해보도록 합시다.

댓글 없음:

댓글 쓰기