본문 바로가기

1:1 개발 공부

메모리 공간 : 힙, 스택, 포인터, 메모리 누수 / 클랙스, 함수, 객체, 메소드

메모리 공간 (스택, 힙, 정적 영역)

프로세스에는 스레드가 있고, 스레드에는 스택, 힙, 정적 영역으로 있습니다.

즉, 메모리 공간은 스택(Stack), 힙(heap), 정적(static) 영역으로 구성되어있습니다. 정적영역에는 코드영역과 데이터 영역으로 이루어져 있습니다.

프로세스가 실행될 때 힙과 정적영역만 스레드와 공유한다. (스택 제외)

프로세스가 실행되면, 스택, 힙, 코드영역, 데이터 영역 이렇게 4개의 메모리 구간을 할당받습니다. 그 중 스레드가 생성되면 힙, 코드, 데이터 영역은 프로세스에 할당된 것을 모든 스레드에 공유합니다. 

 

따라서, 스택에 있는 영역 혼자 공유가 되지 않습니다. 그렇다면, 스택에 있는 메모리를 공유받으려면 어떡해야 할까요? 바로바로 => 스택 영역에서 포인터를 통해 접근합니다. 포인터(pointer)로 스택에 있는 영역을 힙에서 할당받는 것이죠.

예를 들어볼까요? 서로 데이터를 공유해야합니다. 내가 덧셈한 걸 공유하고 싶을 때, 서로 스레드가 다르면 스택이 다르고, 스레드가 같아도 { }가 있으면 스택이 다릅니다. 그럼 데이터를 공유할 수 없겠죠? 그래서 '힙'영역을 만드는 것입니다. 힙은 메모리 주소공간입니다. 스택이 힙에 포인터로 해당 내용을 공유받고 있다가 다른 스택에도 공유하고 싶을 때, 힙의 메모리 주소공간을 다른 스택에 알려주죠. 그럼 다른 스택도 해당 힙에 포인터를 할 수 있고, 제가 사용하고 있는 포인터는 빠지게 됩니다.

즉, 포인터 자체는 스택에 있는 거고, 포인팅 하는 메모리 자체는 힙에 있습니다. 힙을 만들려면 new라는 키워드를 사용하고 회수를 하려면 delete가 필요합니다. 

 

하지만, 스택은 중괄호 { } 가 끝남과 동시에 삭제 되는 성질을 갖고 있습니다. 스택에 있는 메모리를 힙 영역에서 할당받아 공간을 남겨두었는데 -> 막상 스택에 있는 내용은 삭제 되었으니 -> 힙에 남겨둔 메모리는 아무것도 없이 '텅'비어있겠죠? 이렇게 메모리가 낭비되는 현상을 "메모리 누수"라고합니다. 따라서 개발자는 힙에서 꼭 'delete'를 입력해주어야 하는 것이죠!

 


클랙스, 객체, 메소드

메소드와 함수에 대한 차이를 알고 계신가요? 

메소드는 클래스에 속해 있는 것, 함수는 속해있지 않는 것을 의미합니다. 

 

예시를 들어볼까요? ('나'가 백수라는 가정하에)

나와 선생님은 사람이다.

나는 사람이고 선생님은 ㅇㅇ학교에 속한 선생님이다. 따라서, '나'는 '함수', '선생님'은 '메소드'입니다. 그리고 'ㅇㅇ학교'는 '클래스'가 되는 것입니다!

 

더 나아가 메소드에 대한 설명을 조금 해볼까요?

나와 선생님 모두 사람이라 행동할 수 있습니다. 예를 들어 '커피를 마신다.'라고 했을 때, 저는 커피를 오른 손으로 컵을 들어서 마실 수 있고, 선생님은 빨대를 이용해서 마실 수도 있는 거죠. 둘 다 커피를 마신다라는 행동은 같지만 어떻게 행동하는 지 방법은 다릅니다. 따라서 메소드는 행동이자 method(방법) 인 것이죠.

 

클래스와 객체

클래스는 코드이자 문서와도 같은 개념입니다. '객체'인 승승이에게 부여된 역할을 정의하고 행동하도록 하는 것입니다. '승승이'라는 객체 1명에게 다양한 역할이 부여될 수 있습니다. 위의 그림과 같이 승승이는 '여자'이기도 하고, '딸'이기도 하며, '학생' 이기도 하기 때문에 수행 해야 할 일도 다양해집니다. 딸로서 효도도 해야하고, 학생으로서 공부도 해야하기 때문입니다.

 

이걸 코드로 표현 한다면 아래와 같습니다.

승승이 = new 딸;

승승이는 객체 , 딸은 클래스 인 것입니다. 

 

저와 혜수 언니의 공통점인 '여자'(내세울 공통점이 여자밖에 없네요..ㅎ)

무튼, '저'도 '혜수 언'니도 '여자'만이 할 수 있는 '역할'을 수행 할 수 있습니다. 코드로 나타내면 이렇게 표현할 수 있습니다.

여자*여자 = new 승승이
여자*여자 = new 김혜수

다른 예시를 하나 더 들어보도록 하겠습니다.

'오징어 게임'에 있던 '오일남'이라는 '역할'을 정우성도, 이정재도 할 수 있습니다. 감독은 누가 되었든 '오일남'이라는 역할만 훌륭하게 해내면 됩니다. 다만, 정우성이 연기하는 오일남과, 이정재가 연기하는 오일남이 다르겠죠? 이미 두 사람의 외모부터, 발성, 억양, 표정 모든게 다르니까요.

프로그래밍도 같습니다. 같은 '더블 클릭'이라는 동작을 수행 했을 때, 어떤 것은 폴더 리스트가 나타나고 어떤 것은 페이지가 나타납니다. 사용자가 어떻게 이 시스템을 사용하게 할 것이냐에 따라 오일남을 정우성 버전으로 할 지, 이정재 버전으로 할 지 정하는 것입니다. 

 

공부하면서 느낀건데(그래봤자 수업 2번 들었지만..ㅎ) 프로그래밍은 컴퓨터 입장에서도, 유저 입장에서도, 다른 개발자 입장에서도 고려를 해야하기 때문에 생각보다 '기획'적인 측면이 많이 들어가는 것 같습니다. 결론은 코딩이나 알고리즘을 짜는게 아니고 컴퓨터에 대한 전반적인 내용과 개념을 하나하나 이해하는 과정이라 제 입장에선 넘넘 재밌습니다ㅠ 꿀잼♡