컴퓨터 메모리 구조의 이해 - 컴퓨터 호텔에는 객체가 투숙해요.

J쭈디·2025년 2월 11일
0

1. 컴퓨터 메모리 구조의 이해에 대하여

처음 프로그래밍을 공부할 때 사람들이 제일 어려워 하는 부분 중 하나가 도대체 왜? 왜? 왜? 코드가 이렇게 돌아가는 지 사람의 머리로는 이해가 불가한다는 점일 것이다.

프로그래밍을 이해하기 위해서는 내가 컴퓨터의 입장에서 생각을 해 봐야 하기 때문이다. 근데 0 아니면 1 밖에 안 쓰는 이런 멍텅구리 기계를 내가 어떻게 이해해요? 라는 의문이 든다면 ... 어쩔 수 없다. 이해하시던가 이 길을 떠나시는 수 밖에 없습니다. 휴먼

아무튼, 이제 내가 소소하게 상상력을 발휘하여 메모리 구조를 이해했던 개념을 설명해보려고 한다.

사실 다른 공부 하다가 불변객체와 가변객체에 대해 나오고...그 덕에 메모리 구조에 대한 글을 쓰고 싶어져서 이렇게 된건데 꽤 길어질 것 같다. 어떡하지

1. 힙? 스택? 객체? 너무 어렵잖아요 ㅠ

처음 힙이 뭔지, 스택이 뭔지, 객체가 뭔지 도대체 알 수 없을 것이다. 나는 영어 힙이라곤 엉덩이 밖에 몰라요.

그러나 이 글을 보면 50% 이상은 메모리 구조에 대한 개념이 잡힐 것이라고 확신한다. 왜냐면 내가 컴퓨터 1도 모르는 중학생 늦둥이 동생 데리고 이 얘기를 했는데 걔도 이해했기 때문이다.

일단 컴퓨터의 저장 구조에는 힙 영역이 있고, 스택 영역이 있다.
힙(Heap)은 "객체가 실제로 저장되는 공간"
스택(Stack)은 "객체를 가리키는 참조 변수(이름표)가 저장되는 공간"

근데 아무리 봐도 초심자는 이게 무슨 말인지 1도 모를것이라 확신한다. 용어 자체가 어렵다고 느끼고 울면서 뒤로가기 할 당신, 스톱.. 아직 안 끝났다. 난 원래 투머치 토커니까 잠시 진정하고 울지마요.

2. 컴퓨터 호텔에는 객체가 투숙해요.

이게 내가 메모리 구조를 이해했던 방법인데 바로 컴퓨터를 거대한 호텔이라 생각한 것이다.

위풍 당당 쭈디스 컴퓨터 호텔에 어서오세요. 사용자는 쭈디 뿐입니다. 왜냐고? 내꺼잖아요. 님은 ~님스 컴퓨터 호텔 쓰시면 됌.

String hi = "Hello";

이러한 객체가 저장된다고 생각해보자.

"쭈디스 컴퓨터"라는 호텔이 있다.

거기서 나는 1020호실에 String이라는 형태로 투숙하는 "Hello"이다. 그리고 1020호실은 변수명(방 키) hi와 연결되어 있다.
실제로 나는 1020호실에 투숙되어 있는데, 사용되는 이름은 호실명이 아니고 hi라는 이름인 것이다.

이게 실화야? 싶겠지만 실화다.

심지어 String 값은 불변객체라는 것도 난 오늘 처음 알았다. 호텔방 비유를 만들 정도로 이해해놓고 불변객체는 모르는 바보 바로 나야나

우리가 프로그래밍을 하다가 String 값은 .equals로 비교하면 문제가 없는데 ==으로 쓰면 만족스런 결과가 안 나온 적이 많을 것이다.

이는 바로 String이 불변객체이기 때문이다.
String 타입 "Hello"를 위처럼 hi라는 변수명으로 쓰다가 hi의 값을 "Hello world" 바꾸고 싶을 때가 있을 것이다. 이 때 hi는 1020호실의 "Hello"의 연결을 끊고, 새로운 1302호에 "Hello world"를 투숙시킨 뒤에 1302호에 연결을 해서 사용하는 형태이다.

사실상 String 형태의 Hello는 그대로 1020호실에 남아있는 것이다.
이로 인해 String의 변수명을 동일하게 쓰면서 값을 바꾸지만 않는다면 == 형태로 비교를 해도 에러가 발생하지 않을 수 있으나, 대부분의 코드에서는 변수명은 동일하게 하고 값을 바꾸는 일이 부지기수이다.

컴퓨터 호텔의 방식으로 설명해본다면 ==은 호텔방 번호를 비교하는 것이고,
.equals()는 투숙객을 비교하는 것이다.
즉, 같은 방(객체)을 가리키고 있지 않으면 ==은 false가 되고,
방번호가 다르더라도 내부 투숙객이 같다면 .equals()는 true가 된다.

==은 객체의 주소를 비교하는 이는 최초의 1020호실과 동일한 주소여야지 동일하다고 본다. 그러나, equals는 호실 상관 없이 내부에 있는 정보를 비교한다.

이러한 구조로 위의 힙과 스택을 설명하자면, 힙이 호텔방이라면, 스택은 호텔방을 가리키는 "방 키"라고 생각하면 된다!

3. 번외편, zip과 포렌식도 메모리 구조로 설명해보자!

위에서 설명한 구조로 인해 이해가 되었다면 zip파일에 대한 설명도 가능하고 포렌식 또한 설명이 가능할 것이다.

zip파일의 경우 어떤 파일은 압축률이 높고, 어떤 파일은 압축률이 낮지 않은가? 이 이유 또한 호텔로 예시를 들 수 있다.

1. zip은 빈 방이 많아야 작아져요

zip파일은 사실 반복되는 값이 많으면 그 부분을 하나의 코드로 줄일 수 있는데, 이러한 설명 다 치워버리고 그저 호텔에 빈 방이 많아서 빈 방만큼 크기를 줄일 수 있다고 생각하면 된다.

반면 방이 여러가지 겹치지 않는 값으로 꽉꽉 차 있으면 방이 비질 않았으니 그만큼 크기가 줄어들지 않는 것이다.

  • GPT의 강요에 의한 추가설명 아니 AI가 검수만 하면 될 걸 자꾸 더 쓰라고 하네 이미 스압인데...
    • 호텔방 안의 가구(데이터)가 다 비슷하면, "이 가구 100개 있음!" 이렇게 요약해서 저장할 수 있음.
    • 반면, 모든 방마다 다 다른 가구(데이터)로 꽉 차 있으면 압축할 방법이 없음!
    • 즉, "반복되는 데이터가 많을수록 압축률이 높고, 데이터가 랜덤할수록 압축률이 낮다!"

2. 왜 어떤 건 포렌식 되고 내껀 안돼? 사기아냐?

분명 포렌식으로 다 된다는 얘기를 들었으나, 중요한 파일을 가지고 복구를 맡겼는데 복구가 안된다는 이야기를 들어본 적이 있을 것이다.

아 물론 포렌식이라는 건 사건의 법적인 증거로서 활용될 수 있는 정보를 복구하는 행위이므로 정확히는 사적인 복구에는 포렌식이 쓰이면 안되고, 그냥 파일 복구 정도라고 쓸 수 있겠다.

이 때에도 파일이 호실에 저장되고 다시 삭제될 때 어떤 구조로 삭제되는지를 이해하면 간편하다. 호텔 방에 누군가 투숙을 하고 있는데, 사용자가 그 투숙한 객체에 자기만의 이름을 붙이고 사용하다가 그 이름이 붙은 파일을 삭제할 수가 있다.

여기서 다들 착각하는 부분이 생긴다. 파일을 삭제했으니 당연히 남은 정보도 없겠지?

절대 아니다.

컴퓨터라는 이름의 호텔은 투숙객이 나태하다. 체크아웃도 다음 손님이 와야 겨우 하고 나가기 때문이다. 물론 사용자가 그걸 알고 의도적으로 나가세요!!! 라고 하면 나가긴 한다.

또는 피치못할 사정으로 스스로 나가기도 한다.

예를 들어 1002호실의 투숙객이 101.img 파일인데, 그 이미지 파일을 지워버렸다.
하지만 실제로는 바로 1002호실의 내부가 싹 지워지는게 아닌 것이다.
사실 101.img라는 이름만 사라졌을 뿐 1002호실에 그 정보는 그대로 존재하게 된다.


GPT 이미지로 표현해봤는데 021호는 이미 삭제되었지만 값이 남아있는 유령 상태이고, 2012호는 새 값이라고 볼 수 있겠다.

  • 댕청구리 쭈디스 대신 GPT가 명료하게 정리한 바로는 아래와 같다
    • 파일을 삭제해도, 실제 데이터(호텔방 내부)는 그대로 남아 있음.
    • 단지 파일을 가리키는 방 키(파일 시스템 정보)만 삭제되는 것!
    • 그래서 포렌식(파일 복구)이 가능한 것!
    • 하지만 새로운 데이터가 계속 저장되면 기존 데이터가 덮어씌워져서 복구가 어려워짐.

따라서 복구의 가능 여부도 컴퓨터 사용법에 따라 다 다른 것이다.

  1. 얼마나 컴퓨터에 새 파일을 생성을 자주했는가? -> 많이 생성할 수록 삭제 파일도 금방 사라진다. 체크인 하는 투숙객이 많으니까

  2. 컴퓨터 파일을 빠른 포멧으로 했는가? -> 호실 내부 청소 안함, 내부정보 남아있을 확률 매우 높음

즉, "컴퓨터가 새로운 데이터를 저장할 때까지, 삭제된 파일은 호텔방에 남아 있다."
그러나 새로운 파일(투숙객)이 들어오면 이전 데이터는 영원히 사라진다!

이런 것이다. 따라서 삭제되고 시일이 오래 지나도록 계속 주구장창 컴퓨터 써 놓고 파일 복구 안된다고 하거나, 파일을 일반 포멧으로 오래 돌려서 삭제해놓고 복구 안된다고 하면 전문가한테 너무한 행동이다. 정보가 안 남겨져 있는데 어떻게 복구해요 이사람아. 복구하는 사람은 회귀를 시키는 마법사가 아닙니다.

profile
언제 어느 위치에 있더라도 그 자리의 최선을 다 하는 사람이 되고 싶습니다.

0개의 댓글