본문 바로가기

개발 코딩 정보 공유

객체는 어떻게 조작할까? 객체와 메모리와의 관계

 

 

 

 

 

 

 

 

객체는 어떻게 조작할까? 객체와 메모리와의 관계

 

 

 

 

 

 

객체의 조작

 

 

 

다들 객체에 대해서는 대충이라도 알고 계실거라고 생각하는데요.

이번 장은 그 객체에 대해서 좀 더 자세하게 들여다 보려고 합니다.

“객체를 생성하다” 라는 액션 자체는 메모리에 그만큼의 공간을 차지하는 결과가 됩니다.

 

그럼 ! 생성한 이 객체를 어떻게 조작할 것인가?

 

AClass a = new Aclass();

 

바로 우리가 아무 생각없이 썼던 이러한 구문에서 AClass 타입의 객체가 생성되고 

(이 타입의 객체를 만들어줘~! 라고 말하는것과 같음) 

a 참조자(식별자)를 이용해 객체를 조작할 수 있는 것이죠.

우리가 프로그래밍에서 대부분의 시간을 보내는 부분이 바로 객체를 생성하고 조작하는 일입니다.

 

그렇다면 아래와 같은 경우는 어떻게 될까요?

 

AClass a;

a.getAClass();

 

당연히 에러가 나겠죠. Class a 는 참조자만 정의 했을뿐 실제로 메모리에 객체가 생성되지 못하였습니다.

반드시 객체 생성은 new 키워드를 통해서 생성해야 한다는 점!

위에서 말한게 맞다면 객체 생성은 메모리에 올리는 행위가 맞습니다.

 

“그렇다면 대체 메모리 어디에? 올라가는 것일까요?”

 

 

 

 

객체와 메모리와의 관계

 

 

이쯤에서 반드시! 꼭! 메모리 영역에 대해서 알고 가야 합니다.

 

1. 스택(stack) : 스택은 많이 들어보셨을겁니다. 스택은 RAM 에 위치 하는 메모리 영역입니다. 이 스택이라는 놈은 LIFO(Last in Last Out) 구조를 가지고 있죠. 마지막에 들어온 놈이 먼저 나간다는 말입니다. 희안하죠?

이 스택은 레지스터 다음으로 속도가 빠르고 효율적인 메모리 입니다. 스택포인터 를 이용해 내부적으로 값을 관리 하게 되는데 이 값은 변동되기 때문에 컴파일 시에 정확히 저장할 데이터가 어떤놈이고 얼마나 자리를 차지할 것이지 알아야 합니다. 이 영역에 바로 객체 참조 가 할당됩니다. AClass a; 이 부분이라고 보면 됩니다.

a 참조자가 스택에 할당 되면 이쯤에서 new AClass() 는 어디에?? 라고 생각할수 있습니다.

 

 

2. 힙(heap) : 스택은 빠르고 효율적이지만 고정된 값을 할당하기 때문에 유연하지 못합니다. 그래서 힙 영역을 이용합니다. 자바의 모든 객체는 이곳에 저장됩니다. new 키워드를 통해 생성되는 모든것이 말이죠. 컴파일러 입장에서는 이 영역에 대해서 신경쓸 필요가 없습니다. 얼마나 필요한지 얼마동안 쓸지 전혀 알 필요가 없죠. 프로그램이 실행되는 동안 이곳에서는 객체가 계속 생성되고 또한 계속 사라지게 됩니다.

 

즉. 스택에 참조자 를 할당하고 그 참조자에 연결되어 있는 실제 데이터(객체)는 힙에 쌓이게 됩니다.

 

[스택]         [힙]

[a참조자]  ——> [AClass 객체]

 

그렇다면 이렇게 하면 어떨까요?

 

a = new AClass(); //같은 참조자에 다시 생성하였습니다.

 

그럼 아래와 같은 일이 생기게 됩니다.

 

[스택]         [힙]

          [아까 그 AClass 객체] // 곧 사라질 혹은 사라진.

[a참조자]  ——> [새로운 AClass 객체]

 

a참조자는 다시 새로운 힙 영역의 주소(새로운 객체 생성)로 연결되었으며 아까 그 객체는 사라질 위기에 처합니다. 아니면 벌써 사라졌거나요. 자바는 가비지콜렉터에 의해 메모리를 관리하는데요. 우리는 새로운 AClass 객체를 만들어줌으로 인해 가비지 콜렉터 가 판단하여 사용하지 않은 메모리(아까그 객체 같은) 들을 알아서 해제 시켜 버립니다. 우리가 신경쓸일이 아닌거지요. 어쨋거나 저쨋거나… 객체 사용과 메모리까지 공부해 보았습니다.

 

 

그럼 이만!!