변수와 객체와 메모리의 관계! 자바를 예로 들어 변수와 객체는 메모리에 어떻게 저장되는지 정말 쉽게 설명해요!

  Рет қаралды 16,886

쉬운코드

쉬운코드

Күн бұрын

Пікірлер: 98
@ez.
@ez. 2 жыл бұрын
몇 가지 추가 설명 드립니다. 1. (22년 12월 20일 추가 댓글) 이 영상의 초기 버전은 잘못 설명하는 부분이 있었습니다 나중에 문제를 깨닫고 일부는 잘라내기를 했지만 일부는 영상 흐름 상 잘라낼 수가 없어서 그대로 뒀습니다 대표적으로 03:35에 '객체는 힙 메모리에 저장된다'고 했는데 이 부분은 언어마다 조금씩 다릅니다 하지만 저는 영상을 만들 당시까지만 해도 '언어 상관없이 객체는 무조건 힙 메모리에 저장된다'고 잘못 알고 있었고, 그래서 이 영상에서도 그렇게 설명을 했었던 것입니다 이와 관련된 자세한 내용은 쉬운코드 블로그에 정리된 글을 참고해 주세요 easy-code-yo.tistory.com/58 2. (22년 12월 20일 추가 댓글) 자바를 기준으로 설명한 것이기 때문에 다른 언어에서는 조금씩 다를 수 있습니다. 그러므로 사용하시는 언어가 메모리 관리를 어떻게 정확히 파악하는 것이 중요합니다 3. 스택 프레임(stack frame)에는 매개변수나 지역변수만 저장되는 것이 아닙니다. 이것보다 더 많은 정보들이 담기지만, 이번 영상은 코드에 정의된 변수와 객체가 메모리에 어떻게 저장 되는지를 살피는 영상이라 이 부분만 다뤘습니다. 4. (22년 9월 26일 추가 댓글) C++에서는 스택 메모리 영역에서도 객체를 생성할 수 있습니다 (영상 만들 당시에는 이 부분을 잘 몰랐습니다ㅠㅠ) 그럼 새해도 레츠코드!
@갈가마구
@갈가마구 2 жыл бұрын
오늘은 두번 봤습니다. 객체가 힙영역에 저장된다는 사실을 첨 알았습니다. 재밌네요 고맙습니다.
@ez.
@ez. 2 жыл бұрын
우와우!! 두 번이나 봐주시고 감사합니다 ㅠㅠ 열정에 저도 좋은 자극을 받습니다 :)
@chupinadventure
@chupinadventure 11 ай бұрын
선생님 강의를 볼때마다 하나둘씩 깨닫습니다. 머릿속에 산재되어있던 지식들이 연결됩니다. 이것이 기본의 힘인가.... GOAT!!!!
@dsfsdfdwefdsfv8069
@dsfsdfdwefdsfv8069 2 жыл бұрын
설명 기가 막히네요 잘 보고 갑니다~
@ez.
@ez. 2 жыл бұрын
감사합니다~!! 계속해서 기막힌 설명들이 공급될 예정이니 자주 들러주세요 :) ㅎㅎ
@Ch-yn9io
@Ch-yn9io 8 ай бұрын
최곱니다 진짜
@Simjuyong
@Simjuyong 2 жыл бұрын
python 기초 java 기초 쪼금쪼금씩 아는 저에게는 진짜 도움이 많이 되는 강의입니다. 감사합니다!
@ez.
@ez. 2 жыл бұрын
와우 도움이 된다니 저도 많이 뿌듯하네요 :) 좋은 영상으로 계속 응원하겠습니다!!
@ipad1652
@ipad1652 11 ай бұрын
이해가 너무 잘되네요 감사합니다
@LeeMyeongjae
@LeeMyeongjae 2 жыл бұрын
와 많이 배워갑니다! ㅎㅎ
@ez.
@ez. 2 жыл бұрын
와 이명재TV님~! 영상도 열심히 봐주시고 댓글도 자주 달아주셔서 감사해요~! 도움이 된 것 같아서 저도 뿌듯뿌듯합니다 :)
@윤경식-b9b
@윤경식-b9b Жыл бұрын
최고입니다!
@ez.
@ez. Жыл бұрын
감사합니다! 👍
@samuell_dev
@samuell_dev 2 жыл бұрын
좋은 설명감사합니다!!!!!
@ez.
@ez. 2 жыл бұрын
크~~ 휘이익님 오늘도 댓글 감사합니다 :)
@튜어기리니아
@튜어기리니아 Жыл бұрын
스택과 힙메모리 영역이 머리속에 그려지지 않았는데 정말 이해하기 쉽게 잘 설명해주셔서 코드 실행흐름을 이해할 수 있었습니다 감사합니다!!
@혁이-h6t
@혁이-h6t 2 жыл бұрын
쉽게 잘 설명해주셔서 감사합니다!!
@ez.
@ez. 2 жыл бұрын
좋게 봐주셔서 감사합니다 :) 앞으로도 채널 이름값 하도록 열심히 할게요!ㅎㅎ 👍
@minjoon1324
@minjoon1324 Жыл бұрын
정말 많은 도움이 되었습니다. 감사합니다.
@ez.
@ez. Жыл бұрын
그렇다면 저도 정말 뿌듯하네요 :) 댓글 감사합니다 👍
@starlightknights
@starlightknights Жыл бұрын
멋진 강의 감사합니다.
@dawogdp
@dawogdp Жыл бұрын
감사합니다 ! 정말 많은 도움이 되었어요 !! 감사합니다 :D
@ez.
@ez. Жыл бұрын
크~~ 영상을 유익하게 봐주셔서 저도 감사합니다 :)
@langlord6909
@langlord6909 Жыл бұрын
좋은 내용이네요 감사합니다
@ez.
@ez. Жыл бұрын
좋게 봐주셔서 감사합니다 :)
@wisiasa
@wisiasa Жыл бұрын
좋은 영상 감사합니다! :)
@doping8719
@doping8719 2 жыл бұрын
감사합니다!
@ez.
@ez. 2 жыл бұрын
새해 복 많이 받으세요~! 함께 성장하는 2022년 되길 바랍니당 :)
@조용수-o8g
@조용수-o8g 2 жыл бұрын
도움 많이 됩니당! 좋아요
@ez.
@ez. 2 жыл бұрын
저도 댓글 좋아용👍
@notthings6443
@notthings6443 9 ай бұрын
감사합니다
@KoreanMacho
@KoreanMacho Жыл бұрын
쉬운코드님 영상 너무 잘 보고 있습니다. 유용한 컨텐츠 감사합니다. 혹시 영상 촬영시 파워포인트를 사용하시나요? 프레즌테이션 모드로 설명을 해주시는건 아닌 것 같은데...궁금하네요
@ez.
@ez. Жыл бұрын
항상 애청해 주셔서 감사합니다 :) 콘텐츠 자체는 구글 프레젠테이션으로 만들고요, 그걸 아이패드에서 화면 녹화하면서 영상을 찍어요 그리고 촬영이 끝나면 편집하고 최종 업로드해요
@KoreanMacho
@KoreanMacho Жыл бұрын
@@ez. 답변 너무 감사드립니다 :)
@asciicode8151
@asciicode8151 Жыл бұрын
아 ㅠㅠㅠ 혹시 JAVA 전문 개발자이신가요??? JAVA를 기준으로 했을 때에는 영상에서 하신 말씀들이 모두 맞는데, 다른 언어 예를 들어 C/C++에서는 틀린 말씀들이 있어요. 1. 반환값이 존재하는 함수/메서드의 경우, 함수/메서드가 종료돼 스택 프레임이 해제될 시에, 반환값은 남겨 두고 해제가 됩니다.( 컴파일러 지식이 필요함) 2. Heap 영역에는 객체뿐만 아니라, 예를 들어 C/C++에서는 기본 자료형 변수도 할당받을 수 있습니다. 3. C++에서는 객체를 stack 영역에서도 생성할 수가 있습니다. 4. gc는 JAVA, Python 뿐만 아니라, C++ 11(17?)부터는 스마트 포인터가 생겨서 개발자가 직접 메모리 해제를 하지 않고, gc와 같이 자동으로 해줍니다. ( 요즘에는 거의 모든 개발에 있어서, 이 스마트 포인터를 사용합니다. 메모리 안정성을 위하여!!!) 5. 그리고 참고 변수(reference)에는 메모리의 실제 주소 값이 들어 가는 것이 아닙니다.( 이건, IDE에서 확인을 마쳤음요 ) 위와 같은 언어 사이의 차이점으로 인해, 운영체제나 다른 CS과목들은 보통, 하드웨어에 밀접한 언어인 C/C++과 같은 Low Level 언어를 기준으로 설명하시는 것이 저 개인적으로는 올바르다고 생각을 합니다. 제가 틀렸을 수도....
@ez.
@ez. Жыл бұрын
아닙니다 ㅠㅠ ASCII CODE 님 말씀이 다 맞을거 같아요 ㅠㅠ 우선 이렇게 자세히 피드백을 주셔서 정말 정말 감사합니다! 덕분에 지금이라도 잘못 설명한 부분을 발견할 수 있었어요 올바른 정보를 제공할 수 있게 피드백 주셔서 진심으로 감사합니다 ㅠㅠ 이 영상을 만들 당시까지도 저는, "언어 상관 없이 객체는 heap 메모리에 저장되고 stack 메모리에는 함수나 메서드와 관련된 지역 변수 매개변수, 참조 변수가 저장된다" 라고 잘못 알고 있었어요 아주 오래전부터 수 년동안 이렇게 알고 있었고 그래서 제가 잘 아는 언어인 자바를 예로 들어 이렇게 영상으로 만들게 됐었는데 제가 잘못 알고 있었습니다.. 사실 조금만 생각해 보면,, 언어마다 다를 가능성이 있고, 특히나 C/C++ 같이 OS나 하드웨어에 가까운 언어들은 메모리 사용에 자유도가 커서 더 다를 수 있다는 생각을 했어야 했는데, 이 부분을 오랫동안 의심조차 해보지 않았다는 것이 많이 뼈아프네요 ㅠ 지난 9월 즘에 다른 애청자 분과 댓글에서 얘기하다 보니 제가 뭔가 잘못 알고 있다는 것을 그때서야 처음 깨닫게 됐고, 그때도 pin된 댓글을 통해 C++ 관련 내용을 추가했었는데, 그 이후에 더 자세히 점검하지 못했던 것도 곱씹어 보면 볼수록 제 자신에게 아쉽습니다 ㅠㅠ 항상 댓글로 응원해 주시고 애청해 주셔서 늘 감사했었는데, 이번에 이렇게 피드백을 주셔서 저도 잘못 알고 있던 부분을 알게 됐고, 채널에서도 내용을 정정할 수 있는 기회를 주셔서 정말로 감사합니다!! 해당 영상은 아래와 같이 조치를 취할 예정이에요 * 이 영상은 기존 재생목록 중 백발백중 시리즈와 운영체제에서는 제외하고, 자바라는 재생목록을 하나 만들어서 그쪽으로 분류할 예정입니다 * 타이틀과 썸네일도 자바라고 명시 할 예정이고요, * 이미 조회수가 2천회가 넘는 영상이라 따로 정정 공지 비슷하게 구독자 분들께 알려드릴 예정이에요~ 이번에 큰 도움 받았습니다 👍👍👍👍👍 감사합니다 :)
@asciicode8151
@asciicode8151 Жыл бұрын
@@ez. ㅠㅠㅠ 제가 더 감사하죠. 데이터 베이스 편 정주행해서 얻은 것이 너무나도 컸습니다요 ㅎㅅㅎ. 대학생 나부랭이가 백엔드 5년 경력자한테 감히 피드백을 해도 될까? 라고 걱정했는데 이렇게 좋게 말씀해주셔서 감사해요. 그럼 오늘도 고고씽~~~^^
@ez.
@ez. Жыл бұрын
대학생 나부랭이라뇨~! 배울 부분이 있다면 누구에게라도 배워야죠~ 지금 이 순간 제게 선생님이셨습니다! 😊👍👍👍 참고로 백엔드 8년차 개발자입니다 ㅋㅎㅎ 그래서 지금까지 이걸 잘못 알고 있었다는 것에 스스로에게 더 아쉬웠죠 ㅠ 여하튼!! 그럼 오늘도 고고씽~~!!! :)
@ez.
@ez. Жыл бұрын
안녕하세요~! 어제 피드백 주신 것을 바탕으로 이래저래 공지할 내용을 정리 중이에요~! 다시 한번 어제 피드백 정말 감사드립니다 :) 👍👍 정리하던 와중에 어제 말씀드린 부분 중에 바뀐 부분이 있어서 싱크 차원에서 댓글을 남깁니다용 * 원래는 백발백중 시리즈에서 이 영상을 제외를 시키려고 했는데요, 업로드된 영상도 일부를 짤라낼 수는 있는 기능이 유튭에 있기 때문에, 영상 마지막에 요약하면서 설명하는 부분을 짤라내고, 영상 자체는 백발백중 시리즈에 그대로 두기로 했습니다. 하지만 운영체제 목록에서는 어제 말씀드린대로 제외할 예정이에요 그리고 자료 조사를 하다가 알게 된 게 있는데요, C++의 경우에도 참조 변수(reference)는 결국 어셈블리 레벨에서 보면 포인터와 동일한 것 같더라고요~ 참조 변수도 내부적으로는 주소값을 가지는 형태로 동작하는 것 같고요, C++ 언어 레벨에서 이걸 포장을 하면서 주소값을 가지지 않는 것처럼 보이게 만드는 것 같아요 새로 발견한 정보가 혹시 도움이 될까 싶어서 공유하고픈 마음에서 이 부분도 댓글 남겨봅니다 :)
@quew9b
@quew9b 10 ай бұрын
포브스 선정 면접전 봐야하는 필수 영상 1위
@goofylee1758
@goofylee1758 2 жыл бұрын
정주행중입니다~ 혹시 GC와 관련한 강좌 요청드려도 될까요? jvm에서 gc에 대해서 공부중인데 정리 겸 한번 강좌 들어보고 싶습니다.. (old generation, young generation... 등)
@ez.
@ez. 2 жыл бұрын
오 네네~ 그러면 지금 진행중인 백발백중 시리즈 끝나는 대로 따로 영상 만들어 보겠습니당~ 아니면 시리즈 중에 후반부에 올릴수도 있을 것 같네요~
@jerryk0269
@jerryk0269 Жыл бұрын
오늘도 멋진 강의 정말 잘 들었습니다! runtime : 코드가 메모리에 올라와서 수행되고 있는 시간 stack 메모리에는 지역 변수와 매개 변수, 참조 변수(객체의 주소값)가 저장되고, 메서드가 호출될 때마다 stack frame이 저장된다. - this에는 heap에 저장된 메모리 주소값을 저장한다. heap 메모리에는 객체(인스턴스 변수)가 저장된다. (java) 참조 변수가 stack frame에서 해제되면 해당 객체에 대한 참조가 사라지므로 사용할 방법이 사라지기 때문에 gc가 해당 객체의 할당을 해제한다. stack 영역에 지역 변수나 매개 변수가 쌓인다고 설명해 주셨는데요 그렇담 기존에 있던 매개변수 값을 덮어씌울 때는 기존에 있던 매개변수 식별자를 찾기 위해 목표 식별자를 찾을 때까지 선형으로 pop해서 찾은 뒤에 값을 덮어씌우고 stash하는 걸까요? 기존에 제가 추론했을 때는 식별자들을 dictionary 형태로 넣어놓고 hash table로 저장하지 않을까? 싶었었는데 stack에 저장된다니 그럼 원하는 식별자를 어떻게 찾을까 하는 의문이 들더라고요 ㅎㅎ
@ez.
@ez. Жыл бұрын
크 오늘도 영상 시청 감사드립니다 :) 최고최고 👍 >> 그렇담 기존에 있던 매개변수 값을 덮어씌울 때는 기존에 있던 매개변수 식별자를 찾기 위해 목표 식별자를 찾을 때까지 선형으로 pop해서 찾은 뒤에 값을 덮어씌우고 stash하는 걸까요? C언어 기준으로 설명드리면 실제 컴파일이 되면 각 변수는 프레임 주소를 기준으로 상대적인 위치로 접근한다고 보시면 되겠습니다 도움이 될 링크 하나 남겨드릴게요~ 채택된 답변 보시면 대충 이해가 가실 거예요~ stackoverflow.com/questions/50524734/how-the-local-variable-stored-in-stack
@jerryk0269
@jerryk0269 Жыл бұрын
@@ez. 아~ 스택이라고 해서 peek만 보고 있는 것이 아니고 메모리가 쌓여가는 형태여서 스택 프레임인 것이군요 생각해보니 저것도 메모리 구조니까 일종의 배열이라 얼마든지 접근 가능해야 맞는 거네요 ㅋㅋㅋ 감사합니다!
@ez.
@ez. Жыл бұрын
@@jerryk0269 크~ 네 맞습니다~ 역시 최고십니다! 그리고 멤버십 가입까지..ㅠㅠㅠㅠ 정말 감사합니다! 최최고!! 👍👍👍 앞으로도 파이팅해서 좋은 영상 꾸준히 올리는 쉬운코드가 될게요~! :)
@프로그래밍-o9m
@프로그래밍-o9m Жыл бұрын
잘 이해했습닏.
@ryanjang1242
@ryanjang1242 2 жыл бұрын
주니어로 일하고 있는 저한테 꼭 필요한 강의입니다. 좋은 강의 올려주셔서 감사합니다ㅠㅠ
@ez.
@ez. 2 жыл бұрын
크~ 댓글 감사합니다~! 훌륭한 개발자로 성장하실 수 있도록 좋은 영상들로 응원할게요 :)
@qwe2775
@qwe2775 2 жыл бұрын
좋은 강의 감사합니다!
@ez.
@ez. 2 жыл бұрын
저도 관심과 댓글 감사해요 :) 👍
@jong243
@jong243 Жыл бұрын
질문이 하나 있습니다. 14:27 에서 this가 객체의 메모리 주소를 가리키고 있다고 하셨는데, stack 메모리에서 pop한 후에, 매개변수 c에 어떻게 객체의 메모리 주소값 전달되게 되나요? 좋은 강의 너무 감사합니다. 기초가 부족하여 늘 고민이 많았는데, 부족한 부분을 채워주는 강의이네요. 그동안 객체와 변수에 대해 제대로 알지 못했다는 걸 깨달았습니다.. 쭉 정주행하겠습니다!
@TV-tz2dg
@TV-tz2dg 2 жыл бұрын
스택, 힙 메모리 관련해서 그림이 안그려졌었는데 이렇게 구체적으로 설명해주셔서 감사합니다 잘 봤습니다!!
@ez.
@ez. 2 жыл бұрын
귀한 댓글 감사합니다~!!! 도움드릴 수 있어서 저도 감사하네요 :) 항상 화이팅이십니다!!
@xxxyyyzzz612
@xxxyyyzzz612 Жыл бұрын
와~~~ 엄청나게 쉽게 설명한다! 난 재미삼아 Python과 Armv7 Assemly를 아주 쪼~~~금 공부했었는데... (
@ez.
@ez. Жыл бұрын
와~~ 어셈블리 전문가시네요~👍 저는 이제 아주 가물가물해서 레퍼런스를 찾아보면서 어셈블리에 대한 기억을 끄집어 내야하는데 대단하십니다~! 좋게 봐주셔서 감사합니다 :) 자바도 기본적으로 stack 메모리는 같은 원리인 push and pop으로 동작을 하기 때문에 이렇게 설명드리게 됐어요 😊
@xxxyyyzzz612
@xxxyyyzzz612 Жыл бұрын
@@ez. 전문가아니고요! C 공부할려고 살짝 봤어요! 한데, 쉬운코드님의 다른 동영상들도 봤는데... 다른 동영상은 ㅋㅋㅋ 이해가 안 가네요! 아무래도, 초보여서 그런것 같기도 하고, 자바를 몰라서 그런것 같기도 하고... 암튼, 이 동영상은 제가 어셈블리에서 배웠던 것이랑 상당히 일맥상통해요! 그래서, 이해가 쉬운! 그래서, 좋아요!
@ez.
@ez. Жыл бұрын
@@xxxyyyzzz612 오우 그렇군요~! 좋게 봐주셔서 감사합니다!! :) 이해가 안되는 부분은 동영상에 질문 남겨주시면 저도 좀 더 자세히 설명드려볼게요~! 편히 질문주세용 👍
@조진우-q3f
@조진우-q3f Жыл бұрын
좋은 강의 잘듣고있습니다. 아쉬운 부분이 있다면 자막이 있으면 좋겠네요. 마지막에 음성으로만 집중해서 듣는데 이해가 안가서 듣고 또 들었습니다. 자막이 있다면 한결 더 쉽게 이해할 수 있을 거 같습니다.
@ez.
@ez. Жыл бұрын
안녕하세요 :) 우선 강의 애청해 주셔서 감사합니다 ~ 😊 제가 설명과 발음을 좀 더 잘했으면 쉽게 이해하셨을텐데 죄송한 마음입니다ㅠ 발음 관련해서는 최근 영상에서는 초반 영상들 보다 많이 개선이 됐어서 뒤로 갈수록 조금 더 쉽게 이해하실 수 있지 않을까 기대해 봅니다 자막과 관련해서는 양해를 구해야 할 것 같아요~ 자막 편집까지 하기에는 제가 너무 에너지가 많이 들어서 자막은 따로 하지 않는 것이 현재 정책이에요 음성 인식해서 자막 만들어주는 프로그램도 써봤지만 기술 용어들에 대한 인식율이 상대적으로 좋지 않아서 자막 작업이 몇 시간씩 걸리더라고요~ 꾸준히 영상을 찍기 위해서 제가 지치지 않는 것도 중요한데, 이미 콘텐츠 준비와 촬영과 편집에 많은 시간을 쓰고 있다보니 자막까지는 하지 않기로 했습니다 이 부분은 다시 한번 이해를 부탁드려요 ㅠㅠ
@임채민-n8m
@임채민-n8m Жыл бұрын
쉬운 코드님 안녕하세요! 간결하고 명확한 설명 덕분에 운영체제를 어느 정도 이해할 수 있게 된 거 같아요! 좋은 영상 정말 감사합니다! 실례가 안 된다면 영상을 요약해서 수시로 공부하고 싶은데 블로그에 요약 정리를 해도 괜찮을까요?! 출처는 명확하게 남길 예정입니다! 항상 영상 감사합니다!
@ez.
@ez. Жыл бұрын
안녕하세요~! 영상을 유익하게 봐주셔서 저도 정말 감사합니다 :) 네네 괜찮습니다~! 출처 남겨주시면서 정리해 주시면 저도 채널 홍보되고 좋아요 👍
@골아파덕-u9n
@골아파덕-u9n Жыл бұрын
그런데 호출된 함수나 메서드라고 말씀하셨는데, 함수랑 메서드는 같은 단어가 아닌가여? 저도 자바공부하면서 헷갈려서요.. 함수나 메서드라고 말씀하신 이유가 궁금합니당..
@2023-c9p
@2023-c9p Жыл бұрын
언어별로 부르는 명칭이 달라요
@youtubeyongjin1
@youtubeyongjin1 9 ай бұрын
this는 언제언제 생기는 건가요?? two에서는 안생기고 increment에서는 생기고 원래 this는 생성자가 다른생성자를 호출하거나 instance value를 local value랑 구분하기 위해서 사용한다고 알고 있었는데 처음듣는 this라서 혼란스럽네요 ㅠㅠ
@hml139
@hml139 2 жыл бұрын
좋아요
@ez.
@ez. 2 жыл бұрын
사랑합니다
@jayhojang
@jayhojang 2 жыл бұрын
사랑해요
@Benwlodccnxsmw
@Benwlodccnxsmw 5 ай бұрын
21:40 쓰레기 counter 객체 (힙의 위쪽) 과 참조된 counter 객체 (힙의 아래쪽) 이 각각 어떤 라인에서 생성된건가요? 그냥 2개가 있다. 라고만 언급되어서 헷갈리네요
@youtubeyongjin1
@youtubeyongjin1 9 ай бұрын
여기서 this는 언제 언제 생기는건가요??? 저는 생성자 tihs()랑 instance value를 local value와 구분짓는 this만 알고있었는데 이거는 처음듣는 this여서 잘 모르겠어요 ㅠㅠ
@jgim127
@jgim127 2 жыл бұрын
정주행 ing
@ez.
@ez. 2 жыл бұрын
와우와우
@정동준-b7i
@정동준-b7i Жыл бұрын
저기에 설명하신 스택 힙은 일반적으로 알려진 프로세스 (코드 , 데이터, 힙 스택) 의 힙, 스텍 과 같은 부분 인가요?
@ez.
@ez. Жыл бұрын
넵~! 자바 기준으로 설명드린거라 자바는 JVM이라는 자바 가상 머신이 있고 그 위에서 자바 프로그램이 동작을 하는데요, JVM 위에서 자바 프로세스의 메모리 구조가 말씀하신 일반적인 프로세스의 메모리 구조 형태와 거의 같다고 보시면 됩니다 참고로 자바는 언어 설계상 객체가 힙에만 생성되지만 다른 언어는 아닐 수도 있습니다 (가령 C++은 스택 메모리에도 객체 생성 가능해요)
@정동준-b7i
@정동준-b7i Жыл бұрын
​@@ez. 기초적인 걸 계속 질문해서 죄송합니다 ㅠ 제가 js 로 개발을 입문해서 매우 기초적인 것을 계속 햇갈리네요 ㅠㅠ 그렇다면 어떠한 언어를 사용 (c++, java, js) 해서 프로그램을 개발후 이를 실행하면 프로세스가 생성되고 ( 이 프로세스는 우리가 아는 일반적인 프로세스 , code, data, head, stack 형태의) 그 안에 힙과 스택영역에 값을 할당한다 ( 힙과 스택에 적재하는 방법은 언어마다 차이가 있다. ) 브라우저의 js 엔진 과 nodejs 의 엔진의 실행순서 에따른 힙, 스택 사용도 결국 우리가 아는 프로세스 내부에 있는 것 적재 방법이 다른것은 언어와 엔진의 차이인 것이지 따로 다른 프로세스가 있는게 아니다 이렇게 이해하면 될까요? 제가 자꾸 우리가 아는 프로세스 이런 말을 하는것은 일반적인 구글에 서칭해서 나오는 프로세스 모습과 js 엔진에서 나오는 스택 힙과 혼동돼서 계속 말씀드렷습니다 ㅠ [프로세스이미지] www.google.com/search?q=%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4&rlz=1C5CHFA_enKR952KR980&sxsrf=ALiCzsYm3Wl9BuQpf0GJQRyd1uqL9qR28w:1672904122765&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjq5-u_9a_8AhWLNt4KHZWBDNMQ_AUoAXoECAEQAw&biw=1920&bih=944&dpr=1#imgrc=6CZHs1Xkj5507M [js 엔진 스택 힙] www.google.com/search?q=%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8+%EC%97%94%EC%A7%84+%EC%8B%A4%ED%96%89%EC%88%9C%EC%84%9C&tbm=isch&ved=2ahUKEwjb0rPA9a_8AhWeTPUHHfw4A3sQ2-cCegQIABAA&oq=%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8+%EC%97%94%EC%A7%84+%EC%8B%A4%ED%96%89%EC%88%9C%EC%84%9C&gs_lcp=CgNpbWcQAzoECCMQJzoFCAAQgAQ6BwgjEOoCECc6CwgAEIAEELEDEIMBOggIABCABBCxAzoICAAQsQMQgwE6BwgAEIAEEBg6CQgAEIAEEAoQGDoECAAQHlCYBliZH2CUIWgHcAB4BYABlQGIAf8dkgEEMy4zMJgBAKABAaoBC2d3cy13aXotaW1nsAEKwAEB&sclient=img&ei=u322Y5uJOZ6Z1e8P_PGM2Ac&bih=944&biw=1920&rlz=1C5CHFA_enKR952KR980#imgrc=yyuyKOPYf7_kZM 계속 답변해주셔서 정말정말 감사합니다
@ez.
@ez. Жыл бұрын
헉.. 제가 답변이 늦었네요 ㅠㅠ 음.. 제가 말씀주신 js엔진 쪽은 잘 몰라서 정확한 답변이 어려워요ㅠㅠ (어떤 면이 혼동이 되시는지를 알려주시면 조금이라도 답변 드릴 수 있을 것 같습니다ㅠㅠ) >> 이를 실행하면 프로세스가 생성되고 ( 이 프로세스는 우리가 아는 일반적인 프로세스 , code, data, head, stack 형태의) 그 안에 힙과 스택영역에 값을 할당한다 ( 힙과 스택에 적재하는 방법은 언어마다 차이가 있다. ) 위와 같이 말씀주신 부분에 관해서는 대체로 맞고요, 힙과 스택의 차이는 stack 메모리는 같은 프로세스에 속하는 스레드들이라도 각 스레드마다 별도로 스택 메모리를 가지지만, 힙 메모리는 같은 프로세스에 속하는 스레드들은 동일한 힙 메모리를 공유합니다 그래서 스택 메모리와 힙 메모리의 차이는 이게 가장 큰 차이라고 생각을 합니다 (이 부분은 추가로 조금 더 구글링 해보시면 무슨 얘긴지 이해되실 것 같아요~) 그리고 data 영역도 할 말이 있지만, 일단은 지금처럼 이해를 해주셔도 무리는 없을 것 같아요~ (차후에 조금 더 자세히 딥하게 공부해 주시면 더 좋을 것 같아요 👍)
@홍대오-q9o
@홍대오-q9o 2 жыл бұрын
스택프레임은 변수의 선언에 따라 크기가 가변적인가요?
@ez.
@ez. 2 жыл бұрын
이건 진리의 케바케에요~ 구현에 따라 다른 것 같더라구요~
@홍대오-q9o
@홍대오-q9o 2 жыл бұрын
@@ez. 오 그렇군요! 답변감사합니다!
@TV-nz4fy
@TV-nz4fy 2 жыл бұрын
정주행 중 궁금점 남깁니다. 저는 주로 C++, Python을 다루고 있어서, 이에 대한 차이에 대해 묻고 싶습니다. 1. Python에서는 this대신 self를 사용하는데, 이와 같은 경우도 동작은 마찬가지인가요? 실제 스택 프레임에 생성자가 호출될 때, this라는 숨은 변수가 생성되는 것처럼, Python에서는 숨은 변수의 이름이 단순히 self인 것인가요? 2. 참조변수에 대한 질문인데, Java나 Python같은 경우는 포인터라는 개념이 존재하지 않기 때문에, this 또는 self가 참조 변수로서 동작하는 것으로 이해하고 있는데 (그렇기에 클래스 내부에서 접근 시, this., self.을 사용하는 것 같습니다. 그런데 실제 포인터가 존재하는 C++에서는 그렇다면, this가 참조 변수가 아니라, 포인터로서 동작을 한다고 이해해야할까요? 반대로 그렇다면 Stack 프레임에서 Car라는 클래스로 생성한 객체를 담는 변수 c와 이 객체를 가리키는 포인터 c_ptr의 경우는 담고있는 내용이 어떻게 다르다고 이해를 해야할까요? 질문이 길었습니다ㅠㅠ 답변해주시면 감사하겠습니다. 저도 찾아보겠습니다 :) 늘 좋은 영상 감사합니다!
@TV-nz4fy
@TV-nz4fy 2 жыл бұрын
hkim-data.tistory.com/183 위 내용을 참고하니, 1번의 경우는 self라는 부분이 Python 객체의 참조 변수라고 알 수 있었습니다.
@ez.
@ez. 2 жыл бұрын
크으~! 오늘도 정주행하시는군요 멋지십니다!! 열심히 공부하시는 모습이 많이 귀감이 되고 저에게도 좋은 자극이 되네요 :) 1. 네 맞습니다. Python에서도 self의 역할이 this와 거의 같습니다. 둘 다 객체화된 instance를 가리키는 참조 변수입니다. 차이점이 있다면 python의 self는 개발자가 메서드의 첫번째 파라미터로 명시적으로 써줘야한다는 점과, 이름이 꼭 self일 필요가 없고 this, that, me 등등 바꿔서 사용할 수 있다는 점입니다. 2. 참조(reference) 변수는 포인터와 유사하지만 포인터는 아닙니다. 포인터는 메모리의 주소를 가지지만, 참조 변수는 (참조 변수 구현 내부를 뜯어보면 메모리 주소를 가질지언정) 그 자체가 주소를 의미하진 않기 때문입니다. 그러므로 참조 변수의 참조를 단어 그대로 '참조'라고 이해하는 것이 제일 적절합니다. 간단하게 설명하자면 참조 변수는 객체를 담고 있는 것이 아니라 객체의 레퍼런스(참조)를 담고 있는 것이고, 이 레퍼런스를 통해서 객체에 도달해서 사용할 수 있는 것이죠. c_ptr의 경우에는 메모리 주소를 가지고 있는 것이구요. ... (22년 9월 26일 추가 댓글) 윗 단락을 작성할 당시에 제가 자바 위주로 설명을 한 것 같고요, 그래서 오히려 혼란을 드린 안좋은 케이스의 답변이 된 것 같습니다.. 죄송합니다 ㅠㅠ 2번 답변을 정정하자면, C++에서는 this를 포인터 변수로 보시는게 좋을 것 같고요, 참조변수는 변수에 붙여진 별칭으로 이해하는게 좋을 것 같아요. 참조 변수와 포인터 변수는 모두 참조하는 변수의 주소 값을 저장한다고 보시면 되겠습니다. 제가 C++ 전문이 아니다 보니 답변에 부족함이 있었습니다 ㅠ 자바와 C++은 '참조 변수'라는 같은 용어를 쓰지만 의미는 조금 다른 것 같습니다 ... 설명이 잘 됐는지 모르겠습니다. 케이구 TV님 항상 응원합니다 :)
@TV-nz4fy
@TV-nz4fy 2 жыл бұрын
@@ez. 답변 감사합니다. 조금 더 질문 드리겠습니다ㅠㅠ 죄송합니다. 1. 에서 self 대신 this, that, me를 쓸수 있다는 말씀이, 파이썬에서 그렇다는 말씀이신가요? 아니면 언어에 따라, self, this, that, me 등을 사용한다는 말씀이신가요?? 2. 제가 의문이 들었던 것이 예를 들어 Car라는 클래스로 생성한 객체를 사용할 때, 세 가지로 표현이 가능할 것 같습니다. 첫번째는 그냥 Car type의 변수를 만들어서 Car myCar = new Car() 와 같은 형태로 만들 수 있고, 이와 같은 경우에는 myCar.name 등으로 멤버 변수에 접근할 수 있죠 두번째로 Car type의 참조 변수를 만들어서 Car& anotherCar = myCar와 같은 형태로 만들어서, 사용할 수 있다고 생각이 듭니다. 이 경우에도 anotherCar.name 등으로 멤버 변수에 접근할 수 있습니다. 마지막으로 Car type의 포인터를 만들어서 Car* carPtr = &myCar와 같은 형태로 만들어서 사용할 수 있습니다. 이 경우에는 carPtr->name으로 멤버 변수에 접근할 수 있습니다. 위 영상에서 말씀해주신 바를 가지고 이해한다면, 결국 myCar, anotherCar, carPtr은 모두 하나의 객체를 표현하고 있는 상태라고 해석이 됩니다. 그 중 일반 변수 및 참조 변수인 myCar와 anotherCar의 경우는 말씀하신대로 구현 부를 뜯어보면 메모리 주소를 가질수도 있지만, 실제 겉으로 보이는 모습은 포인터가 아니라 일반 변수의 형태라는 말씀이시고, carPtr의 경우는 실제 겉으로도 속으로도 메모리 주소를 가지는 포인터라는 말씀이 맞을까요? 혹시 궁금한 것이, 혹시 이와 같은 구조를 제가 직접 코드를 작성해서 메모리에 어떤식으로 데이터가 쌓이는지 알고 싶은데, 이는 어셈블리를 공부해서 실제 메모리에 할당 및 접근하는 방식을 확인해야만 하는 것일까요? 아니면 다른 메모리를 확인하는 툴과 같은게 있을까요? 늘 이상한 질문만 드려서 죄송합니다. 그리고 늘 답변해주셔서 감사합니다!
@TV-nz4fy
@TV-nz4fy 2 жыл бұрын
아 제가 착각했습니다 C++에서는 힙에 올릴 때 무조건 포인터로서만 생성이 가능합니다ㅠㅠ... 따라서, 1번과 같은 형태는 불가능하네요, Car *myCar = new Car()와 같은 형태로만 생성이 가능하므로, 당연히 myCar->name으로 접근을 해야되는 것이 맞겠네요. 그리고 이와 같은 경우에는 말씀해주신 것 처럼, Heap 영역에 올라가고, 이를 Stack 내부에 있는 Car 포인터인 myCar가 해당 주소를 가리키게 됩니다. 그렇다면 2번과 같은 참조형 변수는 단순하게 Car otherCar()과 같은 형태로 정적 생성이 된 객체에 대해서만 Car& refCar = otherCar와 같은 형태로만 사용이 가능하고, 이미 1번에서 동적할당 시에는 포인터로 생성이 되어있으므로, 참조 포인터와 같은 이상한 형태를 쓸 이유가 전혀 없을 것 같습니다. 마지막의 Car* carPtr도 동적할당 시에는 의미가 없고, 정적 할당 되어있는 Car otherCar(), Car* carPtr = &otherCar와 같은 형태로만 사용이 가능하며, 이와 같은 형태를 지양하고 참조형 변수를 사용하는 것이 좋겠네요. 역시... 러버덕 디버깅이 최고라고, 제가 질문을 드리면서 많은 답변을 스스로 얻어갑니다ㅠㅠ. 마지막에 말씀드린 메모리를 확인할 수 있는 툴과 같은 내용에 대해서 답변주시면 감사하겠습니다.
@ez.
@ez. 2 жыл бұрын
@@TV-nz4fy ​ 크~ 멋지십니다! 저도 질문하다보면 스스로 답을 찾게되는 경우가 많더라구요~ 답변 드리면 1번은 파이썬에서 그렇다는 얘기였구요 2번은 대부분을 스스로 깨우치신 것 같아요 (멋지십니다!) 그리고 메모리 확인할 수 있는 툴 같은 경우에는 저도 따로 써본적은 없고 IDE에서 제공하는 기능 수준(가령 스택트레이스)으로만 써봤었어요~ 제 개인적인 생각은 어셈블리어까지 직접 확인하않아도 개념적으로 정확히 이해할 수 있다면 일반 개발자 수준에서는 충분하지 않을까 싶네요 도움이 됐길 바라며 항상 응원합니다 :)
@Geouttttt
@Geouttttt 2 жыл бұрын
파이썬 배웠어도 클래스 이해못했으면 완전 신세계였을 자바..
@ez.
@ez. 2 жыл бұрын
그쵸~ 자바가 객체지향언어다 보니 클래스 모르면 자바 못하죠
@ill-young
@ill-young 2 жыл бұрын
도움이 되었습니다 감사합니다! 파이썬도 예제를 들어주셔서 감사드립니다. 참고로 자바스크립트도 모든게 객체이죠?
@ez.
@ez. 2 жыл бұрын
도움이 됐다니 기쁘네요 :) 자주 놀러오세용~!ㅎㅎ 자바스크립트는 자세히 확인 안해봤어요~ 원시(primitive) 타입은 객체가 아닌걸로 알고 있긴 합니다
@hahahahahaha3450
@hahahahahaha3450 Жыл бұрын
'자바는 기본적으로 call by value를 지원하는데 객체를 넘겨줄 경우에만 call by reference이다 보니 사용에 주의해야겠네' 라고 이해했는데 맞을까요?
@Thj123
@Thj123 11 ай бұрын
안녕하세요 질문이 하나 있는데요 마지막 heap 메모리 설명하실때 two메서드를 아래 코드처럼 바꾸고 사용해도될까요? public class StackZone { public static void main(String[] args) { Counter1 c = new Counter1(); StackZone stackZone = new StackZone(); stackZone.two(c); c.get(); System.out.println(c.get()); } public void two(Counter1 c){ c.increment(); c.increment(); } } two메서드에서 static을 안쓰고 자신의 객체를 만들어서 two를 호출해도 될까요? 이렇게해도 c.get의 값은 2가 나오더군요
@sungyongyou4323
@sungyongyou4323 2 жыл бұрын
너무 도움 많이됩니다 감사합니다
@ez.
@ez. 2 жыл бұрын
댓글이 정말 많은 힘이 됩니다 ㅠㅠ 감사합니다 :)
Это было очень близко...
00:10
Аришнев
Рет қаралды 6 МЛН
黑的奸计得逞 #古风
00:24
Black and white double fury
Рет қаралды 28 МЛН
가비지 컬렉터의 원리? 과연 그것만 물은 걸까요?
18:18
널널한 개발자 TV
Рет қаралды 19 М.
WHY IS THE STACK SO FAST?
13:46
Core Dumped
Рет қаралды 164 М.
[10분 테코톡] 🎅무민의 JVM Stack & Heap
16:14
우아한테크
Рет қаралды 27 М.