{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/19-11-27-call-by-value-refrence-deep-shallow-copy/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"57b4cfc9-487d-5580-ab98-b90a4f72ae6d","excerpt":"개발 용어 사전이 필요해 처음 개발 공부를 하던 당시 만들고 싶었던 것이 있었으니 개발 용어를 설명해주는 위키였다. 지금이야 의존성 주입이니 제어의 역전이니 하는 말을 들어도 대충 어떤 개념인지 감을 잡고 다시 찾아보는 정도인데, 입문 시절 때는 용어 하나 하나를 이해하는 것이 정말 큰 스트레스였다. 또 비슷해 보이는데 다르게 부르는 것들도 제법 된다. 함수와 메소드라든가, 클래스와 구조체라든가. 스프링이랑 JSP로 대충 쇼핑몰 만들던 당시에는 REST API…","html":"<h1 id=\"개발-용어-사전이-필요해\" style=\"position:relative;\"><a href=\"#%EA%B0%9C%EB%B0%9C-%EC%9A%A9%EC%96%B4-%EC%82%AC%EC%A0%84%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%B4\" aria-label=\"개발 용어 사전이 필요해 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>개발 용어 사전이 필요해</h1>\n<p>처음 개발 공부를 하던 당시 만들고 싶었던 것이 있었으니 개발 용어를 설명해주는 위키였다.</p>\n<p>지금이야 의존성 주입이니 제어의 역전이니 하는 말을 들어도 대충 어떤 개념인지 감을 잡고 다시 찾아보는 정도인데,</p>\n<p>입문 시절 때는 용어 하나 하나를 이해하는 것이 정말 큰 스트레스였다.</p>\n<p>또 비슷해 보이는데 다르게 부르는 것들도 제법 된다. 함수와 메소드라든가, 클래스와 구조체라든가.</p>\n<p>스프링이랑 JSP로 대충 쇼핑몰 만들던 당시에는 REST API 가 대체 뭔지 그게 가능하기나 한 기술인지 신기하기도 했었고 말이지.</p>\n<p>어쨌든 이런 이유로 처음 개발 공부를 할 때는 어려운 거 다 때려치우고 뭔가 재미난 것부터 만드는 게 낫다는 생각도 들지만,</p>\n<p>끊임없이 새로운 게 튀어나오는 이 바닥에서 그것들을 이해하려면 여러 개념들을 충분히 숙지하고 있어야 하기 때문에</p>\n<p>나처럼 냅다 삽질을 했다면 나중에 어느 정도 덕을 보는 경우도 있긴 하다.</p>\n<h1 id=\"잠시-함수형-프로그래밍의-이야기를-해보자\" style=\"position:relative;\"><a href=\"#%EC%9E%A0%EC%8B%9C-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%9D%B4%EC%95%BC%EA%B8%B0%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90\" aria-label=\"잠시 함수형 프로그래밍의 이야기를 해보자 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>잠시 함수형 프로그래밍의 이야기를 해보자</h1>\n<p>내가 <code class=\"language-text\">immutable</code> 이란 개념을 처음 접한 건 함수형 프로그래밍을 공부할 때였다.</p>\n<p>처음 공부하면서 가장 당황스러웠던 이야기가 뭐였냐면</p>\n<blockquote>\n<p>함수형 프로그래밍에서는 변수를 사용하지 않는다. 정확히 말하자면 변수를 사용하긴 하지만\n그 변수에 값을 대입한 이후로 그 변수는 그 값으로 ‘고정’되기 때문에 상수나 마찬가지이다.</p>\n</blockquote>\n<p>엄청 황당한 말이다. 변수의 상태값이 변하지 않는데 도대체 어떻게 개발을 하고 앱을 만든다는 거지?</p>\n<p>게임을 만든다고 했을 때, 경험치를 모아서 레벨업을 달성하는 조건문에 다다르더라도 주인공의 레벨값은 언제나 정수인 1로 고정되는 거나 다름 없는 거 아닌가?</p>\n<p>(실제로는 모든 값이 상수면 경험치를 모으는 것도 불가능하고 애초에 게임을 진행할 수가 없다. 주인공의 위치부터 항상 고정 되어있을테니)</p>\n<p>근데 사실 저 복잡한 함수형 프로그래밍까지 공부하지 않더라도, 변수의 상태를 바꿀 수 없는 것이 있으니</p>\n<p>그게 바로 <code class=\"language-text\">immutable</code> 되시겠다.</p>\n<h1 id=\"너-변했어\" style=\"position:relative;\"><a href=\"#%EB%84%88-%EB%B3%80%ED%96%88%EC%96%B4\" aria-label=\"너 변했어 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>너 변했어</h1>\n<p>우리가 상대방더러 변했다고 이야기 할 때 상황을 보자.</p>\n<p>상대방의 무엇이 변했나? 대다수는 성격이나 태도 등을 이야기할 때겠지만 여기서 설명하기엔 모호하니 좀 더 직관적인 예를 들어보자.</p>\n<p>빨간머리였던 친구가 어느 날 검은머리를 하고 왔다고 해서 대뜸 친구가 맞는지 확인할테니 <em>신분증</em>을 보여달라고 하는 사람은 없을 거다.</p>\n<p>왜냐면 대다수의 사람은 <code class=\"language-text\">mutable</code> 하기 때문에 그렇다. 즉 그 사람이 무슨 변화를 겪더라도 그 사람은 그 사람이다.</p>\n<p>반면 성적은 <code class=\"language-text\">immutable</code> 하다. 분명 어제 성적표에는 C 라고 되어 있었는데 성적이 B 로 바뀌었다면 <em>성적표</em>가 다를 것이다.</p>\n<p>이런! 어제 검은머리 친구랑 베그하고 헤어질 때 친구 성적표를 가져오고야 말았네!</p>\n<p>좋다 말았다. 결국 재수강을 해서 성적을 올릴 수 있었고 C+ 이라는 점수를 받았다. 그럼 그 성적은 C 에서 C+ 로 변한 것인가?</p>\n<p>엄밀히 따져서 그 과목의 점수는 여전히 C 이지만 재수강을 통해 C+ 로 대체한 것 뿐이다.</p>\n<p>그래서 <em>기존 성적표를 가져가서 정정 받는 게 아니라 새로운 성적표를 받는다</em></p>\n<p>성적은 변하는 게 아니고 대체만 가능하다는 점에서 <code class=\"language-text\">immutable</code> 하다고 볼 수 있다.</p>\n<h1 id=\"파이썬-코드로-다시-보기\" style=\"position:relative;\"><a href=\"#%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%8B%A4%EC%8B%9C-%EB%B3%B4%EA%B8%B0\" aria-label=\"파이썬 코드로 다시 보기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>파이썬 코드로 다시 보기</h1>\n<p>파이썬 함수 중에 <code class=\"language-text\">id()</code> 라는 함수가 있다. 공식 문서에는 다음과 같이 말한다.</p>\n<blockquote>\n<p>객체의 “아이덴티티”를 돌려준다. 이것은 객체의 수명 동안 유일하고 바뀌지 않음이 보장되는 정수입니다</p>\n</blockquote>\n<p>여기서 말하는 <code class=\"language-text\">객체</code> 란 인자로 전달하는 값들을 말한다.</p>\n<p>예시를 보자</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">identification <span class=\"token operator\">=</span> <span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>루이<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>identification<span class=\"token punctuation\">)</span></code></pre></div>\n<p>라 하면 다음과 같이 주민번호가 나오는 거라고 생각하면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">980811</span>-1xxxxxx</code></pre></div>\n<p>그럼 이걸 이용하여 파이썬에서 <code class=\"language-text\">immutable</code> 한 성격을 가지고 있는 타입인 정수를 넣어보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">num <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\nnum_id <span class=\"token operator\">=</span> <span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>num_id<span class=\"token punctuation\">)</span></code></pre></div>\n<p>그럼 다음과 같이 나온다. 참고로 결과값은 컴퓨터마다 다르게 나온다. 사실 여기서 아이덴티티라고 말하는 것은 컴퓨터 메모리상의 주소를 이야기 하기 때문.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">4453076752</span></code></pre></div>\n<p>그런데 정수는 <code class=\"language-text\">immutable</code> 하다고 했는데 그게 코드상으로는 어떤 의미인지 다음 코드를 보자</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">num <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\nnum_id <span class=\"token operator\">=</span> <span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>num_id<span class=\"token punctuation\">)</span>\n\nnum <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>num_id<span class=\"token punctuation\">)</span></code></pre></div>\n<p>이러면 다음처럼 상이한 두 개의 id 정보가 나온다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">4453076752</span>\n<span class=\"token number\">4453076784</span></code></pre></div>\n<p>같은 변수의 id 를 찍었는데 이 넘이람 그 넘은 서로 다른 넘이었다고 말해주는 결과이다.</p>\n<p>반면 <code class=\"language-text\">mutable</code> 한 성격을 가진 <code class=\"language-text\">list</code>를 보자</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Louie'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ashley'</span><span class=\"token punctuation\">]</span>\n<span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span></code></pre></div>\n<p>결과는 다음과 같다</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">4456707648</span></code></pre></div>\n<p>생각해보니 이왕 예제로 작성하는 거 친구 목록의 ‘Tylo’ 를 내가 좋아하는 배우인 맷 데이먼이라고 바꿔보자. 사실 디카프리오를 더 좋아하지만 이름이 너무 길다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Louie'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ashley'</span><span class=\"token punctuation\">]</span>\n<span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span>\n\nfriend_list<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'Matt'</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span>\n\n<span class=\"token builtin\">id</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span></code></pre></div>\n<p>그럼 이런 결과가 나온다. 맷 데이먼이랑 친구라니! 게다가 friend_list 의 아이디가 동일한 것을 확인할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">4456707648</span>\n<span class=\"token punctuation\">[</span><span class=\"token string\">'Matt'</span>, <span class=\"token string\">'Louie'</span>, <span class=\"token string\">'Ashley'</span><span class=\"token punctuation\">]</span>\n<span class=\"token number\">4456707648</span></code></pre></div>\n<p>이처럼 <code class=\"language-text\">friend_list</code> 에 목록을 수정했는데도 아까 그 친구목록과 동일한 친구목록이라고 이야기 한다. 친구목록은 <code class=\"language-text\">mutable</code> 하기 때문에 그렇다.</p>\n<p>그러니 친구에게 다들 잘하자.</p>\n<h1 id=\"마무리하며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EB%AC%B4%EB%A6%AC%ED%95%98%EB%A9%B0\" aria-label=\"마무리하며 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마무리하며</h1>\n<p><code class=\"language-text\">immutable</code> 과 <code class=\"language-text\">mutable</code> 을 알았다면 이제 깊은 복사와 얕은 복사를 이야기하고, 사이드 이펙트의 무서움에 대해서 이야기 해볼 수 있다.</p>","frontmatter":{"title":"immutable 과 mutable","date":"November 28, 2019"}}},"pageContext":{"slug":"/19-11-27-call-by-value-refrence-deep-shallow-copy/","previous":{"fields":{"slug":"/19-04-25-rxjs-trigger/"},"frontmatter":{"title":"RxJs를 이용하여 비동기 이벤트가 발생하면 버튼으로 제어하기","category":"RxJs","draft":false}},"next":{"fields":{"slug":"/19-11-29-iimmutable-and-mutable2/"},"frontmatter":{"title":"의자 바꾸기로 생각하는 인자 전달","category":"Python","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}