<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>수피치의 발자취</title>
    <link>https://soopeach.tistory.com/</link>
    <description>내 머릿속에 한 페이지씩..</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 14:32:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>soopeach</managingEditor>
    <image>
      <title>수피치의 발자취</title>
      <url>https://tistory1.daumcdn.net/tistory/5148929/attach/7ab6bb8a8e034d69b9684157db1f5479</url>
      <link>https://soopeach.tistory.com</link>
    </image>
    <item>
      <title>내한 공연 티켓팅을 누구보다 빨리 하고 싶다면? - 쇼팟</title>
      <link>https://soopeach.tistory.com/277</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot; data-pm-slice=&quot;0 0 []&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;322&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-04 오전 9.38.52.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biNwQF/btsMBjdJQ1X/lZmrFSQSgtx3z80vLoxzJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biNwQF/btsMBjdJQ1X/lZmrFSQSgtx3z80vLoxzJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biNwQF/btsMBjdJQ1X/lZmrFSQSgtx3z80vLoxzJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiNwQF%2FbtsMBjdJQ1X%2FlZmrFSQSgtx3z80vLoxzJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;382&quot; data-filename=&quot;스크린샷 2025-03-04 오전 9.38.52.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;span data-emoji-short-name=&quot;:paintbrush:&quot; data-emoji-id=&quot;1f58c&quot; data-emoji-text=&quot; ️&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; ️&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서론&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;안녕하세요, Showpot입니다!  &lt;br /&gt;내한 공연을 좋아하시는 분들이 많을 텐데요. 저희는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;내한 공연 정보를 받아보고, 티켓팅 알림까지 설정할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;데 도움이 되는 서비스를 소개해 드리려고 합니다. Showpot이 어떻게 탄생했는지, 어떤 이슈를 겪었고 어떻게 해결해 나가고 있는지 담아봤으니 재미있게 읽어주세요!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-emoji-short-name=&quot;:grinning:&quot; data-emoji-id=&quot;1f600&quot; data-emoji-text=&quot; &quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;span data-emoji-short-name=&quot;:mag_right:&quot; data-emoji-id=&quot;1f50e&quot; data-emoji-text=&quot; &quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Showpot 제작 배경&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;Showpot은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;YAPP IT 동아리&lt;/b&gt;에서 시작되었습니다.&lt;br /&gt;팀원 중 한 분이 내한 공연을 즐겨 보며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;내한 공연 정보를 편리하게 받아볼 수 있는 앱이 있으면 좋겠다&lt;/b&gt;는 아이디어를 제안했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;기존에는 인스타그램, 내한 공연 오픈 채팅방, 내한 공연 정보 웹 사이트(페스티벌 라이프, 인터파크 티켓, 예스 24 티켓) 등을 통해 정보를 얻어야 했습니다.&lt;br /&gt;하지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;인스타그램과 오픈 채팅방은 정보가 휘발될 가능성이 크고&lt;/b&gt;, 웹사이트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사용자가 직접 방문해야 하는 번거로움&lt;/b&gt;이 있었습니다. 이로 인해,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;좋아하는 아티스트가 내한해도 티켓팅 기회를 놓치는 경우&lt;/b&gt;가 많았고, 심지어 내한 공연 정보를 알고 있더라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;티켓팅 날짜를 깜빡해 예매를 못 하는 문제&lt;/b&gt;도 있었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;br /&gt;따라서, Showpot은 내한 공연에 관심이 있거나 좋아하는 사람들의 이러한 불편함을 해결하기 위해 제작하게 되었습니다!&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;span data-emoji-short-name=&quot;:tickets:&quot; data-emoji-id=&quot;1f39f&quot; data-emoji-text=&quot; ️&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; ️&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Showpot 주요 기능&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;b&gt;아티스트, 장르 구독 기능&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-mode=&quot;wide&quot; data-width=&quot;760&quot; data-prosemirror-content-type=&quot;mark&quot; data-prosemirror-mark-name=&quot;breakout&quot;&gt;
&lt;div data-layout-section=&quot;true&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutSection&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-column=&quot;true&quot; data-column-width=&quot;50&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutColumn&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-content=&quot;true&quot;&gt;
&lt;div data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;253&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4bY13/btsMzdMNeh5/kKN8zYMvAgwlWZTDjrtUkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4bY13/btsMzdMNeh5/kKN8zYMvAgwlWZTDjrtUkK/img.jpg&quot; width=&quot;300&quot; data-phocus-index=&quot;1&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;1303&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.9206%; margin-right: 10px;&quot; data-widthpercent=&quot;49.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4bY13/btsMzdMNeh5/kKN8zYMvAgwlWZTDjrtUkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4bY13%2FbtsMzdMNeh5%2FkKN8zYMvAgwlWZTDjrtUkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;1303&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLYvn/btsMAW4a4ol/XOoYNcXtNKZGKpKCDmVHY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLYvn/btsMAW4a4ol/XOoYNcXtNKZGKpKCDmVHY0/img.jpg&quot; width=&quot;300&quot; data-phocus-index=&quot;2&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;1277&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9166%;&quot; data-widthpercent=&quot;50.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLYvn/btsMAW4a4ol/XOoYNcXtNKZGKpKCDmVHY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLYvn%2FbtsMAW4a4ol%2FXOoYNcXtNKZGKpKCDmVHY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;1277&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-layout-column=&quot;true&quot; data-column-width=&quot;50&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutColumn&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-content=&quot;true&quot;&gt;
&lt;div data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;253&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;내한 공연에 관심 있는 분들은 자신이 좋아하는 아티스트나 장르의 내한 공연 정보를 전달 받고 싶어합니다.&lt;br /&gt;원하는 아티스트나 장르를 구독하면, 해당 아티스트 또는 관련 공연 소식이 있을 때 알림을 받을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;b&gt;공연 티켓팅 알림 설정 기능&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;206&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwbhXq/btsMAKbKoDD/j7fpjcvanvKwF6yHKeJBp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwbhXq/btsMAKbKoDD/j7fpjcvanvKwF6yHKeJBp1/img.jpg&quot; width=&quot;300&quot; data-phocus-index=&quot;3&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;1369&quot; data-is-animation=&quot;false&quot; style=&quot;width: 25.8358%; margin-right: 10px;&quot; data-widthpercent=&quot;26.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwbhXq/btsMAKbKoDD/j7fpjcvanvKwF6yHKeJBp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwbhXq%2FbtsMAKbKoDD%2Fj7fpjcvanvKwF6yHKeJBp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;1369&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9mRSX/btsMBE20hzK/NT9ZdJW5fWQi6PyPycZDRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9mRSX/btsMBE20hzK/NT9ZdJW5fWQi6PyPycZDRK/img.png&quot; width=&quot;300&quot; data-phocus-index=&quot;4&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;285&quot; data-is-animation=&quot;false&quot; style=&quot;width: 73.0014%;&quot; data-widthpercent=&quot;73.86&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9mRSX/btsMBE20hzK/NT9ZdJW5fWQi6PyPycZDRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9mRSX%2FbtsMBE20hzK%2FNT9ZdJW5fWQi6PyPycZDRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;내한 공연 정보를 확인하고 티켓팅 알림을 설정할 수 있어요. 현재 티켓팅 알림은 5분, 10분, 30분, 1시간 전에 받을 수 있으며, 티켓팅 날짜를 잊어버려도 알림을 통해 놓치지 않고 예매할 수 있어요!&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;span data-emoji-short-name=&quot;:hear_no_evil:&quot; data-emoji-id=&quot;1f649&quot; data-emoji-text=&quot; &quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;내한 공연이 없는 기간 문제&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-emoji-short-name=&quot;:hear_no_evil:&quot; data-emoji-id=&quot;1f649&quot; data-emoji-text=&quot; &quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-layout-section=&quot;true&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutSection&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-column=&quot;true&quot; data-column-width=&quot;50&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutColumn&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-content=&quot;true&quot;&gt;
&lt;div data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;275&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uz3Ng/btsMAimkvIV/419DVvFdRzwr4Ao9LtBoz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uz3Ng/btsMAimkvIV/419DVvFdRzwr4Ao9LtBoz0/img.jpg&quot; width=&quot;300&quot; data-phocus-index=&quot;5&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;1495&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.1659%; margin-right: 10px;&quot; data-widthpercent=&quot;50.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uz3Ng/btsMAimkvIV/419DVvFdRzwr4Ao9LtBoz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUz3Ng%2FbtsMAimkvIV%2F419DVvFdRzwr4Ao9LtBoz0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;1495&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blbZ8k/btsMBWh3Tkg/4OMzZgL7wZPDOdpCY4urCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blbZ8k/btsMBWh3Tkg/4OMzZgL7wZPDOdpCY4urCK/img.jpg&quot; width=&quot;300&quot; data-phocus-index=&quot;6&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;1386&quot; data-is-animation=&quot;false&quot; height=&quot;611&quot; style=&quot;width: 48.6713%;&quot; data-widthpercent=&quot;49.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blbZ8k/btsMBWh3Tkg/4OMzZgL7wZPDOdpCY4urCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblbZ8k%2FbtsMBWh3Tkg%2F4OMzZgL7wZPDOdpCY4urCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;1386&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-layout-column=&quot;true&quot; data-column-width=&quot;50&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;layoutColumn&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-layout-content=&quot;true&quot;&gt;
&lt;div data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;mediaSingle&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-node-type=&quot;mediaSingle&quot; data-layout=&quot;center&quot; data-width=&quot;266&quot; data-width-type=&quot;pixel&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;Showpot은 2025년 1월, 안드로이드 앱으로 출시되었습니다!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;br /&gt;하지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;출시 하자마자 내한 공연이 많지 않아 사용자 활성화에 어려움&lt;/b&gt;을 겪었습니다.&lt;br /&gt;특히, 내한 공연이 적은 시기에는 앱 이용에 한계가 있다는 문제를 인식하게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;이를 해결하기 위해,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;현재 예정되거나 예매 중인 내한 공연에 댓글을 남길 수 있는 기능을 추가&lt;/b&gt;하기로 했습니다.&lt;br /&gt;사용자들이 &quot;빨리 공연 보러 가고 싶다!&quot;, &quot;콜드플레이의 어떤 노래가 가장 기대되나요?&quot; 같은 이야기를 나누며&lt;br /&gt;같은 관심사를 가진 팬들과 소통할 수 있도록 하는 것이 목표입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;Showpot은 빠르게 앱의 한계를 파악하고, 이를 개선하기 위해 도전하고 있습니다.&lt;br /&gt;내한 공연에 댓글 기능을 추가하면 사용자 유치 및 활성화에 긍정적인 영향을 줄 것이라는 가정이 과연 효과적일지 궁금합니다!&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&lt;span data-emoji-short-name=&quot;:heart:&quot; data-emoji-id=&quot;2764&quot; data-emoji-text=&quot;❤️&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;emoji&quot; data-prosemirror-node-inline=&quot;true&quot;&gt;❤️&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;끝으로 하고 싶은 말&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;사이드 프로젝트를 진행하며 깨달은 점은, 결국 사용자들의 도움이 꼭 필요하다는 것입니다.&lt;br /&gt;Showpot 팀원들은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;우리만의 서비스를 개발하고, 유저 피드백을 받아가며 개선하고 운영해보자&lt;/b&gt;는 목표로 이 프로젝트를 시작했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-node-block=&quot;true&quot;&gt;운영 경험이 부족해 아직 배워가는 과정이지만, 여러분의 클릭 하나하나가 앞으로의 방향을 나아가는 데 큰 도움이 될 것 같습니다.&lt;br /&gt;긴 글 읽어주셔서 감사합니다. 원하는 것 모두 이루시길 바라며, 건강하고 행복하세요!  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;  관련 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://play.google.com/store/apps/details?id=com.alreadyoccupiedseat.showpot&quot;&gt;구글플레이 링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741050390830&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;쇼팟(Showpot) - 내한 공연 정보, 티켓팅 알림 - Google Play 앱&quot; data-og-description=&quot;내한공연의 모든 것, 쇼팟에서&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.alreadyoccupiedseat.showpot&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.alreadyoccupiedseat.showpot&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/83lfL/hyYnaWUhJU/uzq9992CtXzO3BfwjZvuW0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/hlPl4/hyYmTgElve/f7Ktc2BaCqSA1F6xVNAl6k/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/NlJBG/hyYm0UgH1I/1IIRPVuvUGKB46L5xsODz0/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.alreadyoccupiedseat.showpot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.alreadyoccupiedseat.showpot&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/83lfL/hyYnaWUhJU/uzq9992CtXzO3BfwjZvuW0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/hlPl4/hyYmTgElve/f7Ktc2BaCqSA1F6xVNAl6k/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/NlJBG/hyYm0UgH1I/1IIRPVuvUGKB46L5xsODz0/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;쇼팟(Showpot) - 내한 공연 정보, 티켓팅 알림 - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;내한공연의 모든 것, 쇼팟에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://disquiet.io/product/showpot-%EC%87%BC%ED%8C%9F&quot;&gt;디스콰이엇 링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741050435750&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SHOWPOT 쇼팟 | Disquiet*&quot; data-og-description=&quot;내한공연 정보 전달 및 티켓팅 알림 앱&quot; data-og-host=&quot;disquiet.io&quot; data-og-source-url=&quot;https://disquiet.io/product/showpot-%EC%87%BC%ED%8C%9F&quot; data-og-url=&quot;https://disquiet.io/product/showpot-쇼팟&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://disquiet.io/product/showpot-%EC%87%BC%ED%8C%9F&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://disquiet.io/product/showpot-%EC%87%BC%ED%8C%9F&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SHOWPOT 쇼팟 | Disquiet*&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;내한공연 정보 전달 및 티켓팅 알림 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;disquiet.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>showpot</category>
      <category>내한공연</category>
      <category>내한공연 알림</category>
      <category>쇼팟</category>
      <category>티켓팅</category>
      <category>티켓팅 알림</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/277</guid>
      <comments>https://soopeach.tistory.com/277#entry277comment</comments>
      <pubDate>Tue, 4 Mar 2025 09:58:59 +0900</pubDate>
    </item>
    <item>
      <title>부스트캠프 웹・모바일 7기 Android 멤버십 수료!</title>
      <link>https://soopeach.tistory.com/276</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;수료했어요...!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 12월 16일 드디어 부스트캠프 웹・모바일 7기를 수료하였습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운좋게 챌린지를 참여할 수 있었던 것이 엊그제 같은데... 벌써 멤버십 수료라니 아직도 믿기지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음... 5개월간 제 인생의 전부였는데 수료를 해버리니 무엇을 해야할지는 잘 모르겠어요 ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 많이 성장할 수 있었고, 좋은 분들과의 인연도 많이 만들 수 있어 너무 행복했습니다!&amp;nbsp;&lt;br /&gt;제가 감히 이렇게 뛰어나신 분들을 어디서 뵐 수 있을지 모르겠어서 너무 아쉽고 섭섭합니다ㅜㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;heart.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G01KX/btrTQ0lKpb9/IUnUdQwsEqf4XybW05hXOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G01KX/btrTQ0lKpb9/IUnUdQwsEqf4XybW05hXOK/img.png&quot; data-alt=&quot;부캠 7기 안드로이드❤️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G01KX/btrTQ0lKpb9/IUnUdQwsEqf4XybW05hXOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG01KX%2FbtrTQ0lKpb9%2FIUnUdQwsEqf4XybW05hXOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;303&quot; data-filename=&quot;heart.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부캠 7기 안드로이드❤️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스트캠프 안드로이드 분야의 연예인 &quot;IVY&quot;님과 안드로이드 캠퍼분들과 함께 사진도 한 장!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;whyranoiderZep.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy92P0/btrTT6kIXYe/NZkKQCCeghZMRFQjw0jAqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy92P0/btrTT6kIXYe/NZkKQCCeghZMRFQjw0jAqK/img.png&quot; data-alt=&quot;왜안돼로이더❤️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy92P0/btrTT6kIXYe/NZkKQCCeghZMRFQjw0jAqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy92P0%2FbtrTT6kIXYe%2FNZkKQCCeghZMRFQjw0jAqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;627&quot; data-filename=&quot;whyranoiderZep.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왜안돼로이더❤️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 프로젝트를 같이 진행했던 왜안돼로이더들과 한 장!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.34.53 AM.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6DmtM/btrTP43xPrn/YxPrbdERoSkgIFl5FAekyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6DmtM/btrTP43xPrn/YxPrbdERoSkgIFl5FAekyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6DmtM/btrTP43xPrn/YxPrbdERoSkgIFl5FAekyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6DmtM%2FbtrTP43xPrn%2FYxPrbdERoSkgIFl5FAekyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;238&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.34.53 AM.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 수료식을 하며... 편하게 캠퍼들의 소감을 말할 수 있는 시간이 있었습니다!&lt;br /&gt;평소에 나서서 발표하고 이런 것을 잘못하는데 급발진해서 마이크를 켜고 안드로이드 캠퍼분들께 제 감사한 마음을 전했어요! 준비도 안하고 벌벌떨며 소감을 발표하다보니 제 마음이 잘 전달되었는지는 모르겠네요!&lt;br /&gt;감사한 분들이 정말 많았지만 다 말씀드리기에는 시간이 부족할 것 같아 아쉽게도 그룹 프로젝트하며 저를 잘 이끌어주시고, 고생도 많이 하신 저희 팀원분들만 샤라웃하였습니다..!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상장도 받았어요!&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2022-12-17-11-33-03-1.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOcOyu/btrTQf4VHJw/ARNygz5XkBe7ujgRnDwBck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOcOyu/btrTQf4VHJw/ARNygz5XkBe7ujgRnDwBck/img.png&quot; data-alt=&quot;팀장님이 왜안돼로이더들에게 주신 상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOcOyu/btrTQf4VHJw/ARNygz5XkBe7ujgRnDwBck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOcOyu%2FbtrTQf4VHJw%2FARNygz5XkBe7ujgRnDwBck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;1012&quot; data-filename=&quot;KakaoTalk_Photo_2022-12-17-11-33-03-1.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;팀장님이 왜안돼로이더들에게 주신 상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-16 at 6.41.00 PM.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvUp7Y/btrTR06xqv4/gMQWNfKHDXsTwZtjGolEE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvUp7Y/btrTR06xqv4/gMQWNfKHDXsTwZtjGolEE1/img.png&quot; data-alt=&quot;아마 운영진분이 주신 상??...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvUp7Y/btrTR06xqv4/gMQWNfKHDXsTwZtjGolEE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvUp7Y%2FbtrTR06xqv4%2FgMQWNfKHDXsTwZtjGolEE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;1010&quot; data-filename=&quot;Screenshot 2022-12-16 at 6.41.00 PM.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아마 운영진분이 주신 상??...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;롤링페이퍼도...&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.41.58 AM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ov9y9/btrTRHlHKOh/qPb8CQkazkKZcTEzUNtIM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ov9y9/btrTRHlHKOh/qPb8CQkazkKZcTEzUNtIM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ov9y9/btrTRHlHKOh/qPb8CQkazkKZcTEzUNtIM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fov9y9%2FbtrTRHlHKOh%2FqPb8CQkazkKZcTEzUNtIM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;814&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.41.58 AM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.42.24 AM.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R0rZ1/btrTSxQxiDT/wNhjMwnatjgSfds3yWxBr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R0rZ1/btrTSxQxiDT/wNhjMwnatjgSfds3yWxBr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R0rZ1/btrTSxQxiDT/wNhjMwnatjgSfds3yWxBr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR0rZ1%2FbtrTSxQxiDT%2FwNhjMwnatjgSfds3yWxBr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;800&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.42.24 AM.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.43.03 AM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCs7JA/btrTT6rwgge/wDHyybH2oOdtyAWeXAwTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCs7JA/btrTT6rwgge/wDHyybH2oOdtyAWeXAwTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCs7JA/btrTT6rwgge/wDHyybH2oOdtyAWeXAwTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCs7JA%2FbtrTT6rwgge%2FwDHyybH2oOdtyAWeXAwTZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;805&quot; data-filename=&quot;Screenshot 2022-12-17 at 11.43.03 AM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2022-12-19 at 9.33.45 AM.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cifXZ5/btrT3pxAdgn/TjHLUKGCI6D2kbKPKwy6hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cifXZ5/btrT3pxAdgn/TjHLUKGCI6D2kbKPKwy6hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cifXZ5/btrT3pxAdgn/TjHLUKGCI6D2kbKPKwy6hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcifXZ5%2FbtrT3pxAdgn%2FTjHLUKGCI6D2kbKPKwy6hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;601&quot; data-filename=&quot;Screenshot 2022-12-19 at 9.33.45 AM.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 캠퍼분들이 &lt;a href=&quot;https://rollingpaper.site/rolls/953371&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;롤링페이퍼&lt;/a&gt;를 써주셨는데요! 생각보다 정말 많은분들이 이쁘게 써주셔서 너무 감사했습니다...!!&lt;br /&gt;평생 간직할게요❤️&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부스트캠프를 수료하니&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스트캠프 덕분에 정말 개발적으로나 정신적으로나 많이 성장할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 챌린지를 운 좋게 들어갔을 때의 저를 떠올려보면 &quot;실력은 없고 자존심만 있는 상태&quot;였습니다.&lt;br /&gt;남에게 질문을 한다는 것은 스스로가 무지하다는 것을 알리는 것이라고 생각했어요. 정말 너무 너무 부끄러웠던 생각이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가 약간의 완벽주의적 성향이 있어 확실하지 않은 것들은 물어보거나 의견 제시를 하지도 못했습니다.&lt;br /&gt;하지만 제가 생각하기에 정말 대단하신 분들도 스스럼없이 질문을 해주시는 것을 보고 그동안 해온 생각이 정말 부끄러울 정도로 잘못된 생각이었구나를 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뛰어나신 분들을 많이 만나다보니 생각이 바뀌었습니다. &quot;실력은 없고 자존심만 있는 상태&quot;에서 &quot;내가 제일 못한다!!! 라고 생각하는 상태&quot;로 바뀌었습니다.&lt;br /&gt;그랬더니 질문도 적극적으로 할 수 있게 되었고, 확실하지는 않지만 내가 정리한 생각과 의견들도 제시할 수 있어 더욱 많은 것들을 얻어갈 수 있었어요!!&lt;br /&gt;부스트캠프 덕분에 정신적으로도 정말 많이 성장한 것 같습니다. 감사합니다!! :)&amp;nbsp;&lt;br /&gt;부스트캠프에서 이렇게 좋은 교육과정과 인연들을 만나지 않았더라면 저는 정신적으로 성숙해지지 못했을거에요!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발적인 부분도 물론 굉장히 많이 늘었습니다!! 공식문서, 내부코드를 먼저 확인하는 습관을 가지게 되었고 기능적인 부분들은 물론 코드를 생각하며 작성하는 제 모습을 보고 놀랍고 뿌듯했습니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠전 1주차 학습 스프린트 때 제가 작성한 코드를 보았습니다. 분명히 그 당시의 저는 나름 잘 짰다고 생각했던 코드였는데 지금 그 코드를 보니 비웃음이 나왔습니다...ㅋㅋㅋㅋㅋ 비웃음이 나오면서 한편으로는 내가 진짜 짧은 시간동안 많이 성장했구나! 라는 생각이 들어 너무 기분이 좋았습니다!! 그 날 행복하게 잠을 잘 수 있었어요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 모든 코드에 근거를 가지지는 못했지만 부족한 부분들은 천천히 공부해나가며 채우려고 합니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;부스트캠프는 개발에만 국한된 것이 아니라 제 인생의 전환점인 것 같습니다.&lt;br /&gt;&lt;/span&gt;다시 한번 부스트캠프에 깊은 감사를 드립니다! (__)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/boostcampwm-2022/android05-MoGakRun&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/boostcampwm-2022/android05-MoGakRun&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671245071730&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - boostcampwm-2022/android05-MoGakRun: 달려~  &amp;zwj;♂️ 달려~  &amp;zwj;♀️&quot; data-og-description=&quot;달려~  &amp;zwj;♂️ 달려~  &amp;zwj;♀️. Contribute to boostcampwm-2022/android05-MoGakRun development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/boostcampwm-2022/android05-MoGakRun&quot; data-og-url=&quot;https://github.com/boostcampwm-2022/android05-MoGakRun&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fKNbu/hyQU26Zco6/y2NALClwdqOwFMxVygCwFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/boostcampwm-2022/android05-MoGakRun&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/boostcampwm-2022/android05-MoGakRun&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fKNbu/hyQU26Zco6/y2NALClwdqOwFMxVygCwFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - boostcampwm-2022/android05-MoGakRun: 달려~  &amp;zwj;♂️ 달려~  &amp;zwj;♀️&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;달려~  &amp;zwj;♂️ 달려~  &amp;zwj;♀️. Contribute to boostcampwm-2022/android05-MoGakRun development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 프로젝트 때 진행한 프로젝트인데, 추후 배포뿐 아니라 워치 OS, 컴포즈 도입(진행중), 하이브리드로 이전, 서버 이전까지 계획중입니다!!&lt;br /&gt;모각런 프로젝트에 대하여 간단히 설명드리면 &lt;br /&gt;&quot;모여서, 각자, 런닝&quot; 을 한다는 뜻의 준말로 달리기를 하며 운동 내역을 자랑하고 같은 그룹원들이 달리기를 시작, 종료할 때 알림을 받아 동기부여가 될 수 있도록 기획한 프로젝트입니다!&lt;br /&gt;아직 코드 퀄리티도 만족스럽지 못하고 개선해야할 부분들은 많아서 앞으로도 꾸준히 관리하려고 합니다~!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위키, 노션 페이지, Issue, PR, Commit 관리등 저희 왜안돼로이더들이 열심히 작업한 과정이 고스란히 담겨있어요!! 심심하시면 구경해보셔도 좋을 것 같아요 :)&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>리뷰[Review]</category>
      <category>네이버 커넥트재단 부스트캠프</category>
      <category>부스트캠프</category>
      <category>부스트캠프 멤버십</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/276</guid>
      <comments>https://soopeach.tistory.com/276#entry276comment</comments>
      <pubDate>Sat, 17 Dec 2022 13:41:21 +0900</pubDate>
    </item>
    <item>
      <title>부스트 컨퍼런스 2022 후기(네이버 부스트캠프 웹&amp;middot;모바일 7기)</title>
      <link>https://soopeach.tistory.com/275</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Wow0/btrPaHRsiKf/NIudROf9KkSDKsqMa6wg51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Wow0/btrPaHRsiKf/NIudROf9KkSDKsqMa6wg51/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Wow0/btrPaHRsiKf/NIudROf9KkSDKsqMa6wg51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Wow0%2FbtrPaHRsiKf%2FNIudROf9KkSDKsqMa6wg51%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1080&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 data-ke-size=&quot;size26&quot;&gt;1784??&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 부스트캠프 웹모바일 7기 안드로이드 과정을 진행하는 중 10/20 오프라인 이벤트인 부스트 컨퍼런스 2022에 참여하게 되었다..!!!&lt;br&gt;부스트 컨퍼런스 2022의 장소는 1784라고 한다! 사실 처음 1784를 들었을 땐 뭔지 몰랐음...ㅎㅎ(네이버에 가기에는 아직 많이 부족한가보다) 1784를 찾아보니... 네이버 신사옥이라고…&lt;br&gt;&lt;a href=&quot;https://1784.navercorp.com/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://1784.navercorp.com/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;1784 THE TESTBED 혁신을 현실로.&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;건물이 기술 그 자체인 1784의 의미, 철학, 주요 기술, 친환경, 코로나 대응, 상생 관련 정보 제공&quot; data-og-host=&quot;1784.navercorp.com&quot; data-og-source-url=&quot;https://1784.navercorp.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dJ48q7/hyQasybRxJ/EqJlDj8cwnRuYpJFTxDBDK/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800&quot; data-og-url=&quot;https://1784.navercorp.com/&quot;&gt;
 &lt;a href=&quot;https://1784.navercorp.com/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://1784.navercorp.com/&quot;&gt;
  &lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dJ48q7/hyQasybRxJ/EqJlDj8cwnRuYpJFTxDBDK/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800')&quot;&gt; 
  &lt;/div&gt;
  &lt;div class=&quot;og-text&quot;&gt;
   &lt;p class=&quot;og-title&quot;&gt;1784 THE TESTBED 혁신을 현실로.&lt;/p&gt;
   &lt;p class=&quot;og-desc&quot;&gt;건물이 기술 그 자체인 1784의 의미, 철학, 주요 기술, 친환경, 코로나 대응, 상생 관련 정보 제공&lt;/p&gt;
   &lt;p class=&quot;og-host&quot;&gt;1784.navercorp.com&lt;/p&gt;
  &lt;/div&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우와 내가 이런 곳에 갈 수 있다고??... 너무 설레는 마음으로 10/20일만을 기다렸다...!!&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;건물의 첫인상(1784가 아닌 Green Factory...)&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D1NbK/btrO9C3I63s/Fenz4njBKk5UjrD7AxjgiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D1NbK/btrO9C3I63s/Fenz4njBKk5UjrD7AxjgiK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D1NbK/btrO9C3I63s/Fenz4njBKk5UjrD7AxjgiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD1NbK%2FbtrO9C3I63s%2FFenz4njBKk5UjrD7AxjgiK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1314&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;사진에 Naver라고 써있는 건물은 1784(신사옥)이 아니라 Green Factory(구사옥)이다...ㅎㅎ&lt;br&gt;너무 웅장해서 저게 신사옥인 줄 알았는데... 허허... 저 뒤에 있는 건물이 로봇 친화형 건물인 1784이다!&lt;br&gt;컨퍼런스는 14:30분부터 시작 및 14:00부터 입장이었지만 외부인도 이용 가능한 스타벅스가 있다길래 조금 일찍 도착해서 스타벅스에서 시간을 때울 생각이었다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;브랜드 스토어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타벅스를 가기 전 브랜드 스토어에 먼저 방문했다!!! 당시에는 부끄러워서 사진을 못 찍었지만 사진 좀 찍어둘 걸 후회가 된다... 정말 이쁜 굿즈들이 많았는데, 이쁜 만큼 가격은 이쁘지 않았다...^^;&lt;br&gt;브랜드 스토어에는 네이버 1784 + Green Factory를 모델로한 브릭, N키캡, 레고 키링, 휴대폰 케이스 및 필기류 등 여러가지 상품이 있었다!!! 정말 다 사고 싶었지만 지갑사정이 허락해주지 않아서 패스&lt;br&gt;굿즈 중 메모지? 메모장?을 파는 것도 있었는데 어떤 사람이 웃긴 글을 적고 가서 사진을 찍어놨다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PD0tx/btrO6hZ99Vv/LkZfsKxCOAJIHI9sTd70kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PD0tx/btrO6hZ99Vv/LkZfsKxCOAJIHI9sTd70kk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PD0tx/btrO6hZ99Vv/LkZfsKxCOAJIHI9sTd70kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPD0tx%2FbtrO6hZ99Vv%2FLkZfsKxCOAJIHI9sTd70kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;1440&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 누굴까...???&lt;br&gt; &lt;br&gt;그리고 기억에 남은 것들 두 장!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2SwfB/btrO8z7ioOo/Iy5DTYu5tfqYUHOPWX1OJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2SwfB/btrO8z7ioOo/Iy5DTYu5tfqYUHOPWX1OJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2SwfB/btrO8z7ioOo/Iy5DTYu5tfqYUHOPWX1OJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2SwfB%2FbtrO8z7ioOo%2FIy5DTYu5tfqYUHOPWX1OJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;1440&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHz8Xv/btrPajQOHD5/v9fhpDDPIDDDWTyjoUzejK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHz8Xv/btrPajQOHD5/v9fhpDDPIDDDWTyjoUzejK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHz8Xv/btrPajQOHD5/v9fhpDDPIDDDWTyjoUzejK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHz8Xv%2FbtrPajQOHD5%2Fv9fhpDDPIDDDWTyjoUzejK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;1440&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드 스토어에 있는 섹션 중 하나였는데 티셔츠와 같은 옷들을 전시해놓은 것 같다!! 이 옷들은 판매용은 아닌 것 같고 전시용이라고 생각했는데 잘 모르겠다..!! 전시용이 맞다면, 역시 네이버는 정말 멋있다. 자부심을 느낄만한 회사...&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스타벅스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드 스토어를 살짝쿵 구경하고 스타벅스로 갔다..!! 첨 갔을 땐 생각보다 사람들이 많아서 굉장히 민망했다...&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdMChV/btrPajDfpVv/y1YKxxsZxo3qZg8Y4kVvrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdMChV/btrPajDfpVv/y1YKxxsZxo3qZg8Y4kVvrk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdMChV/btrPajDfpVv/y1YKxxsZxo3qZg8Y4kVvrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdMChV%2FbtrPajDfpVv%2Fy1YKxxsZxo3qZg8Y4kVvrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;요로코롬 귀여운 로봇들도 있었고..!!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yBhvk/btrO9O4OpIu/WTKofjA9q2jUsAiskuYzk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yBhvk/btrO9O4OpIu/WTKofjA9q2jUsAiskuYzk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yBhvk/btrO9O4OpIu/WTKofjA9q2jUsAiskuYzk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyBhvk%2FbtrO9O4OpIu%2FWTKofjA9q2jUsAiskuYzk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 직원인척도 살~짝 해봤다...(사실 맥북 전면에 I'm a boostcamper 스티커가 붙어있어서 살짝 민망했다...)&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰레기 버리고 오다가 로봇이 움직이길래 호다닥 찍어봤다 ㅎㅎㅎ 어머 신기해라&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;요런 그림을 그려주는 AI?도 있었다!!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컨퍼런스는??&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구경을 조금 하다가 행사시간이 되어 친해진 안드로이드 캠퍼분들과 행사장에 입장을 했다!!!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhIoZs/btrPaNwWwfw/BOPavbEla7Ssx95GeUOZ71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhIoZs/btrPaNwWwfw/BOPavbEla7Ssx95GeUOZ71/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhIoZs/btrPaNwWwfw/BOPavbEla7Ssx95GeUOZ71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhIoZs%2FbtrPaNwWwfw%2FBOPavbEla7Ssx95GeUOZ71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;1440&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;요렇게 이쁘장한 배너도 준비되어있었고,&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4XE6/btrO9lWmGZA/rEHPXd03j8PQrhKTHIsBs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4XE6/btrO9lWmGZA/rEHPXd03j8PQrhKTHIsBs0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4XE6/btrO9lWmGZA/rEHPXd03j8PQrhKTHIsBs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4XE6%2FbtrO9lWmGZA%2FrEHPXd03j8PQrhKTHIsBs0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;내가...!! 네이버의 방문증도 받아보았으며,&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SlOxt/btrPaHcOdBU/WdkeqVD5G9ni2gFcPj9m10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SlOxt/btrPaHcOdBU/WdkeqVD5G9ni2gFcPj9m10/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SlOxt/btrPaHcOdBU/WdkeqVD5G9ni2gFcPj9m10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSlOxt%2FbtrPaHcOdBU%2FWdkeqVD5G9ni2gFcPj9m10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;내 글씨체로... 요러한 명찰도 만들었다!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c33pWf/btrPbDHCaj7/ZKK1HBGSKqXjODBq1GTirK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c33pWf/btrPbDHCaj7/ZKK1HBGSKqXjODBq1GTirK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c33pWf/btrPbDHCaj7/ZKK1HBGSKqXjODBq1GTirK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc33pWf%2FbtrPbDHCaj7%2FZKK1HBGSKqXjODBq1GTirK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;귀여운 주니어 네이버 에코백 굿즈(비닐에 담긴 검은색 물체)와 간식 상자도 받았다..!!!&lt;br&gt; &lt;br&gt;컨퍼런스에 관한 이야기는 안하고 초등학생이 체험학습에 다녀온 후기같은 느낌의 글을 작성하고 있는 것 같다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;br&gt; &lt;br&gt;컨퍼런스에 대해서 간단히 말해보자면...!! &lt;br&gt;우선은 동료 캠퍼분들이 직접 연사를 하는 &lt;b&gt;테크톡 시간&lt;/b&gt;,&lt;b&gt;&lt;br&gt;&lt;/b&gt;다양한 캠퍼들이 모여 소통하는 시간인 &lt;b&gt;네트워킹 시간&lt;/b&gt;,&lt;b&gt;&lt;br&gt;&lt;/b&gt;그리고 현업자들과 소통을 할 수 있는&lt;b&gt; 커리어톡 시간&lt;/b&gt;으로 구성되었는데 내용은 아래와 같다.&lt;br&gt; &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; 테크톡&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테크톡 시간은 내가 겪을 혹은 겪은 문제나 의문 사항들을 캠퍼분들이 깊게 조사하고 자료 및 내용을 공유해주는 시간이었다!&lt;br&gt;캠퍼분들이 너무 너무 퀄리티있는 발표를 해주셔서 알고 싶었지만 미루었던 내용들을 아주 쉽게 이해할 수 있었다~~&lt;br&gt; &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;네트워킹&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워킹은 어떠한 규칙에의하여 랜덤으로 짜여진 다양한 캠퍼분들이 대화를 하는 시간이었다!! 초면인 분들이 많아서 그냥 캠퍼분들을 모아만 두고 이야기를 시켰다면 어색했을 것 같지만 초반에 몇 가지 주제들을 던져주셔서 해당 주제들로 조금 더 쉽게 아이스 브레이킹을 하고 대화를 나눌 수 있었다.&lt;br&gt; &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;커리어톡&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커리어톡은 현직자분들을 모시고 캠퍼분들이 질문을 하면 답변을 해주는 시간이었는데, 정말 다른 곳에서 쉽게 얻지 못할 정보들을 공유해주셔서 너무 소중한 시간이었다...!!!&lt;br&gt; &lt;br&gt;이렇게 총 3가지 카테고리의 알찬 컨퍼런스를 보낸 것 같다..!!!&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;안드로이드계의 연예인 IVY님&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXNgq/btrPa3NtbQG/BsbHI8OWkqoTfyqXdqFo9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXNgq/btrPa3NtbQG/BsbHI8OWkqoTfyqXdqFo9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXNgq/btrPa3NtbQG/BsbHI8OWkqoTfyqXdqFo9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXNgq%2FbtrPa3NtbQG%2FBsbHI8OWkqoTfyqXdqFo9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;부스트캠프 웹모바일 7기 안드로이드 도메인의 마스터이신 아이비님도 뵐 수 있었다!&lt;br&gt;정말 줌으로만 보았던 연예인같은 존재셨는데 실제로 뵙게되니 너무 너무 반갑고 영광이었다..!&lt;br&gt;쉬는 시간에 다른 분들이 아이비님의 싸인을 받으러 가시길래 나도 호다닥 맥북을 들고 싸인을 받았음…ㅎㅅㅎ&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;끝~&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KZC7V/btrO31Rhsur/2wJ7xS80CX9YYkvlDHvjZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KZC7V/btrO31Rhsur/2wJ7xS80CX9YYkvlDHvjZ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KZC7V/btrO31Rhsur/2wJ7xS80CX9YYkvlDHvjZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKZC7V%2FbtrO31Rhsur%2F2wJ7xS80CX9YYkvlDHvjZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1252&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;컨퍼런스가 끝나고 뒷풀이를 하러가기 전 내부를 한 컷... &lt;br&gt;하루 정말 갚진 시간을 보냈고 네이버에 더 오고 싶어졌다...!!!&lt;br&gt;&lt;br&gt;내가 감히 이런말 해도 될지는 모르겠지만...ㅎㅎㅎ&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt; 
 &lt;br&gt;(졸업은 해야하니)
 &lt;br&gt;3년만 기다려줘 네이버...!!
 &lt;br&gt;(면접은 보러 갈게...) 
&lt;/blockquote&gt;</description>
      <category>리뷰[Review]</category>
      <category>네이버 부스트캠프</category>
      <category>부스트캠프</category>
      <category>부스트캠프웹모바일</category>
      <category>부스트컨퍼런스</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/275</guid>
      <comments>https://soopeach.tistory.com/275#entry275comment</comments>
      <pubDate>Fri, 21 Oct 2022 02:29:17 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 14716번 현수막(BFS)[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/274</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 1111번 문제입니다. (solved.ac) 기준 실버 1 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14716&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14716&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664616236315&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14716번: 현수막&quot; data-og-description=&quot;혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14716&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14716&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cif5bt/hyPXOWQStW/HMYM751bIw7Rk3rNov1D00/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14716&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14716&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cif5bt/hyPXOWQStW/HMYM751bIw7Rk3rNov1D00/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14716번: 현수막&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.24.50 PM.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baHUlU/btrNwjEWcXA/SKpwBXK4oZSkKzPpBEFkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baHUlU/btrNwjEWcXA/SKpwBXK4oZSkKzPpBEFkkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baHUlU/btrNwjEWcXA/SKpwBXK4oZSkKzPpBEFkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaHUlU%2FbtrNwjEWcXA%2FSKpwBXK4oZSkKzPpBEFkkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2300&quot; height=&quot;1558&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.24.50 PM.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.25.04 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnlKps/btrNvif2v94/qKBJUnC1rksINGjcEdBJD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnlKps/btrNvif2v94/qKBJUnC1rksINGjcEdBJD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnlKps/btrNvif2v94/qKBJUnC1rksINGjcEdBJD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnlKps%2FbtrNvif2v94%2FqKBJUnC1rksINGjcEdBJD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2308&quot; height=&quot;680&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.25.04 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 배열로 0, 1을 입력받고 글자의 개수를 출력하는 문제입니다. 글자인 부분은 1, 글자가 아닌 부분은 0이라고 합니다.&lt;br /&gt;2차원 배열의 모든 인덱스를 탐색하며 1이라는 값이나오면 해당 인덱스의 값은 0으로 바꿔주고(중복 탐색 방지)&lt;br /&gt;상하좌우/ 좌상 좌하 우상 우하, 총 8개의 방향으로 탐색을 하여 1이 있는지 확인합니다.(글자는 이어져있으므로)&lt;br /&gt;8개의 방향을 탐색하는 중 마찬가지로 1이 발견되었다면 해당 좌표에서도 동일하게 8방향을 탐색합니다.&lt;br /&gt;이렇게 8방향 탐색과정은 인접한 8방향에 0이 존재하지 않을 때까지 반복됩니다.(이어진 1들은 1개의 글자이므로)&lt;br /&gt;이렇게 탐색이 종료가 되었다면 글자 1개가 존재한다고 판정합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1664616213972&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hyunsoo.`3week`

/**
 * 나름 간단한 BFS문제인 것 같다?
 * 9개의 방향을 모두 탐색하면 될듯!
 * - 연결된 1들은 모두 0으로 바꾸고 1개로 처리하기!
 */

data class Pos(val x: Int, val y: Int)

// 상 하 좌 우 / 좌상 좌하 우상 우하
val searchPosList = listOf(
    Pos(-1, 0),
    Pos(1, 0),
    Pos(0, -1),
    Pos(0, 1),
    Pos(-1, -1),
    Pos(1, -1),
    Pos(-1, 1),
    Pos(1, 1),
)

val banner = mutableListOf&amp;lt;MutableList&amp;lt;Char&amp;gt;&amp;gt;()
var m = 0
var n = 0

fun main() {
    readln().split(&quot; &quot;).map { it.toInt() }.apply {
        m = this[0]
        n = this[1]
    }
    var wordCnt = 0

    repeat(m) {
        val dataRow = readln().split(&quot; &quot;).map { it.first() }.toMutableList()
        banner.add(dataRow)
    }

    for (i in 0 until m) {
        for (j in 0 until n) {
            if (bfs(i, j)) wordCnt++
        }
    }

    println(wordCnt)
}

fun bfs(x: Int, y: Int): Boolean {

    // 0 이면 애초에 글자가 아님.
    if (banner[x][y] == '0') return false

    banner[x][y] = '0'

    searchPosList.forEach { pos -&amp;gt;

        val nx = x + pos.x
        val ny = y + pos.y

        if (nx in 0 until m &amp;amp;&amp;amp; ny in 0 until n) bfs(nx, ny)

    }

    return true
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>Algorithm</category>
      <category>BFS</category>
      <category>kotlin</category>
      <category>너비우선탐색</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/274</guid>
      <comments>https://soopeach.tistory.com/274#entry274comment</comments>
      <pubDate>Sat, 1 Oct 2022 18:29:16 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 3098번 소셜네트워크(그래프, 브루트포스)[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/273</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 3098번 문제입니다. (solved.ac) 기준 실버 3 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3098&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/3098&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664615592839&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;3098번: 소셜네트워크&quot; data-og-description=&quot;소셜 네트워크는 이제 우리 삶의 일부가 되어버렸다. 이러한 소셜 네트워크를 분석하는 김동규 석사과정은 흥미로운 현상을 발견했다. 바로 친구 관계의 수가 급속도로 증가한다는 것이다. 예&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/3098&quot; data-og-url=&quot;https://www.acmicpc.net/problem/3098&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l9QnV/hyPY9yigaj/DjCH64pfOgPsQKNDXCGbGk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3098&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/3098&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l9QnV/hyPY9yigaj/DjCH64pfOgPsQKNDXCGbGk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;3098번: 소셜네트워크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소셜 네트워크는 이제 우리 삶의 일부가 되어버렸다. 이러한 소셜 네트워크를 분석하는 김동규 석사과정은 흥미로운 현상을 발견했다. 바로 친구 관계의 수가 급속도로 증가한다는 것이다. 예&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.13.50 PM.png&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;1804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3FaTD/btrNyFHhAX1/FzoP8WzQqxwdE2ioVYKiMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3FaTD/btrNyFHhAX1/FzoP8WzQqxwdE2ioVYKiMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3FaTD/btrNyFHhAX1/FzoP8WzQqxwdE2ioVYKiMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3FaTD%2FbtrNyFHhAX1%2FFzoP8WzQqxwdE2ioVYKiMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2296&quot; height=&quot;1804&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.13.50 PM.png&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;1804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.15.24 PM.png&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ikz7o/btrNyFN05Ej/UceKXllKmmvAg28B2LM740/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ikz7o/btrNyFN05Ej/UceKXllKmmvAg28B2LM740/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ikz7o/btrNyFN05Ej/UceKXllKmmvAg28B2LM740/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIkz7o%2FbtrNyFN05Ej%2FUceKXllKmmvAg28B2LM740%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2316&quot; height=&quot;1350&quot; data-filename=&quot;Screen Shot 2022-10-01 at 6.15.24 PM.png&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구관계는 양방향 그래프로 저장되고, 친구의 친구는 친구입니다.&lt;br /&gt;처음에 입력받은 친구관계로부터 모두가 친구가 될 때까지 하루에 새로운 친구관계가 얼마나 생기는 지 구하면 되는 문제입니다!&lt;br /&gt;입력값의 범위가 굉장히 작으므로 완전탐색으로 양방향 그래프를 탐색하고 조건에 맞춰 갱신해주었습니다!&lt;br /&gt;&lt;br /&gt;모두 친구가 될 때까지 반복을 하며,&lt;br /&gt;모든 인원의 친구리스트를 순차탐색하며, 친구리스트에 있는 친구들의 친구리스트도 순차탐색을 합니다.&lt;br /&gt;만약 친구리스트에 있는 친구의 친구가 나와 친구가 아니라면, 새로운 친구(새로운 관계)가 될 수 있으므로 새 친구 관계로 저장을 해둡니다.(즉각 반영하면 Exception in thread &quot;main&quot; java.util.ConcurrentModificationException 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구 관계는 Pair(1,4)와 같은 형식으로 저장이되는데, Pair(1, 4) / Pair(4, 1)은 동일한 친구 관계를 나타내므로 Pair로 친구 관계를 저장할 때 무조건 작은 수, 큰 수 순서로 배치하였고 Set을 사용하여 중복 관계를 방지하였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1664615753721&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hyunsoo.`3week`

/**
 * 친구의 친구는 나의 친구
 * A와 B의 친구라면 B도 A의 친구?.. 말이 왜이래?
 *
 * 입/출력
 * - 첫째 줄
 *      - 사람의 수 N(1 ~ 50)과 처음 친구 관계의 수 M(1 ~ n * (n-1)/ 2)이 주어짐.
 * - 둘째 줄부터 M개의 줄
 *      - 두 정수 A, B (1 &amp;le; A &amp;le; N, 1 &amp;le; B &amp;le; N, A &amp;lt; B)
 *
 * 아이디어
 * - 양방향 그래프이므로 2차원 배열을 사용하고 [a] = b / [b] = a 형식으로 그래프 정보를 저장
 * - 매번 친구관계들을 모두 확인해서 친구로 저장
 * - 새로운 친구 관계 판정은 어떻게 해야할까
 *      - 관계를 Pair로 묶은 후 Set을 통해 관리하고 한 번에 계산하자!
 *      - 그렇지 않고 반복문 내부에서 리스트를 직접 조작하면 Exception in thread &quot;main&quot; java.util.ConcurrentModificationException 빌셍
 */


fun main() {

    val (n, m) = readln().split(&quot; &quot;).map { it.toInt() }

    // 친구 관계 데이터가 담길 그래프
    val friendDataGraph = Array(n + 1) { mutableListOf&amp;lt;Int&amp;gt;() }
    // 새로운 관계를 임시로 담을 리스트
    val newRelationShipList = mutableSetOf&amp;lt;Pair&amp;lt;Int, Int&amp;gt;&amp;gt;()
    // - 하루마다 생성되는 친구 관계의 수 - 정답
    val madeRelationShipCntList = mutableListOf&amp;lt;Int&amp;gt;()

    repeat(m) {
        val (a, b) = readln().split(&quot; &quot;).map { it.toInt() }
        friendDataGraph[a].add(b)
        friendDataGraph[b].add(a)
    }

    // 모두가 친구가 돨 때까지!
    while (isEveryoneFriend(friendDataGraph, n - 1).not()) {
        // 친구 관계도를 순차 탐색
        friendDataGraph.forEachIndexed { target, targetfriendList -&amp;gt;

            // 타겟의 친구들을 순차 탐색
            targetfriendList.forEach { myfriend -&amp;gt;

                // 타겟의 친구의 친구들을 순차 탐색
                friendDataGraph[myfriend].forEach { friendOfFriend -&amp;gt;
                    // 친구의 친구가 친구가 아니었다면
                    if ((friendOfFriend in targetfriendList).not() &amp;amp;&amp;amp; target != friendOfFriend) {
                        // 새로운 관계(새 친구)!
                        val newRelationShip = makeSortedRelationShip(target, friendOfFriend)
                        newRelationShipList.add(newRelationShip)
                    }
                }
            }
        }

        // 새로운 관계 적용
        newRelationShipList.forEach { relationShipData -&amp;gt;
            val (a, b) = relationShipData
            friendDataGraph[a].add(b)
            friendDataGraph[b].add(a)
        }
        // 하루마다 만들어지는 새로운 관계의 수를 저장
        madeRelationShipCntList.add(newRelationShipList.size)
        // 새로운 관계를 모두 적용했으므로 초기화
        newRelationShipList.clear()

    }

    // 정답형식에 맞게 출력
    madeRelationShipCntList.apply {
        println(this.size)
        this.forEach {
            println(it)
        }
    }


}

// 더 작은 순서가 앞으로 나오게
fun makeSortedRelationShip(who: Int, andWho: Int) =
    if (who &amp;lt; andWho) Pair(who, andWho) else Pair(andWho, who)

// 모두가 친구인가?
fun isEveryoneFriend(friendDataGraph: Array&amp;lt;MutableList&amp;lt;Int&amp;gt;&amp;gt;, friendCnt: Int): Boolean {

    friendDataGraph.forEachIndexed { index, friendList -&amp;gt;
        if (index != 0 &amp;amp;&amp;amp; friendList.size != friendCnt) return false
    }

    return true
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>Algorithm</category>
      <category>kotlin</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/273</guid>
      <comments>https://soopeach.tistory.com/273#entry273comment</comments>
      <pubDate>Sat, 1 Oct 2022 18:22:08 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 5430번 AC[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/272</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 5430번 문제입니다. (solved.ac) 기준 골드 5 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/5430&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663162397063&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;5430번: AC&quot; data-og-description=&quot;각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5430&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5430&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5430&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;5430번: AC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-14 at 10.34.11 PM.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceDZnz/btrMabOmDQe/rGK6EAID5P0eovs6NFmKzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceDZnz/btrMabOmDQe/rGK6EAID5P0eovs6NFmKzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceDZnz/btrMabOmDQe/rGK6EAID5P0eovs6NFmKzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceDZnz%2FbtrMabOmDQe%2FrGK6EAID5P0eovs6NFmKzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;813&quot; data-filename=&quot;Screen Shot 2022-09-14 at 10.34.11 PM.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-14 at 10.35.10 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0cLNw/btrMabt30KK/fK7nclvSVH9nLyRV27G4uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0cLNw/btrMabt30KK/fK7nclvSVH9nLyRV27G4uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0cLNw/btrMabt30KK/fK7nclvSVH9nLyRV27G4uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0cLNw%2FbtrMabt30KK%2FfK7nclvSVH9nLyRV27G4uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1160&quot; height=&quot;450&quot; data-filename=&quot;Screen Shot 2022-09-14 at 10.35.10 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골드 문제라고 지레 겁먹어서 생각을 좀 복잡하게 했던 것 같습니다...&amp;nbsp;&lt;br /&gt;Deque을 사용하면 아주 쉽게 풀 수 있는 문제입니다.&lt;br /&gt;&lt;br /&gt;처음에는 단순하게 mutabeList를 사용하여 완전 탐색하며 R과 D의 작업을 그때 그때 처리해주었습니다. R이 나오면 리스트를 뒤집고 D가 나오면 맨 앞에서 하나를 빼주는 식으로. 예상했던 것처럼 시간초과가 발생하였고 조금 더 효율적으로 연산을 처리하기위하여 연속된 R의 개수와 D의 개수를 파악한후 D에서 R로 바뀔 때 축적된 D의 개수만큼 한 번에 빼고 R의 짝, 홀수 여부에 따라 앞에서 뺄지 뒤에서 뺄지 정하는 로직을 구현하였습니다. 하지만 특정한 케이스(ex. D가 먼저 나오는 경우)를 처리하지 못하여서 처음부터 단순하게 접근하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘의 방식을 합쳐서 함수 문자열은 완전 탐색을 진행하되, R이 나올 때마다 rCnt라는 변수에 담아 몇 번 뒤집어졌는지 판단하도록 하였고 rCnt가 짝수인지, 홀수인지 여부에 따라서 D가 나올 때 마다 앞에서 뺄지 뒤에서 뺄지 결정하여 앞, 뒤에서 빼줄 수 있도록 하였습니다.&lt;br /&gt;앞, 뒤에서 요소들을 빼야하기 때문에 Deque 자료구조를 사용하였고 마지막은 joinToString을 사용하여 출력형식에 맞게 출력할 수 있도록 하였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1663162898246&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hyunsoo.`2week`


/*
 * AC는 정수 배열에 연산을 하기 위해 만든 언어이다.
 * - R, D 함수가있음.
 *      - R 함수는 뒤집기
 *          - 배열에 있는 수의 순서를 뒤집음
 *      - D 함수는 버리기
 *          - 첫 번째 수를 버리기.
 *          - 배열이 비어있는데 D를 사용하면 에러 발생.
 *
 * 입/출력
 * - 첫째 줄에는 테스트 케이스의 개수 T가 주어짐. (100 이하)
 *      - 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어짐.(1 이상 100,000 이하)
 *      - 그 다음에는 배열에 들어있는 수의 개수 n이 주어진다. (0 이상 100,000 이하)
 *      - 그 다음에는 [1,2,3] 형태로 배열에 들어있는 정수가 주어짐.(1이상 100이하)
 *
 *
 * 실패한 아이디어
 * - 함수 문자열을 하나하나 순차적으로 탐색하여 해당 함수의 동작을 하려고 했음.
 *      - 시간초과가 발생할 것이라고 예상
 *      - 실제로 시간초과 발생
 * - 연속된 R, D의 개수를 판단하고 한번에 연산을 하기
 *      - 연속된 R이 짝수면 앞에서 빼기
 *      - 연속된 R이 홀수면 뒤에서 빼기
 *          - D로 먼저 시작하는 경우 반례가 발생
 *
 * 성공한 아이디어
 * - 함수 문자열을 하나하나 순차적으로 탐색하여 R이면 rCnt에 추가
 * - D라면 rCnt가 짝수인지 홀수인지 여부를 확인하고 앞에서 뺄지 뒤에서 뺄지 결정
 *      - rCnt가 짝수라면(ex. 2일경우) 뒤집고 뒤집으니 원위치, 따라서 앞에서 빼기
 *      - rCnt가 홀수라면 뒤에서 빼기
 * - 앞, 뒤 모두에서 빼야하므로 Deque 자료구조를 사용
 *
 */


fun main() {

    val t = readln().toInt()
    val deque = ArrayDeque&amp;lt;String&amp;gt;()

    repeat(t) {

        deque.clear()
        val funString = readln()
        val cnt = readln().toInt()
        val array = readln().replace(&quot;[&quot;, &quot;&quot;).replace(&quot;]&quot;, &quot;&quot;)

        if (cnt &amp;gt; 1) {
            array.split(&quot;,&quot;).forEach {
                deque.addLast(it)
            }
        } else deque.addLast(array)

        // D의 개수가 숫자의 개수보다 크면 에러
        if (funString.count { it == 'D' } &amp;gt; cnt) {
            println(&quot;error&quot;)
            return@repeat
        }

        var rCnt = 0
        funString.forEach { curChar -&amp;gt;

            if (curChar == 'D') {

                if (rCnt % 2 == 0) {
                    deque.removeFirst()
                } else {
                    deque.removeLast()
                }

            } else if (curChar == 'R') {
                rCnt++
            }
        }

        if (rCnt % 2 != 0) deque.reverse()
        println(deque.joinToString(&quot;,&quot;, &quot;[&quot;, &quot;]&quot;))

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>kotlin</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/272</guid>
      <comments>https://soopeach.tistory.com/272#entry272comment</comments>
      <pubDate>Wed, 14 Sep 2022 22:41:43 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1895번 필터(브루트 포스 - 완전 탐색)[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/271</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 1895번 문제입니다. (solved.ac) 기준 실버 4 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1895&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1895&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663058520225&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1895번: 필터&quot; data-og-description=&quot;숫자 9개가 오름차순이나 내림차순으로 정렬되어 있을 때, 중앙값은 다섯 번째 숫자이다. 예를 들어, 1, 3, 4, 1, 2, 6, 8, 4, 10의 중앙값은 4이다. (1 &amp;le; 1 &amp;le; 2 &amp;le; 3 &amp;le; 4 &amp;le; 4 &amp;le; 6 &amp;le; 8 &amp;le; 10) 이미지 I는 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1895&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1895&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ba7uLu/hyPMZ91x7M/ZQpoQdjdo8bcaEfyvrdCO1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1895&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1895&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ba7uLu/hyPMZ91x7M/ZQpoQdjdo8bcaEfyvrdCO1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1895번: 필터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;숫자 9개가 오름차순이나 내림차순으로 정렬되어 있을 때, 중앙값은 다섯 번째 숫자이다. 예를 들어, 1, 3, 4, 1, 2, 6, 8, 4, 10의 중앙값은 4이다. (1 &amp;le; 1 &amp;le; 2 &amp;le; 3 &amp;le; 4 &amp;le; 4 &amp;le; 6 &amp;le; 8 &amp;le; 10) 이미지 I는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.44.06 PM.png&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WAAP/btrLZQxU4Xh/eKD4qk3JatBFb41avSG2G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WAAP/btrLZQxU4Xh/eKD4qk3JatBFb41avSG2G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WAAP/btrLZQxU4Xh/eKD4qk3JatBFb41avSG2G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WAAP%2FbtrLZQxU4Xh%2FeKD4qk3JatBFb41avSG2G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2074&quot; height=&quot;1932&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.44.06 PM.png&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.44.37 PM.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b49iL6/btrL42DBTVm/0kXkpouTFO0tOLKjXTKg2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b49iL6/btrL42DBTVm/0kXkpouTFO0tOLKjXTKg2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b49iL6/btrL42DBTVm/0kXkpouTFO0tOLKjXTKg2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb49iL6%2FbtrL42DBTVm%2F0kXkpouTFO0tOLKjXTKg2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2080&quot; height=&quot;978&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.44.37 PM.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지(2차원 배열)를 입력받고 3 * 3필터를 통해 이미지의 중앙값을 찾으면서 필터링한 후 해당 이미지에 T 보다 크거나 같은 픽셀의 수를 구하는 문제입니다. 3 * 3 필터를 사용하면 9개의 숫자를 확인할 수 있는데 9개의 수들 중 5번째 숫자가 중앙값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 3 * 3으로 완전탐색한 후 중앙값들을 찾아서(필터링) T보다 크거나 같은 수들을 구하는 방식으로 문제를 해결하였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1663058500104&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 제한사항
 * - 숫자 9개가 정렬되어있을 경우 5번째 숫자가 중앙값
 * - 이미지 I는 크기가 R * C인 2차원 픽셀
 *      - R과 C는 3이상 40이하
 * - 각 픽셀은 어두운 정도 V를 나타냄
 *      - V는 0이상 255이하
 * - 필터의 크기는 3 * 3
 *
 * 아이디어
 * - 3 * 3 크기로 이미지를 완전탐색
 * - 중앙값들을 모은 후 T보다 크거나 같은 픽셀의 수를 구하자
 *
 * 이슈
 * - NumberFormat 에러가 발생...왜지?
 *      - C개의 픽셀 값이 주어질 때 공백이 딸려오나봄..^^ 코틀린 왜이래
 */

data class Pos(val x: Int, val y: Int)

fun main() {

    val filterDir = listOf(
        Pos(0, 0),
        Pos(0, 1),
        Pos(0, 2),
        Pos(1, 0),
        Pos(2, 0),
        Pos(1, 1),
        Pos(1, 2),
        Pos(2, 1),
        Pos(2, 2),
    )

    var ans = 0
    val (r, c) = readln().split(&quot; &quot;).map { it.toInt() }
    val imgDataList = mutableListOf&amp;lt;List&amp;lt;Int&amp;gt;&amp;gt;()

    repeat(r) {
        val colList = readln().trim().split(&quot; &quot;).map { it.toInt() }
        imgDataList.add(colList)
    }

    val t = readln().toInt()

    for (row in 0..r - 3) {
        for (col in 0..c - 3) {
            val filteredList = mutableListOf&amp;lt;Int&amp;gt;()
            filterDir.forEach { pos -&amp;gt;
                filteredList.add(imgDataList[row + pos.x][col + pos.y])
            }
            if (t &amp;lt;= filteredList.sorted()[4]) ans++
        }
    }

    println(ans)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>kotlin</category>
      <category>브루트포스</category>
      <category>완전탐색</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/271</guid>
      <comments>https://soopeach.tistory.com/271#entry271comment</comments>
      <pubDate>Tue, 13 Sep 2022 17:56:19 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 5555번 반지(브루트 포스 - 완전 탐색)[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/270</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 5555번 문제입니다. (solved.ac) 기준 실버 5 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5555&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/5555&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663057780068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;5555번: 반지&quot; data-og-description=&quot;당신은 N개의 반지를 가지고 있다. 각각의 반지는&amp;nbsp;대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5555&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5555&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f0GTT/hyPMZhSK73/JrpEiDpLSu2CikRxkCnKUK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5555&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5555&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f0GTT/hyPMZhSK73/JrpEiDpLSu2CikRxkCnKUK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;5555번: 반지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;당신은 N개의 반지를 가지고 있다. 각각의 반지는&amp;nbsp;대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.27.21 PM.png&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxkHNt/btrLZPThx4x/TTfISMROKkvOXBwRkQ7oO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxkHNt/btrLZPThx4x/TTfISMROKkvOXBwRkQ7oO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxkHNt/btrLZPThx4x/TTfISMROKkvOXBwRkQ7oO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxkHNt%2FbtrLZPThx4x%2FTTfISMROKkvOXBwRkQ7oO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1412&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.27.21 PM.png&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.29.51 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnnE8L/btrLYkMLZ7X/moCPIYZVuTnyEKn3NumWy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnnE8L/btrLYkMLZ7X/moCPIYZVuTnyEKn3NumWy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnnE8L/btrLYkMLZ7X/moCPIYZVuTnyEKn3NumWy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnnE8L%2FbtrLYkMLZ7X%2FmoCPIYZVuTnyEKn3NumWy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2308&quot; height=&quot;1356&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.29.51 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾고자 하는 문자열이 반지에 포함되어있는지 확인하고 찾는 문자열을 포함하는 반지의 개수를 구하는 문제입니다.&lt;br /&gt;반지는 문자열의 시작과 끝이 연결된 형태로 이루어져있다고 하였는데 문자열의 길이가 10으로 짧기때문에 10가지 모든 경우를 일일이 확인했습니다.(AAAAAAAAAX라면 AAAAAAAAXA, AAAAAAAXAA ... XAAAAAAAAAA 까지 탐색)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663057811548&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 *
 * 시간 제한 1초 == 약 10억회의 연산 가능
 *
 * 요구사항
 * - N개의 반지를 가짐.
 * - 각 반지는 대문자 10문자로 이루어진 문자열이 새겨져있음.
 * - 문자열은 시작과 끝이 연결되어있음.
 *
 * - 찾고자하는 문자열이 주어지면 그 문자열을 포함하는 반지가 몇 개인지를 발견하는지 찾기.
 *
 * 아이디어
 * - 반지의 문자열이 가능한 모든 경우를 찾아서 판별?
 *     - ex) ZAAAAXY 라면 AAAAXYZ, AAAXYZA ... 등
 *     1. 찾을 수 있는 모든 반지 문자열의 경우의 수 찾기
 *     2. 반지의 모든 경우의 수에 원하는 문자열을 확인해보기
 *
 */
fun main() {

    val wannaFind = readln()
    val ringCnt = readln().toInt()
    var ans = 0

    repeat(ringCnt) {
        val ring = readln()
        val cases = numberOfCases(ring)

        cases.forEach { ringString -&amp;gt;
            if (ringString.contains(wannaFind)) {
                ans++
                return@repeat
            }
        }
    }

    println(ans)
}

fun numberOfCases(string: String): MutableList&amp;lt;String&amp;gt; {
    val casesList = mutableListOf&amp;lt;String&amp;gt;()

    for (startIndex in 1..string.length) {
        val case = string.substring(startIndex, string.length) + string.substring(0, startIndex)
        casesList.add(case)
    }

    return casesList
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>kotlin</category>
      <category>브루트포스</category>
      <category>완전탐색</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/270</guid>
      <comments>https://soopeach.tistory.com/270#entry270comment</comments>
      <pubDate>Tue, 13 Sep 2022 17:39:14 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 2897번 몬스터 트럭(브루트포스 - 완전탐색)[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/269</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 2897번 문제입니다. (solved.ac) 기준 브론즈 1 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2897&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2897&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663057465699&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2897번: 몬스터 트럭&quot; data-og-description=&quot;출력은 다섯 줄이다. 첫째 줄에는 해빈이가 아무 차도 부수지 않으면서 주차할 수 있는 공간의 개수, 둘째 줄은 차 한 대를 부수고 주차할 수 있는 공간의 개수, 셋째 줄은 차 두 대, 넷째 줄은 차&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2897&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2897&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fKaoW/hyPLnSe717/paqRmvkDCW5VjRRFpeTGJk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2897&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2897&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fKaoW/hyPLnSe717/paqRmvkDCW5VjRRFpeTGJk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2897번: 몬스터 트럭&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출력은 다섯 줄이다. 첫째 줄에는 해빈이가 아무 차도 부수지 않으면서 주차할 수 있는 공간의 개수, 둘째 줄은 차 한 대를 부수고 주차할 수 있는 공간의 개수, 셋째 줄은 차 두 대, 넷째 줄은 차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.25.02 PM.png&quot; data-origin-width=&quot;2302&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A0MC2/btrLYlLFs66/LkLNkHudhrsYSPx3s2V20k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A0MC2/btrLYlLFs66/LkLNkHudhrsYSPx3s2V20k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A0MC2/btrLYlLFs66/LkLNkHudhrsYSPx3s2V20k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA0MC2%2FbtrLYlLFs66%2FLkLNkHudhrsYSPx3s2V20k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2302&quot; height=&quot;1502&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.25.02 PM.png&quot; data-origin-width=&quot;2302&quot; data-origin-height=&quot;1502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.28.00 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZyL8/btrL3SuQlkV/Bx1osBzb81kJQs7gn9hO5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZyL8/btrL3SuQlkV/Bx1osBzb81kJQs7gn9hO5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZyL8/btrL3SuQlkV/Bx1osBzb81kJQs7gn9hO5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZyL8%2FbtrL3SuQlkV%2FBx1osBzb81kJQs7gn9hO5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2308&quot; height=&quot;1464&quot; data-filename=&quot;Screen Shot 2022-09-13 at 5.28.00 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 단순한 브루트 포스 문제라고 생각하고 완전탐색을 구현했습니다. 완전탐색으로 2 * 2 크기의 배열을 확인해보고 탐색한 공간에 #가 존재한다면 주차를 할 수 없는 공간, #존재한다면 #의 개수만큼 부수고 주차할 공간이라고 판단하고 각각의 경우를 카운트할 변수를 만들어서 구현했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1663057524700&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 입/출력 관련
 * - 지도는 R행 C열
 * - `#`은 빌딩 `X`는 주차된 차, `.`은 빈 주차공간
 * - 혜빈이의 차는 2행 2열의 칸을 차지해야함.
 *
 * 요구사항
 * - 가능한 주차 공간을 해빈이가 부숴야하는 차의 수대로 모아서 보여주자.
 * - 주차하기 위해 부숴야하는 차만 고려.(주차하러 가는 길에 부수는 차는 신경 X)
 * - 빌딩이 있는 곳은 주차를 할 수 없음.
 *
 * 아이디어
 * - 간단한 브루트 포스인듯.
 * - 모든 행,열을 2x2로 조사하여 빌딩이 있다면 넘어가고
 *   그렇지 않다면 주차하는 경우를 부숴야하는 수의 경우에 따라 판단.
 */

var dontNeedToBreak = 0
var needToBreakOne = 0
var needToBreakTwo = 0
var needToBreakThree = 0
var needToBreakFour = 0

fun main() {

    val (row, col) = readln().split(&quot; &quot;).map { it.toInt() }
    val parkingLot = mutableListOf&amp;lt;String&amp;gt;()

    repeat(row) {
        val c = readln()
        parkingLot.add(c)
    }

    for (r in 0..row - 2) {
        for (c in 0..col - 2) {
            val curPos = parkingLot[r][c]
            val rightPos = parkingLot[r + 1][c]
            val downPos = parkingLot[r][c + 1]
            val rightAndDownPos = parkingLot[r + 1][c + 1]
            checkParkingLot(curPos, rightPos, downPos, rightAndDownPos)
        }
    }

    println(dontNeedToBreak)
    println(needToBreakOne)
    println(needToBreakTwo)
    println(needToBreakThree)
    println(needToBreakFour)

}

fun checkParkingLot(vararg posList: Char) {

    posList.find { it == '#' }?.let { return }

    when (posList.count { it == 'X' }) {
        0 -&amp;gt; dontNeedToBreak++
        1 -&amp;gt; needToBreakOne++
        2 -&amp;gt; needToBreakTwo++
        3 -&amp;gt; needToBreakThree++
        4 -&amp;gt; needToBreakFour++
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>kotlin</category>
      <category>브루트포스</category>
      <category>완전탐색</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/269</guid>
      <comments>https://soopeach.tistory.com/269#entry269comment</comments>
      <pubDate>Tue, 13 Sep 2022 17:26:44 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-09-05 until 2022-09-11</title>
      <link>https://soopeach.tistory.com/268</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.59.37 PM.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;1670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMnrRj/btrL43CpL6s/OMlgW9sSP4hD0Ke3SQ0AwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMnrRj/btrL43CpL6s/OMlgW9sSP4hD0Ke3SQ0AwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMnrRj/btrL43CpL6s/OMlgW9sSP4hD0Ke3SQ0AwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMnrRj%2FbtrL43CpL6s%2FOMlgW9sSP4hD0Ke3SQ0AwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;1670&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.59.37 PM.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;1670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오 이번에는 꽤나 열심히했다!&amp;nbsp;&lt;br /&gt;점점 느끼는 것이지만 요즘은 클린 코드에 대한 중요성을 느끼고 있다. 왜 `냄새나는 코드`라는 표현을 쓰는지 알겠다. 내가 짠 코드이지만 정말 냄새가 난다... 계속해서 유지보수하면서 내 코드는 정말 스파게티 그 자체구나라는 것을 느끼고 있다.&lt;br /&gt;그래도 확실히 챌린지를 하면서 성장한 것은 느껴진다!! 성장해서 이정도인데 이전에는...참 암담하다 ㅋㅋㅋㅋㅋㅋㅋ 그래도 조금씩 발전하는 것이 느껴져서 정말 행복하다. 갈길은 너무 멀지만...&lt;br /&gt;그리고 이번 주부터 멤버십 1주차 멤버분들이랑 코테 대비용 알고리즘 스터디를 하기로했다~~!!!! 내가 직접 스터디를 제안하고 시작하는 것은 처음이라 조금 떨리긴 하지만.. 나를 포함한 멤버분들의 시간이 아깝지 않게 노력을 해봐야겠다!&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/268</guid>
      <comments>https://soopeach.tistory.com/268#entry268comment</comments>
      <pubDate>Tue, 13 Sep 2022 17:11:09 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-08-29 until 2022-09-04</title>
      <link>https://soopeach.tistory.com/267</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.54.41 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;1602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdLsVF/btrL2mQGhp1/fRkH4FOfNhm8MrKGeiOJlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdLsVF/btrL2mQGhp1/fRkH4FOfNhm8MrKGeiOJlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdLsVF/btrL2mQGhp1/fRkH4FOfNhm8MrKGeiOJlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdLsVF%2FbtrL2mQGhp1%2FfRkH4FOfNhm8MrKGeiOJlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;1602&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.54.41 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;1602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스트캠프 웹모바일 7기 멤버십을 시작했다. 무작정 코딩만 하는 것이 아닌 학습을 병행하면서 했기 때문에 코딩시간은 조금 적게 느껴진다. 확실히 챌린지 보다는 훨씬 수월했지만 아직 나는 부족한게 정말 정말 많다는 것을 느꼈다. 예~~~전에 한번씩 써봤던 기능이라 기능 자체를 사용하는 것은 크게 문제가 되지 않았지만 제대로 알고 쓰지는 않은 것 같다. 공식문서를 읽는 습관도 들이고 무작성 기능만 구현하는 것이 아니 학습하면서 구현하도록 노력을 해야겠다.&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/267</guid>
      <comments>https://soopeach.tistory.com/267#entry267comment</comments>
      <pubDate>Tue, 13 Sep 2022 16:57:23 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-08-22 until 2022-08-28</title>
      <link>https://soopeach.tistory.com/266</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.45.36 PM.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5rtqR/btrL43bjknj/OMI9Dddb11KTzUzw8kmrIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5rtqR/btrL43bjknj/OMI9Dddb11KTzUzw8kmrIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5rtqR/btrL43bjknj/OMI9Dddb11KTzUzw8kmrIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5rtqR%2FbtrL43bjknj%2FOMI9Dddb11KTzUzw8kmrIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;1034&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.45.36 PM.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때가 게으름이 극에 달했을 때인 것 같다... 부끄러워서 블로그에 올리지 못했지만... 이제는 올릴 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디서 글을 봤는데 번아웃이랑 게으름은 다르다고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번아웃은 어떤 일을 해내고서 무기력함을 느끼는 것이고 게으름은 어떤 일을 시작도 하지 않았는데 하기 싫은 것이라고 한다.&lt;br /&gt;처음에는 챌린지를 끝내고 나서 에너지를 다쓴 줄 알았는데... 사실은 뭘 해야할지 몰라서 빈둥거렸던 것 같다.&lt;br /&gt;또한 보상심리가 작용해서 나름 챌린지도 수료했는데 좀 쉬어야지!! 이런 생각을 했던 것 같다. 반성한다.&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/266</guid>
      <comments>https://soopeach.tistory.com/266#entry266comment</comments>
      <pubDate>Tue, 13 Sep 2022 16:54:00 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-08-15 until 2022-08-21</title>
      <link>https://soopeach.tistory.com/265</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.41.22 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boTlX6/btrL4AG7ip7/8UOgkNfSq68FpdUo3Yk5e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boTlX6/btrL4AG7ip7/8UOgkNfSq68FpdUo3Yk5e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boTlX6/btrL4AG7ip7/8UOgkNfSq68FpdUo3Yk5e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboTlX6%2FbtrL4AG7ip7%2F8UOgkNfSq68FpdUo3Yk5e0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;1412&quot; data-filename=&quot;Screen Shot 2022-09-13 at 4.41.22 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;1412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음.. 거의 한달이 다 지나서 올리게 되었다...&lt;br /&gt;사실 부스트캠프 챌린지가 종료 후 에너지가 방전되어서 아무것도 안하고 빈둥거렸는데 그게 부끄러워서 블로그에 글을 쓰지 못했었다.&lt;br /&gt;한번 그렇게 블로그에 대한 신경을 꺼버리니 다시 신경을 쓰는 것이 쉽지는 않았다. 하하...&lt;br /&gt;아무튼 이 때는 강아지 사진을 파이어베이스의 Storage에 저장하고 불러오는 간단한 앱을 만들었던 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/265</guid>
      <comments>https://soopeach.tistory.com/265#entry265comment</comments>
      <pubDate>Tue, 13 Sep 2022 16:44:00 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드[Android] 레이아웃 - magin과 padding의 차이</title>
      <link>https://soopeach.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 앱을 개발할 때 UI를 관리하는 과정에서 여백 을 주기위하여 magin 혹은 padding을 사용하였는데, 개념을 확실하게 알고 썼다니 보다 그때 그때 봐꿔가며 썼던 것 같아 정리를 해보았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;magin과 padding을 간단하게 기억해보자.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패딩&lt;/b&gt;을 간단하게 기억하기 위해서 우리가 입는 패딩을 생각해볼 수 있습니다!&lt;br /&gt;두꺼운 패딩을 입게된다면 나와 패딩은 하나로 합체가 되고 당연히 &lt;b&gt;패딩의 크기만큼 부피가 커지겠죠&lt;/b&gt;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마진&lt;/b&gt;은 그냥 여백이라고 생각하면 기억하기 쉬울 것 같습니다. 여백은 빈 공간을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 특정한 뷰에게 패딩을 주었다면 패딩의 크기만큼 뷰의 크기가 커고 마진을 주었다면 마진의 크기만큼 여백이 생기게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패딩 &lt;/b&gt;= 뷰의 내부에 여백을 주는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마진 &lt;/b&gt;= 뷰의 외부에 여백을 주는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 간단한 예시로 버튼의 텍스트 사이즈는 그대로 하고 싶고 터치되는 영역을 늘리고 싶다면 패딩을 주어 버튼이 클릭되는 영역을 확장시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1662271349261&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:orientation=&quot;vertical&quot;
    tools:context=&quot;.MainActivity&quot;&amp;gt;

    &amp;lt;Button
        android:text=&quot;그냥 버튼&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;/&amp;gt;

    &amp;lt;Button
        android:text=&quot;Margin을 사용한 버튼&quot;
        android:layout_margin=&quot;20dp&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;/&amp;gt;

    &amp;lt;Button
        android:text=&quot;Padding을 사용한 버튼&quot;
        android:padding=&quot;20dp&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;/&amp;gt;

&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-04 at 3.02.35 PM.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dixcyo/btrLntooWPi/mqgZXjsLPHK8aLF5d0z3ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dixcyo/btrLntooWPi/mqgZXjsLPHK8aLF5d0z3ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dixcyo/btrLntooWPi/mqgZXjsLPHK8aLF5d0z3ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdixcyo%2FbtrLntooWPi%2FmqgZXjsLPHK8aLF5d0z3ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;891&quot; data-filename=&quot;Screen Shot 2022-09-04 at 3.02.35 PM.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 레이아웃은 리니어 레이아웃이고 총 3개의 버튼을 수직으로 배치시켰습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 버튼은 별다른 속성이 없고, 두 번째 버튼은 20dp의 마진을 주어서 상,하,좌,우에 20dp씩 여백이 생긴 것을 볼 수 있습니다.&lt;br /&gt;세 번째 버튼은 20dp의 패딩을 주어서 상,하,좌,우에 20dp 패딩이 생긴 것을 볼 수 있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Margin은 뷰 외부의 여백(뷰의 외부)을, Padding은 패딩을 입은 것처럼 뷰 내부의 여백(뷰의 내부)에 관여합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, Margin은 해당 속성을 가진 뷰의 외부에 관여하고 Padding은 해당 속성을 가진 뷰의 내부에 관여합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Margin과 Padding의 차이를 코드로 알아보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드는 리니어 레이아웃의 하위 뷰로 기본 텍스트뷰, 마진만 있는 텍스트뷰, 패딩만 있는 텍스트뷰, 마진과 텍스트 모두 있는 텍스트뷰를 배치한 코드입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1662271737502&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
    &amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        xmlns:tools=&quot;http://schemas.android.com/tools&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;
        android:orientation=&quot;vertical&quot;
        tools:context=&quot;.MainActivity&quot;&amp;gt;

        &amp;lt;TextView
            android:text=&quot;그냥 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#F6C0C0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;그냥 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#C5E1B0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;마진만 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_margin=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#F6C0C0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;마진만 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_margin=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#C5E1B0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;패딩만 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:padding=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#F6C0C0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;패딩만 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:padding=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#C5E1B0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;마진과 패딩이 모두 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_margin=&quot;10dp&quot;
            android:padding=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#F6C0C0&quot;/&amp;gt;

        &amp;lt;TextView
            android:text=&quot;마진과 패딩이 모두 있는 텍스트 뷰&quot;
            android:textColor=&quot;#000000&quot;
            android:layout_margin=&quot;10dp&quot;
            android:padding=&quot;10dp&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:background=&quot;#C5E1B0&quot;/&amp;gt;

    &amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-04 at 3.09.10 PM.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b75GKI/btrLlF3HB7G/8k28htBtzJbq6J4td1geOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b75GKI/btrLlF3HB7G/8k28htBtzJbq6J4td1geOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b75GKI/btrLlF3HB7G/8k28htBtzJbq6J4td1geOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb75GKI%2FbtrLlF3HB7G%2F8k28htBtzJbq6J4td1geOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;889&quot; data-filename=&quot;Screen Shot 2022-09-04 at 3.09.10 PM.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4619899/difference-between-a-views-padding-and-margin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/4619899/difference-between-a-views-padding-and-margin&lt;/a&gt;&lt;/p&gt;</description>
      <category>안드로이드[Android]</category>
      <category>Android</category>
      <category>layout</category>
      <category>레이아웃</category>
      <category>안드로이드</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/264</guid>
      <comments>https://soopeach.tistory.com/264#entry264comment</comments>
      <pubDate>Sun, 4 Sep 2022 15:09:48 +0900</pubDate>
    </item>
    <item>
      <title>부스트캠프 웹・모바일 7기 멤버쉽 합격(안드로이드)</title>
      <link>https://soopeach.tistory.com/263</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;부스트캠프 웹・모바일 7기 챌린지 후기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/259&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;부스트캠프 웹・모바일 7기 챌린지 수료후기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661343460704&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;부스트캠프 웹・모바일 7기 챌린지 수료후기&quot; data-og-description=&quot;8월 12일 부스트캠프 웹・모바일 7기의 챌린지가 종료되었다! 헤헤... 스스로에게 이러한 상도 주었다. 수료증 후기 챌린지 과정은 4주간 진행되었다. 음... 정말 너무 힘들었다. 눈을 감았다 뜨니 &quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/259&quot; data-og-url=&quot;https://soopeach.tistory.com/259&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yHhDy/hyPyCbggcq/qmDqU9qkwfxEpeypICQGqK/img.png?width=600&amp;amp;height=250&amp;amp;face=0_0_600_250,https://scrap.kakaocdn.net/dn/UZzE9/hyPyCbggdg/1L0589Y3bw4BSjk0q4voC0/img.png?width=600&amp;amp;height=250&amp;amp;face=0_0_600_250,https://scrap.kakaocdn.net/dn/bmvzWS/hyPyytaIsN/muukJy1u6eUYNjdrNUhdJ1/img.png?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/259&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/259&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yHhDy/hyPyCbggcq/qmDqU9qkwfxEpeypICQGqK/img.png?width=600&amp;amp;height=250&amp;amp;face=0_0_600_250,https://scrap.kakaocdn.net/dn/UZzE9/hyPyCbggdg/1L0589Y3bw4BSjk0q4voC0/img.png?width=600&amp;amp;height=250&amp;amp;face=0_0_600_250,https://scrap.kakaocdn.net/dn/bmvzWS/hyPyytaIsN/muukJy1u6eUYNjdrNUhdJ1/img.png?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;부스트캠프 웹・모바일 7기 챌린지 수료후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;8월 12일 부스트캠프 웹・모바일 7기의 챌린지가 종료되었다! 헤헤... 스스로에게 이러한 상도 주었다. 수료증 후기 챌린지 과정은 4주간 진행되었다. 음... 정말 너무 힘들었다. 눈을 감았다 뜨니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 멤버십에 합격???...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어제 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;부스트캠프 웹・모바일 7기 챌린지를 같이했던 팀중 1주차 팀원분들과 만나서 이야기도 나누고, 보드게임도 하고, 간단히 맥주도 마셨다~~! 원래 멤버쉽 입과 결과 발표는 오늘(8/24)이지만 이전에는 조금 더 일찍 알려주었다고 들어서 어제 나올 것이라고 예상을 했어서 나를 비롯한 팀원분들 모두 발표가 언제 날지 굉장히 떨려했었다!! ㅋㅋㅋㅋ 다행히(?) 어제는 멤버십 결과가 나오지 않았다!&lt;br /&gt;&amp;nbsp;솔직히 말하면 위에 챌린지 수료후기에도 적어놓았듯이 챌린지 과정을 진행하면서 나는 스스로에게 굉장히 실망했고 자괴감도 많이 들어서 2,3주차쯤 멤버십을 거의 포기했다고 생각했다. 하지만 그게 아니었나보다 오늘 자면서 멤버쉽을 붙거나 떨어지는 꿈을 5번 이상 꾸었다...&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그리고 오늘 하루종일 멤버십 합격 결과가 신경 쓰여서 다른 것에 집중을 못했다ㅜㅡㅜ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-24 at 8.59.38 PM.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzJ2G/btrKvgKOqkw/BRKn1pTvEUzdy8K8nh1uFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzJ2G/btrKvgKOqkw/BRKn1pTvEUzdy8K8nh1uFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzJ2G/btrKvgKOqkw/BRKn1pTvEUzdy8K8nh1uFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyzJ2G%2FbtrKvgKOqkw%2FBRKn1pTvEUzdy8K8nh1uFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;91&quot; data-filename=&quot;Screen Shot 2022-08-24 at 8.59.38 PM.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던 중 예상치 못한 합격 소식을 받게되었다...! 우와...&lt;br /&gt;정확한 선별기준은 정말 모르겠다. 챌린지 과정을 수행하며 마주쳤던 모든 분들이 대단하셨고, 떨어질 분이 없다고 생각했다.&lt;br /&gt;나만 제일 못났다고 생각했다. 그런데 예상외의 결과가 나타났다... 참 감사하다. 사실 아직도 실감이 나지 않는다. 메일이 오발송이 된 것은 아니겠지?? 라는 상상을 종종하곤 하는데... 아니겠지!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;솔직히 말해서 나는 미션 수행을 완벽히 한적이 손에 꼽을 것이라고 생각한다. &lt;br /&gt;+ 미션 수행에 급급해서 학습정리도 이쁘지 않게, 제대로 못했다고 생각한다. 그래도 최대한 노력은 하였다. 이 노력을 봐주셔서 뽑아주신 것이라고 생각한다. 2,3 주차 때에는 의기소침해져서 피어세션 때에도 적극적으로 하지 못했고... 생각해보니 못났던 기억들만 생각이 나는 것 같다 ㅋㅋㅋ&lt;br /&gt;부스트캠프를 진행하며 마지막 코드 제출은 항상 2시가 넘었다. 잠은 보통 3-4시 쯤 잤던 것 같다. 밤을 새서 미션을 수행하시는 분들도 계시지만 나는 매일 3,4시쯤 자고 8시 30분에 일어났다. 3, 4시 정도가 되면 머리가 굳어버려서 간단한 테스트 코드나 내가 작성하려고 했던 코드가 기억이 나지를 않았다. 그 때는 무리를 해서 미션을 수행하지는 않았고 차라리 빨리 잠을 잤다. 그래서 컨디션 조절을 아예 실패한 적은 없었던 것 같다.&lt;br /&gt;음... 정말 합격을 하고는 싶었지만 합격을 할 것이라고는 생각치 못했는데... 멤버십에 입과할 수 있게 되어 너무 영광이고 행복하다.&lt;br /&gt;아마 순수 실력만으로 선별을 했다면 나는 멤버십에 입과하지 못했을 것이라고 생각한다. 많이 부족했지만 노력을 했던 모습을 잘 봐주셔서?? 마지막 기회로 멤버십에 입과시켜주신 것이 아닐까 생각해본다!&lt;br /&gt;챌린지가 끝나고 번아웃이와서 방황하고 있었는데 정말 다행이다... 활력소가 다시 생긴 기분이다!!&lt;br /&gt;너무너무 감사하다!!!&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>부스트캠프</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/263</guid>
      <comments>https://soopeach.tistory.com/263#entry263comment</comments>
      <pubDate>Wed, 24 Aug 2022 21:35:20 +0900</pubDate>
    </item>
    <item>
      <title>코틀린[Kotlin]으로 이미지 리사이징하기</title>
      <link>https://soopeach.tistory.com/262</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 프로젝트를 진행하는 중 이미지들의 용량 문제 + 썸네일을 만들기 위하여 이미지를 리사이징 해야할 일이 생겼습니다...&lt;br /&gt;간단하게 파일입출력을 이용하여 이미지를 읽고, 지정한 사이즈로 원하는 경로에 이미지를 생성하는 코드를 코틀린으로 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지가 깨지지 않도록 압축을 하기위해서는 별도의 설정이 필요하지만... 우선 그냥 모든 이미지를 100 * 100로 맞추도록 코드를 짰습니다. 수정하면 원하는 크기로 리사이징이 가능!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽을 이미지들이 담겨있는 디렉터리와 리사이즈된 이미지들을 저장할 디렉터리를 지정해주면 이미지들이 담겨있는 디렉터리의 모든 이미지들을 읽은 후 지정한 너비, 높이로 리사이징하여 설정해놓은 경로에 저장됩니다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps. 아래의 코드는 원본 파일의 이름을 그대로 사용하기 때문에(ex img1234.jpg) 원본의 확장자로 저장이 되는 듯함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps2. ImageIO의 reader, writer가 지원하는 확장자 목록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-20 at 6.32.28 PM.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ig2kn/btrJ8p9b3bh/gRNwP2LtkeKa60b3YKKmkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ig2kn/btrJ8p9b3bh/gRNwP2LtkeKa60b3YKKmkk/img.png&quot; data-alt=&quot;http://www.java2s.com/Code/Java/2D-Graphics-GUI/ListAllreaderandwriterformatssupportedbyImageIO.htm&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ig2kn/btrJ8p9b3bh/gRNwP2LtkeKa60b3YKKmkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIg2kn%2FbtrJ8p9b3bh%2FgRNwP2LtkeKa60b3YKKmkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;228&quot; height=&quot;870&quot; data-filename=&quot;Screen Shot 2022-08-20 at 6.32.28 PM.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http://www.java2s.com/Code/Java/2D-Graphics-GUI/ListAllreaderandwriterformatssupportedbyImageIO.htm&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1660986680931&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.awt.image.BufferedImage
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.InputStream
import javax.imageio.ImageIO


fun main() {

    // 파일의 경로
    // TODO - 읽을 이미지가 들어있는 디렉터리의 경로를 지정
    val path = &quot;/Users/hyunsoo/Desktop/코코jpg&quot;
    // 파일 객체 생성
    val file = File(path)
    // 파일을 생성할 경로
    // TODO - 리사이징할 이미지를 쓸 경로를 지정
    val outputPath = &quot;/Users/hyunsoo/Desktop/&quot;
    // 해당 경로의 모든 파일 탐색
    file.walk().forEach {
        // 파일이 아니거나 .DS_Store 파일일 경우 무시
        // TODO - 특정 확장자를 명시해줘도 좋을 것 같음.
        if (!it.isFile || it.toString().contains(&quot;.DS_&quot;)) return@forEach
        // 파일의 이름(동일한 파일명으로 저장하기 위함)
        val fileName = it.name
        // 파일들을 바이트 스트림으로 읽기 위해 FileInputStream 객체 생성
        val imgInputStream = FileInputStream(it)
        // 리사이징된 이미지
        // TODO - 두 번째 인자로 너비 지정, 세 번째 인자로 높이 지정
        val bufferedImage = resize(imgInputStream, 100, 100)
        // 지정한 경로 + 파일의 이름으로 파일 생성하기 위한 FileOutputStream 객체 생성
        val imgOutputStream = FileOutputStream(outputPath + fileName)
        // bufferedImage를 jpeg 포멧으로 FileOutputStream를 통해 저장.
        ImageIO.write(bufferedImage, &quot;jpeg&quot;, imgOutputStream)
        println(&quot;${it.name} 리사이즈 완료&quot;)
    }

}

// InputStream 이미지를 지정한 높이, 너비만큼 크기를 조정해서 BufferedImage 로 반환
fun resize(inputStream: InputStream, width: Int, height: Int): BufferedImage {
    // 리사이즈 대상 이미지 읽기
    val originImage = ImageIO.read(inputStream)

    // 원본 사진의 높이, 너비
//    println(&quot;${inputImage.height} ${inputImage.width}&quot;)

    // 지정한 사이즈의 이미지를 담을 bufferedImage 생성
    val resizedImage = BufferedImage(width, height, originImage.type)
    // 생성한 이미지에 요청한 크기의 이미지를 그리기
    val graphics = resizedImage.createGraphics()
    graphics.drawImage(originImage, 0, 0, width, height, null)
    graphics.dispose()

    return resizedImage
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;참고&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://velog.io/@sorakim92/Java-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A6%AC%EC%82%AC%EC%9D%B4%EC%A7%95%EC%9A%A9%EB%9F%89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@sorakim92/Java-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A6%AC%EC%82%AC%EC%9D%B4%EC%A7%95%EC%9A%A9%EB%9F%89&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보[Information]</category>
      <category>kotlin</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/262</guid>
      <comments>https://soopeach.tistory.com/262#entry262comment</comments>
      <pubDate>Sat, 20 Aug 2022 18:24:05 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-08-08 until 2022-08-14</title>
      <link>https://soopeach.tistory.com/261</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-15 at 11.12.06 PM.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDh9dk/btrJFPO1Hp6/IdVXIzrwg1PExFmm2KBOIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDh9dk/btrJFPO1Hp6/IdVXIzrwg1PExFmm2KBOIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDh9dk/btrJFPO1Hp6/IdVXIzrwg1PExFmm2KBOIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDh9dk%2FbtrJFPO1Hp6%2FIdVXIzrwg1PExFmm2KBOIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;746&quot; data-filename=&quot;Screen Shot 2022-08-15 at 11.12.06 PM.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 주에 부스트캠프가 끝났다..! 지난 주에는 구현 자체보다는 학습에 초점을 맞추기도 했고 쉽지 않은 개념들이 있어서 코딩을 한 시간 자체는 적었던 것 같다. 부스트캠프를 수료한 후 오늘까지 거의 푹 쉬었는데... 내일(화-수)는 친구들과 여행을 다녀오기로 해서.. 여행을 다녀온 후 다시 공부에 전념해볼까한다...&lt;br /&gt;부스트캠프를 끝내고 정말 방전이 되어서 하루 종일 누워만 있었는데... 이제 그만 쉴 때가 된 것 같다 ㅋㅋㅋㅋ&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/261</guid>
      <comments>https://soopeach.tistory.com/261#entry261comment</comments>
      <pubDate>Mon, 15 Aug 2022 23:16:30 +0900</pubDate>
    </item>
    <item>
      <title>GDSC DJU 1기 수료후기</title>
      <link>https://soopeach.tistory.com/260</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTzAl/btrJELkKTxM/1misNmAKEsWRkM1A1ixiS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTzAl/btrJELkKTxM/1misNmAKEsWRkM1A1ixiS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTzAl/btrJELkKTxM/1misNmAKEsWRkM1A1ixiS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTzAl%2FbtrJELkKTxM%2F1misNmAKEsWRkM1A1ixiS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;540&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;후기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 GDSC DJU의 1기는 7월 31일부로 종료되었지만 늦게나마 수료후기를...ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음... GDSC에 참여하고 개발의 방향이 바뀐 것 같다. 원래는 게임개발을 위한 유니티를 공부했었고, 개발하는 사람들을 만나고 싶어서 지원했었다. 1기에서는 웹 프론트앤드, 백엔드와 안드로이드 분야가 있었다. 게임개발 분야는 없었기에 저들 중 하나를 택해야했는데 처음에는 유니티에서 사용하던 C#과 매우 유사한 JAVA를 배워보고자 백앤드에 관심이 있었다. 그런데 안드로이드 코어분의 일대기와 코틀린이라는 언어의 설명을 듣고 나는 안드로이드다!라며 안드로이드를 택했다. 우선 코틀린이라는 언어가 정말 매력적으로 다가왔다!&amp;nbsp;&lt;br /&gt;이때 안드로이드, 코틀린을 공부하기로 마음을 먹고 지금까지 이 둘을 공부하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GDSC는 굉장히 자유로운 분위기였다. 물론 자유로워서 장단점이 있었던 것 같다.&amp;nbsp;&lt;br /&gt;1기에서는 코틀린 자율 스터디를 진행하였는데 사실 자유롭다보니 나는 조금 나태해졌던 것 같다. 그래도 질문(?)은 정말 열심히 했었다. 질문을 올려주시면 다들 정말 답변을 잘해주셔서 ㅎㅎ... 그리고 질문을 잘 올린다고(?) 칭찬도 좀 받았다. 질문을 잘 올린다는게 자주 올린다는 것이 아니라(자주 올리기도함) 막무가내로 이게 안되는데요?? 이런식의 질문이 아닌.. 내가 무엇을 하기위해서 무엇을 해봤고 해당 과정에서 왜 오류가 나는지 모르겠다.. 이런식으로 조금 디테일하게 질문을 했었다. 그래서 1기의 베스트 멤버중 한명으로 선별이 되었다? 영광이다!! 베스트 멤버로 뽑힌 후 조금 더 열정이 생겼다..ㅎㅎ&lt;br /&gt;2기는 운영진분들의 굉장한 회의 끝에 2주마다 진행하는 정기세션 + 2주간 배웠던 것을 정리하는 2WIL이 필참으로 바뀌었다! 이부분은 정말 좋다! 나도 처음에는 정기세션을 꼬박 참여하다가... 필수가 아니라는 것을 알게된 후 거의 참여를 안했던 것 같다... 어느정도의 강제성은 있어야한다구 생각한다. 또한 1기에서는 스터디 혹은 프로젝트중 하나이상은 필수였지만 2기부터는 스터디는 자율로 바뀌고 모든 멤버가 간단한 프로젝트에 참여하는 방식으로 진행된다고 한다. 이부분도 너무 좋다! 다른 포지션과 협업해볼 수 있는 아주 좋은 기회라고 생각한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 두서없이 글을 주저리 주저리 써놨는데&amp;nbsp;&lt;br /&gt;결론은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1기는 열심히 참여했다고 볼 수 없다... 그럼에도 불구하고 베스트 멤버로 뽑아주신 운영진분들 너무 감사하구...&lt;br /&gt;&lt;/span&gt;2기부터는 조금 더 적극적으로 참여하겠습니다!!!&lt;/blockquote&gt;</description>
      <category>리뷰[Review]</category>
      <category>GDSC</category>
      <category>retrospect</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/260</guid>
      <comments>https://soopeach.tistory.com/260#entry260comment</comments>
      <pubDate>Sun, 14 Aug 2022 18:30:02 +0900</pubDate>
    </item>
    <item>
      <title>부스트캠프 웹・모바일 7기 챌린지 수료후기</title>
      <link>https://soopeach.tistory.com/259</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EdRig/btrJEK7eE4Z/1CaE2mauucOPnDXHHB3t50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EdRig/btrJEK7eE4Z/1CaE2mauucOPnDXHHB3t50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EdRig/btrJEK7eE4Z/1CaE2mauucOPnDXHHB3t50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEdRig%2FbtrJEK7eE4Z%2F1CaE2mauucOPnDXHHB3t50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;250&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월 12일 부스트캠프 웹・모바일 7기의 챌린지가 종료되었다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Android_7기챌린지수료식_내준내상.jpg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oc6ky/btrJKs5wKL3/mCaOzsbIEtwg5hd41Ee8GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oc6ky/btrJKs5wKL3/mCaOzsbIEtwg5hd41Ee8GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oc6ky/btrJKs5wKL3/mCaOzsbIEtwg5hd41Ee8GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOc6ky%2FbtrJKs5wKL3%2FmCaOzsbIEtwg5hd41Ee8GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;540&quot; data-filename=&quot;Android_7기챌린지수료식_내준내상.jpg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤헤... 스스로에게 이러한 상도 주었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수료증&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_부스트캠프 챌린지.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJWwH/btrJUZjw5QB/gmfdKO6iNjgr62ZmKimwqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJWwH/btrJUZjw5QB/gmfdKO6iNjgr62ZmKimwqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJWwH/btrJUZjw5QB/gmfdKO6iNjgr62ZmKimwqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJWwH%2FbtrJUZjw5QB%2FgmfdKO6iNjgr62ZmKimwqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;840&quot; data-filename=&quot;edited_부스트캠프 챌린지.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;후기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챌린지 과정은 4주간 진행되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음... 정말 너무 힘들었다. 눈을 감았다 뜨니 한달이 지나있었다. 대부분의 캠퍼분들도 비슷하게 말씀하셨지만 진짜 이렇게 몰입해서 무언가를 해본적이 처음이라서 기억에 정말 많이 남고 큰 도움이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챌린지 과정은 CS지식을 공부하는 과정인데, 나는 전공생이지만 2학년 1학기까지만 진행한 상태라 CS지식이 전무했다. 또한 CS는 그냥 알면 좋고 몰라도 큰 문제가 없는 분야라고만 생각했다. 하지만... 굉장히 잘못된 생각이었다. CS지식은 정말 꼭 필요한 분야이고 기본이라고 생각한다. CS를 아예 몰랐을 때의 시야와 CS지식을 조금이라도 알게된 현재의 시야는 정말 큰 차이가 있는 것 같다!&lt;br /&gt;그렇기에 이 챌린지 과정은 나에게 정말 쉽지 않았다. 종종 미션 자체를 이해하지 못했던 경우도 있었고 멤버쉽에 가고 싶다는 강박에 학습이 아닌 미션 해결에 급급했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠을 조금만자서 육체적으로도 힘들었지만 나는 정신적으로 정말 힘들었다. 자괴감이 정말 많이 들었다. 다른 캠퍼분들은 미션해결도 하시고 코드도 깔끔하게 짜오시는데 나는 깔끔한 코드는 커녕 미션을 완벽히 해결하지 못한적이 부지기수였다. 스스로의 실력에 대해서도 정말 실망을 하였고 팀원분들에게 민폐를 끼치는 것이 아닐까 라는 생각에 정말 힘들었다. 물론 못했다고 막 뭐라고 하시거나 그런 캠퍼분들은 없었다. 다들 정말 좋은 분들이셔서...! 거기에 멤버쉽을 꼭 가야만 한다는 생각이 나를 갈아먹었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1주차에는 정말 미션해결이 최우선이라고 생각을 했었고 2,3주차에는 점점 스스로와 타협을 했다. 미션해결 자체보다는 미션의 의도를 파악하고 해당 부분을 고민하며 공부하는 식으로 진행했다. 미션해결 + 멤버쉽에 대한 강박이 점점 사라지니 마음이 조금 편해졌다.&lt;br /&gt;정신적으로 정말 쉽지 않은 2-3주차를 보내고 나니 스스로를 인정(?)하게 되었다. 나는 열정만 가지고 있었지만 다른 캠퍼분들은 실력도 갖추시고 열정까지 가지고 계셨으니... 물론 멤버쉽을 순수 실력을 기준으로 뽑는 것은 아닌 것 같다. 명확한 기준이 정해져있지 않아서 더 힘들었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실한 것은 정말 성장을 했다는 것. 성장을 안할래야 안할수가 없었다. 보통 새벽 3-4시에 잠들고 아침 8시 30분 정도에 기상해서 밥먹는 시간을 빼고 하루종일 컴퓨터 앞에만 있었으니까... 위에서도 말했듯이 CS지식을 얻게된 후 사고, 시야 자체가 달라졌고 부캠을 하면서 배웠던 것을 다음 미션을 수행하며 사용하고 있는 나를 보았을 때 신기하기도 했고 뿌듯하기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버쉽에 가면 정말 정말 너무너무 좋겠지만!! 멤버쉽이 아닌 챌린지 과정에서도 정말 얻은 것이 많아서 멤버쉽을 가지 못한다면 실패한 것이라는 생각은 사라졌다! 특히 부캠 챌린지를 수료하기 전/후로 나의 개발 인생이 바뀐 것 같다. 그동안 해왔던 것은 뭘까...ㅎㅎ&lt;br /&gt;정말 너무너무 좋은 기회였다. 좋은 캠퍼분들과 소통도 할 수 있었고 많이 배울 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;챌린지를 진행할 사람에게 해드리고 싶은 말&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 챌린지를 진행하실 분들에게 해드리고 싶은 말이다. 한달 전의 나에게도..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 나만 힘들고 어려운게 아니니까 자괴감을 가질 필요는 없습니다. 저를 포함한 다른 캠퍼분들도 자괴감을 느꼈다고 하는데... 자괴감을 느낀다고 달라지는게 없더라구요. 배우려고 부스트캠프에 간거니까요! 물론 남이 이렇게 말해준다고해서 크게 달라질 것은 없지만...(저도 이런 글들을 많이 봤지만 멘탈 케어가 잘 안되더라구요). &lt;br /&gt;밤 늦게까지 공부하는 것은 좋지만 다음 날에 지장이 가지않도록 해야합니다! 저는 새벽이 되면 정신이 혼미해져서 이상한 코드를 치고있을 때, 내가 방금 뭘하려고 했는지 까먹었을 때 바로 침대로 다이빙했습니다(보통 3시 정도부터 이러더라구요). 따라서 다음 날 지장이 갈 정도로 아예 무리를 한적은 없었던 것 같아요. 끝까지 붙잡고 늘어져있는 자세도 좋지만 챌린지는 약 한달의 과정으로 굉장히 길기 때문에 페이스 조절을 잘하셔야합니다.&amp;nbsp;&lt;br /&gt;미션 해결도 좋지만 학습 정리가 정말 중요할 것 같습니다. 초반에는 미션 해결에 급급해서 제대로된 정리를 하지 못했는데.. 남는 것은 학습 정리더라구요. 미션은 무엇을 학습할 것인지에 대한 길이라고 생각하시면 될 것 같습니다. + 학습 정리를 정말 깔끔하게 하시는 캠퍼분들의 것들을 참고해도 좋은 것 같아요!&lt;br /&gt;무작정 구현을 하지말고 설계를 잘 해야합니다. 이것은 그냥 개발을 한다면 꼭 필요한 부분같아요. 알고리즘을 공부할 때도 저는 문제 이해가 안가면 무작정 구현을 했었는데 그랬다가 아예 코드를 뒤엎었던 적이 많았거든요! 미션을 수행하면서도 그랬구요.. 물론 아직도 저는 설계를 잘하고 구현을 하지는 않습니다... 당장은 미숙하더라도 의식하면서 설계를 먼저하려고 합니다. 확실히 설계를 잘 해놓으면 구현은 금방 금방 되더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챌린지가 정말 쉬운 과정이 아닌 것 같습니다... 특히 CS지식이 없다면 정말 힘들거에요...! 그래도 4주를 버텨내면 정말 성장하고, 새로워진 나를 마주할 수 있을겁니다! 화이팅!&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>부스트캠프</category>
      <category>부스트캠프 웹・모바일 7기</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/259</guid>
      <comments>https://soopeach.tistory.com/259#entry259comment</comments>
      <pubDate>Sun, 14 Aug 2022 18:03:11 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-08-01 until 2022-08-07</title>
      <link>https://soopeach.tistory.com/258</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-10 at 12.56.31 AM.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxOaY/btrJik9VbK7/yf6hrr5TKdQFDF2kLPQc6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxOaY/btrJik9VbK7/yf6hrr5TKdQFDF2kLPQc6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxOaY/btrJik9VbK7/yf6hrr5TKdQFDF2kLPQc6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxOaY%2FbtrJik9VbK7%2Fyf6hrr5TKdQFDF2kLPQc6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;777&quot; data-filename=&quot;Screen Shot 2022-08-10 at 12.56.31 AM.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주도... 정신이 없어서 수요일에 올리게된다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대충 52시간 정도 나왔는데... 금토일은 월화수목에 대비해서 상대적으로 코딩시간은 좀 적은 편이라 월화수목이 거의 하루에 10-11시간이고 나머지가 금,토,일에 나누어져있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;악명 높은 부스트 캠프 3주차가 끝났다... 제대로 소화하지 못한 부분이 꽤나 있는 것 같아 부캠이 끝나면 약간의 휴식기를 가진 후 처음부터 다시 해볼 예정이다~! 뭔가 블로그에 글을 써야겠다는 강박을 가지고 개념 정리를 하니까 정말 비효율적이었던 것 같다.. 그래서 우선은 그냥 나 혼자라도 알아볼 수 있게 빠르게 개념 정리를 하고 그것을 재가공하여 블로그에 작성하는게 좋지 않을까 생각이 든다... 이번 주 금요일에 네이버 부스트 캠프 웹모바일 7기 챌린지 수료식이 진행된다..! 끝나지 않을 것만 같았던 챌린지가 이렇게 끝난다니 시원섭섭하다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 너무 좋은 시간이었고 너무 너무 힘들었다... 나는 정신적으로 정말 힘들었던 것 같다ㅜㅜ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쨋든... 담주에 뿅&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/258</guid>
      <comments>https://soopeach.tistory.com/258#entry258comment</comments>
      <pubDate>Wed, 10 Aug 2022 01:01:23 +0900</pubDate>
    </item>
    <item>
      <title>BufferedReader &amp;amp; BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바</title>
      <link>https://soopeach.tistory.com/257</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;BufferedReader / BufferedWriter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bufferedReader, bufferedWriter는 이름에서 확인할 수 있듯이 버퍼를 이용하여 읽고 쓰는 역할을 하는 메서드입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;버퍼란?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바의 Scanner와 BufferedReader의 차이점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scanner는 띄어쓰기(스페이스)와 줄바꿈(엔터, 개행문자)를 경계로 값을 인식&lt;/li&gt;
&lt;li&gt;BufferedReader는 줄바꿈(엔터, 개행문자)만 경계로 인식 + 데이터의 타입이 무조건 String으로 고정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼를 사용하지 않는 입력(Scanner)는 키보드의 입력이 키를 누르는 즉시 바로 프로그램에게 전달이 되지만,&amp;nbsp;&lt;br /&gt;버퍼를 사용하는 입력(BufferedReader)는 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한 후, 버퍼가 가득 차거나 줄 바꿈(\n)이 나타나면 버퍼에 쌓인 내용을 한 번에 프로그램에 전송해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 버퍼를 사용하지 않는 입력은 키보드의 입력이 되는 즉시 프로그램에 보내지고, 버퍼를 사용하는 입력은 버퍼에 저장되었다가 한 번에 보내면 더 비효율인 것처럼 생각될 수 있다. 하지만 데이터의 입출력은 자원이 많이드는 작업이기 때문에 하나씩 바로바로 보내주는 것보다 모아서 한번에 보내주는 것이 더 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들면, 무거운 상자들을 먼 거리로 옮겨야하는 상황일 때 버퍼는 사용하지 않는 입력은 상자를 하나씩 옮기는 것이고 버퍼를 사용하는 입력은 엘카(물건들을 적재한 후 한 번에 옮기게 해주는 도구)에 물건들을 쌓고 한 번에 옮기는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특징으로 빠른 입/출력이 가능한 BufferedReader, BufferedWriter는 자바 / 코틀린으로 입출력을 다뤄야하는 알고리즘 문제를 풀때 입출력 시간을 단축시키기위하여 사용하는 모습을 자주 볼 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BufferedReader 사용하기&lt;/h2&gt;
&lt;pre id=&quot;code_1659785693769&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader
import java.io.File
import java.io.FileReader

fun main() {

    // 예외 처리하기
    try {
        // 콘솔로 입력을 받을 때
//    val br = BufferedReader(InputStreamReader(System.`in`))

        // 파일 경로 설정
        val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;
        // 파일 객체 생성
        val file = File(path, &quot;test.txt&quot;)
        // 파일에서 입력을 받을 때(파일 읽기)
        val br = BufferedReader(FileReader(file))

        // 파일의 끝까지 한 줄씩 반복해서 출력(String)
        while (true) {
            // 무조건 string으로 반환, 다른 데이터 타입은 형변환이 필요함.
            val line = br.readLine() ?: break
            println(line)
        }

        br.close()
    } catch (e: Exception) {
        println(&quot;$e 에러 발생&quot;)
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 현재 디렉터리 + /src/main/kotlin에 있는 test.txt라는 이름을 가진 파일을 읽어온 후 한 줄씩 출력해주는 코드입니다.&lt;br /&gt;try catch 구문을 사용하여 예외처리를 해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔로 직접 입력을 받을 때에는 맨 위에 주석처리된 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;val br = BufferedReader(InputStreamReader(System.`in`))&lt;/span&gt;&amp;nbsp;와 같이 사용하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659785905126&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 파일의 끝까지 한 줄씩 반복해서 출력(String)
while (true){
    // 무조건 string으로 반환, 다른 데이터 타입은 형변환이 필요함.
    val line = br.readLine() ?: break
    println(line)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;br.readLine()을 통해 해당 파일의 내용을 한줄씩 반복해서 읽고, 출력하는 부분입니다. BufferedReader는 '\n' 즉, 줄바꿈을 기준으로 문자열을 나누기 때문에 만약 공백, 혹은 특정 문자를 기준으로 문자열을 더 나누고 싶다면 split함수 혹은 StringTokenizer를 사용하여 문자열을 더 나눠줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BufferedReader 클래스의 또 다른 메인 함수들&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;close() - void 반환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력스트림을 종료하고 사용하던 자원들을 방출하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mark(int readAheadLimit)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- void 반환&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 현재 위치를 마킹하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;markSupported()&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- boolean 반환&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림이 mark 기능을 지원하는지 true/false 여부로 알려주는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;read()&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- int 반환&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 글자만 읽은 후 아스키 코드를 정수형으로 반환해주는 메서드&lt;/li&gt;
&lt;li&gt;ex) 1을 읽었다면 49라는 정수를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;read(char[] cbuf, int offset, int length)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- int 반환&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cbug의 offset 위치부터 length 길이만큼 문자를 스트림으로부터 읽어오는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;readLine()&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- String 반환&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄을 읽은 후 해당 문자열을 String으로 반환하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ready() - boolean 반환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력스트림이 사용할 준비가 되어있는지 확인해주는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;reset() - void 반환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마킹이 있다면 그 위치부터 다시 시작, 그렇지 않으면 처음부터 다시 시작하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;skip(long n) - long 반환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n개의 문자를 건너뛰는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; BufferedWriter 사용하기&lt;/h2&gt;
&lt;pre id=&quot;code_1659787801079&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*

fun main() {

    // 콘솔에서 BufferedReader로 입력 받기
    val br = BufferedReader(InputStreamReader(System.`in`))
    // 입력받은 데이터에서 한줄만 input에 String으로 저장
    val input = br.readLine()

    // BufferedWriter 객체 생성
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    // input을 저장 쓰기
    bw.write(input)
    // 개행문자 쓰기
    bw.newLine()
    // 문자열이라는 문자열을 쓰기
    bw.write(&quot;문자열&quot;)
    // 버퍼에 남아있는 데이터들을 출력 후 비우기 - 콭솔에 출력
    bw.flush()
    // 스트림 종료
    bw.close()

    // 여기부터는 파일 쓰기
    // 파일을 생성할 경로 지정
    val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;
    // 파일의 경로, 생성할 파일의 이름을 가지는 File 객체 생성
    val file = File(path, &quot;test.txt&quot;)
    // FileWriter 객체 생성
    val fileWriter = FileWriter(file)
    // 생성할 파일, 경로의 정보가 담긴 FileWriter를 가지는 파일 생성용 BufferedWriter 객체 생성
    val bwForFile = BufferedWriter(fileWriter)

    // input을 쓰기
    bwForFile.write(input)
    // 개행문자 쓰기
    bwForFile.newLine()
    // 문자열이라는 문자열을 쓰기
    bwForFile.write(&quot;문자열&quot;)
    // 버퍼에 남은 값 출력 및 비우기
    bwForFile.flush()
    // 스트림 종료
    bwForFile.close()


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 두 가지의 BufferedWriter의 기능이 담겨있습니다.&lt;br /&gt;첫 번째는 콘솔에서 BufferedReader로 입력받아 BufferedWriter로 콘솔창에 출력하는 것이고&lt;br /&gt;두 번째는 BufferedWriter로 파일쓰기를 하는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659788189236&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// input을 쓰기
bw.write(input)
// 개행문자 쓰기
bw.newLine()
// 문자열이라는 문자열을 쓰기
bw.write(&quot;문자열&quot;)
// 버퍼에 남아있는 데이터들을 출력 후 비우기 - 콭솔에 출력
bw.flush()
// 스트림 종료
bw.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write()는 인자로 들어온 문자열을 버퍼에 저장하는 메서드이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;newLine()은 개행 문자를 버퍼에 저장하는 메서드 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flush()는 버퍼에 남아있는 데이터들을 출력하고 비워줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659788361022&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 여기부터는 파일 쓰기
// 파일을 생성할 경로 지정
val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;
// 파일의 경로, 생성할 파일의 이름을 가지는 File 객체 생성
val file = File(path, &quot;test.txt&quot;)
// FileWriter 객체 생성
val fileWriter = FileWriter(file)
// 생성할 파일, 경로의 정보가 담긴 FileWriter를 가지는 파일 생성용 BufferedWriter 객체 생성
val bwForFile = BufferedWriter(fileWriter)

// input을 쓰기
bwForFile.write(input)
// 개행문자 쓰기
bwForFile.newLine()
// 문자열이라는 문자열을 쓰기
bwForFile.write(&quot;문자열&quot;)
// 버퍼에 남은 값 출력 및 비우기
bwForFile.flush()
// 스트림 종료
bwForFile.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 쓰기를 진행할 파일명, 경로의 정보를 가지는 FileWriter 객체를 BufferedWriter에게 넘겨주어 해당 경로에 해당 파일명을 가지는 파일을 쓰도록 지정해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BufferedWriter 클래스의 또 다른 메인 함수들&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flush()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림을 비워주는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;close()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림을 닫는 메서드. flush()를 먼저 해야함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;newLine()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개행문자를 쓰는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write(char[] cbuf, int offset, int length)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버퍼 offset 위치부터 length 크기만큼 쓰는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write(int c)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 글자를 쓰는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write(String s, int offset, int length)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열에서 offset부터 일정 길이만큼 쓰는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;참고&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://doozi316.github.io/java/2021/03/22/JAVA1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://doozi316.github.io/java/2021/03/22/JAVA1/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jhnyang.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jhnyang.tistory.com/92&lt;/a&gt;&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>BufferedReader</category>
      <category>BufferedWriter</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/257</guid>
      <comments>https://soopeach.tistory.com/257#entry257comment</comments>
      <pubDate>Sat, 6 Aug 2022 21:29:22 +0900</pubDate>
    </item>
    <item>
      <title>입력 스트림과 출력 스트림(InputStream &amp;amp; OutputStream) / FileInputStream &amp;amp; FileOutputStream과 FileReader &amp;amp; FileWriter의 차이</title>
      <link>https://soopeach.tistory.com/256</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stream 이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 데이터를 외부에서 읽고, 외부로 출력하는 작업을 많이 합니다.&lt;br /&gt;자바 / 코틀린 에서는 스트림(Stream)을 통하여 데이터가 입출력됩니다.&lt;br /&gt;Stream의 사전적 의미로는 줄줄 흐르다, 줄줄이 이어지다 등의 뜻이 있는데, 이는 스트림이 단일 뱡향으로 연속적으로 흘러간다는 것을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 데이터를 입력받을 땐 입력스트림(InputStream)이라고 부르고&lt;br /&gt;프로그램이 데이터를 출력할 땐 출력스트림(OutputStream)이라고 부릅니다.&lt;br /&gt;즉, 프로그램을 기준으로 데이터가 들어오면 입력스트림, 데이터가 나가면 출력스트림입니다.&lt;br /&gt;입력 스트림의 출발지는 키보드, 파일, 네트워크상의 프로그램등이 될 수 있고,&lt;br /&gt;출력 스트림의 도착지는 모니터, 파일, 네트워크상의 프로그램등이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 프로그램이 네트워크 상의 다른 프로그램과 데이터를 교환하기 위해서는 두 프로그램 모두 입/출력 스트림이 각각 필요합니다.&lt;br /&gt;이는 스트림이 단방향 통신이라는 특성을 가져 하나의 스트림으로 입/출력을 동시에 할 수 없기 때문입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Java.io 패키지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java.io패키지는 파일 시스템의 정보를 얻기 위한 File 클래스와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스를 제공해줍니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 240px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;Java.io 패키지의 클래스&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;File&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;파일 시스템의 파일 정보를 얻기 위한 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;Console&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;콘솔로부터 문자를 입출력하기 위한 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;InputStream / Outputstream&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;FileInputStream / FileOutputStream&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot; rowspan=&quot;5&quot;&gt;바이트 단위 입출력을 위한 하위 스트림 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;DataInputStream / DataOutputStream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;ObjectInputStream / ObjectOutputStream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;PrintStream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;BufferedInputStream / &lt;span&gt;BufferedOutputStream&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;Reader / Writer&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;문자 단위 입출력을 위한 최상위 입출력 스트림 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;FileReader / FileWriter&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot; rowspan=&quot;4&quot;&gt;문자 단위 입출력을 위한 하위 스트림 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;InputStreamReader / OutputStreamWriter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;printWriter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;BufferedReader / BufferedWriter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이트 단위 입출력 스트림&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그림, 멀티미디어, 문자등 모든 종류의 데이터들을 주고받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자 단위 입출력 스트림&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오로지 문자만 주고받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;InputStream&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InputStream은 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스입니다.&lt;br /&gt;딸라서 모든 바이트 기반 입력 스트림은 이 클래스를 상속받습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InputStream
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FileInputStream&lt;/li&gt;
&lt;li&gt;BufferedInputStream&lt;/li&gt;
&lt;li&gt;DataInputStream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;InputStream 클래스는 바이트 기반 입력 스트림들이 반드시 가져야할 메서드등이 정의되어 있습니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;read()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 반환하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;read(byte[] b)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 반환하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;read(byte[] b, int off, int len)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 바이트 배열b[off]로부터 len개까지 저장하고 실제로 읽은 바이트 수인 len을 반환, 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수를 반환하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;close()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용한 시스템 자원을 반납하고 입력스트림을 종료하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OutputStream&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 OutputStream은 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속받습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OutputStream
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FileOutputStream&lt;/li&gt;
&lt;li&gt;PrintStream&lt;/li&gt;
&lt;li&gt;BufferedOutputStream&lt;/li&gt;
&lt;li&gt;DataOutputStream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OutputStream 클래스는 바이트 기반 출력 스트림들이 반드시 가져야할 메서드등이 정의되어 있습니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;write(int b)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력 스트림으로부터 1바이트를 보내는 메서드(b의 끝 1 바이트)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write(byte[] b)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력 스트림으로부터 주어진 바이트 배열 b의 모든 바이트를 보내는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write(byte[] b, int off, int len)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력 스트림으로부터 주어진 바이트 배열b[off]부터 len개의 바이트를 보내는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;flush()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버퍼에 남아있는 모든 바이트를 출력하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;close()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용한 시스템 자원을 반납하고 출력 스트림을 종료하는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FileInputStream &amp;amp; FileOutputStream 와 FileReader &amp;amp; FileWriter 의 차이&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;FileInputStream &amp;amp; FileOutputStream&lt;/span&gt;은 InputStrem &amp;amp; OutputStream을 상속받고 있음. &lt;br /&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;FileReader &amp;amp; FileWriter&lt;/span&gt;는 Reader와 Writer를 상속받고 있음.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;FileInputStream &amp;amp; FileOutputStream&lt;/span&gt;은 byte 단위의 입출력을 처리. &lt;br /&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;FileReader &amp;amp; FileWriter&lt;/span&gt;는 바이트를 문자(Char)로 변환하여 입출력을 처리.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;FileInputStream &amp;amp; FileOutputStream&lt;/span&gt;은 1바이트 이상의 문자인 한글등을 처리하기 위해 버퍼를 사용해서 처리해야함. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;FileReader &amp;amp; FileWriter&lt;/span&gt;는 한글도 처리가 가능.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;FileInputStrem &amp;amp; FileOutputStream&lt;/span&gt;은 사진을 주고 받을 때 주로 사용. &lt;br /&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;FileReader &amp;amp; FileWriter&lt;/span&gt;는 txt를 주고 받을 때 많이 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/281&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-factory.tistory.com/281&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=baeusa1&amp;amp;logNo=221455691288&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>inputStream</category>
      <category>java</category>
      <category>kotlin</category>
      <category>outputStream</category>
      <category>스트림</category>
      <category>자바</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/256</guid>
      <comments>https://soopeach.tistory.com/256#entry256comment</comments>
      <pubDate>Sat, 6 Aug 2022 19:40:48 +0900</pubDate>
    </item>
    <item>
      <title>코틀린에서 디렉터리 생성, 문자 기반의 파일(텍스트 파일) 생성 및 읽기 - 파일 입출력(FileWriter / FileReader)</title>
      <link>https://soopeach.tistory.com/255</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바 / 코틀린에서는 File이라는 클래스를 이용하여 파일 및 디렉터리를 다룰 수 있습니다.&lt;br /&gt;따라서 File 객체는 파일일 수도 디렉터리일 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 File 클래스의 생성자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;File(String parent, String Child)&lt;/b&gt; - parent 폴더 경로의 child라는 파일에 대한 File 객체를 생성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) File(path, fileName)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;File(String pathname)&lt;/b&gt; - pathname에 해당되는 파일의 File 객체를 생성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) File(path)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시로 진행할 프로젝트의 디렉터리 구성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-06 at 3.24.42 PM.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;1508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/80iHx/btrIY1wiuPT/uAq5ZGUbWA25vY8voILv70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/80iHx/btrIY1wiuPT/uAq5ZGUbWA25vY8voILv70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/80iHx/btrIY1wiuPT/uAq5ZGUbWA25vY8voILv70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F80iHx%2FbtrIY1wiuPT%2FuAq5ZGUbWA25vY8voILv70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;1508&quot; data-filename=&quot;Screen Shot 2022-08-06 at 3.24.42 PM.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;1508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 디렉터리 확인하기&lt;/h2&gt;
&lt;pre id=&quot;code_1659766686568&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.getProperty(&amp;rdquo;user.dir&amp;rdquo;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 사용하여 현재 디렉터리를 확인할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;맥 / Intelli J 기준 현재 디렉터리&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-06 at 3.20.24 PM.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQVawX/btrI20imyXx/8KYk8lYttCTqtF5nPkzG8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQVawX/btrI20imyXx/8KYk8lYttCTqtF5nPkzG8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQVawX/btrI20imyXx/8KYk8lYttCTqtF5nPkzG8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQVawX%2FbtrI20imyXx%2F8KYk8lYttCTqtF5nPkzG8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;990&quot; height=&quot;444&quot; data-filename=&quot;Screen Shot 2022-08-06 at 3.20.24 PM.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트명이 boostCamp라서 boostCamp까지 표기된 모습을 확인할 수 있습니다.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 결과&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659767255060&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/Users/hyunsoo/IdeaProjects/boostCamp&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디렉터리 생성하기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659767545578&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.File

fun main() {

    val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;

    println(&quot;생성할 디렉터리명을 입력해주세요!&quot;)
    val dirName = readln()

    val dir = File(path, &quot;$dirName&quot;) // else File(&quot;$path/$dirName&quot;)
    // 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성 
    if (!dir.exists()) dir.mkdir()
    else println(&quot;이미 해당 디렉터리가 존재합니다.&quot;)

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 디렉터리명을 입력받고 현재 디렉터리 + /src/main/kotlin 경로에 입력받은 문자열을 디렉터리의 이름으로 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659768166012&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 path 변수에 경로를 지정해주고&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659768196695&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;println(&quot;생성할 디렉터리명을 입력해주세요!&quot;)
val dirName = readln()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성할 디렉터리의 이름을 지정해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659768227670&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val dir = File(path, &quot;$dirName&quot;) // 이렿게도 가능 File(&quot;$path/$dirName&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉터리 경로 + 생성할 디렉터리 이름으로 File 객체를 생성해줍니다.&amp;nbsp;&lt;br /&gt;File클래스의 첫 번째 인자는 경로, 두 번째 인자는 생성할 디렉터리의 이름입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659768270736&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성
if (!dir.exists()) dir.mkdir()
else println(&quot;이미 해당 디렉터리가 존재합니다.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File 클래스의 exists 함수를 사용하여 해당 경로에 생성할 디렉터리와 이름이 동일한 디렉터리가 존재하는지 확인합니다.&lt;br /&gt;만약 존재하지 않는다면 mkdir()를 사용하여 해당 경로에 디렉터리를 생성하고 만약 존재한다면 디렉터리를 생성하지 않고 콘솔창에 경고문을 출력합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 모습&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;direc.gif&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTUow4/btrI3uwM0vG/bLXg7YsVoWW4YLLbxbyUx1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTUow4/btrI3uwM0vG/bLXg7YsVoWW4YLLbxbyUx1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTUow4/btrI3uwM0vG/bLXg7YsVoWW4YLLbxbyUx1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cTUow4/btrI3uwM0vG/bLXg7YsVoWW4YLLbxbyUx1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;596&quot; data-filename=&quot;direc.gif&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 soo라는 디렉터리를 처음 생성할 때에는 디렉터리가 잘 생성되는 것을 볼 수 있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 이미 해당 디렉터리가 존재하는 상황에서는 콘솔창에 경고문이 출력됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일 생성하기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659769374464&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter

fun main() {

    // 현재 디렉터리의 정보를 가져온 후 프로젝트의 구조에 맞게 경로를 설정
    val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;

    println(&quot;생성할 디렉터리명을 입력해주세요!&quot;)
    val dirName = readln()

    val dir = File(path, &quot;$dirName&quot;) // else File(&quot;$path/$dirName&quot;)
    // 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성
    if (!dir.exists()) dir.mkdir()
    else println(&quot;이미 해당 디렉터리가 존재합니다.&quot;)

    val content = &quot;&quot;&quot;
            fun main(){
            println(&quot;테스트&quot;)
            }
        &quot;&quot;&quot;.trimIndent()

    println(&quot;파일명을 입력해주세요!&quot;)
    val fileName = readln()
    val file = File(&quot;$path/$dirName&quot;, &quot;$fileName.kt&quot;)

    val fileWriter = FileWriter(file)
    fileWriter.write(content)
    fileWriter.close()

//    val bw = BufferedWriter(fileWriter)
//    bw.write(content)
//    bw.close()

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 디렉터리명과 파일명을 입력받아서 해당 디렉터리를 생성한 후 그 디렉터리 안에 해당 파일을 생성하는 코드입니다.&lt;br /&gt;디렉터리 생성 부분은 위와 동일합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659770190374&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val content = &quot;&quot;&quot;
    fun main(){
    println(&quot;테스트&quot;)
    }
&quot;&quot;&quot;.trimIndent()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성할 텍스트 파일의 내용으로 들어갈 문자열입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659770213060&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;println(&quot;파일명을 입력해주세요!&quot;)
val fileName = readln()
val file = File(&quot;$path/$dirName&quot;, &quot;$fileName.kt&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 인자로는 해당 파일을 생성할 경로를 두 번재 인자로는 생성할 파일의 이름을 지정한 File 객체를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659770557713&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val fileWriter = FileWriter(file)
fileWriter.write(content)
fileWriter.close()

//    val bw = BufferedWriter(fileWriter)
//    bw.write(content)
//    bw.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 텍스트 기반의 파일을 생성할 것이므로 방금 생성한 File 객체를 FileWriter에게 넘겨 Filewriter 객체를 생성해준 후 content의 내용으로 해당 파일을 write합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BufferedWriter 객체를 생성 후 fileWriter을 넘겨주고 BufferedWriter에서 파일을 쓰면 속도가 조금 더 향상됩니다!&lt;br /&gt;만약 동일한 디렉터리에 동일한 파일명을 가진 파일이 이미 존재한다면 내용을 덮어쓰게 됩니다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 모습&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;file.gif&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IBIO6/btrI2YdPOZe/GfxbaWGNfvrFspE5jngME1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IBIO6/btrI2YdPOZe/GfxbaWGNfvrFspE5jngME1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IBIO6/btrI2YdPOZe/GfxbaWGNfvrFspE5jngME1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/IBIO6/btrI2YdPOZe/GfxbaWGNfvrFspE5jngME1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;642&quot; data-filename=&quot;file.gif&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일 읽기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659773537447&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.File
import java.io.FileReader
import java.io.FileWriter

fun main() {

    // 현재 디렉터리의 정보를 가져온 후 프로젝트의 구조에 맞게 경로를 설정
    val path = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/kotlin&quot;
    
    val fileName = &quot;peach.kt&quot;

    val file = File(&quot;$path/soo&quot;, &quot;$fileName&quot;)
    val fileReader = FileReader(file)

    fileReader.readLines().forEach {
        println(it)
    }

//    val br = BufferedReader(fileReader)
//    while (true){
//        val line = br.readLine() ?: break
//        println(line)
//    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 위에서 생성한 soo 디렉터리 내의 peach.kt 파일을 읽기위한 코드 입니다..!&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659773700528&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val file = File(&quot;$path/soo&quot;, &quot;$fileName&quot;)
val fileReader = FileReader(file)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉터리, 파일 이름에 해당하는 File 객체를 생성해주고 해당 객체를 FileReader에게 넘겨줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659773848371&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fileReader.readLines().forEach {
    println(it)
}

//    val br = BufferedReader(fileReader)
//    while (true){
//        val line = br.readLine() ?: break
//        println(line)
//    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 fileReader 객체의 readLines() 메서드를 이용하여 읽어들인 파일을 List&amp;lt;String&amp;gt; 형태로 반환받습니다.&lt;br /&gt;(줄 바꿈을 기준으로 하나의 String을 생성)&lt;br /&gt;해당 리스트를 forEach를 사용하여 순차적으로 출력하도록 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 처리된부분은 BufferedReader을 사용하여 파일을 읽어오는 모습입니다. fileReader보다 조금 더 속도가 빠르며, reaLine()으로 한 줄씩 읽는 모습을 확인할 수 있습니다. while(true)를 사용하여 반복적으로 한 줄씩 읽어온 후 해당 파일을 다 읽어오게 되었다면 break를 통해 반복문을 탈출하게 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작모습&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-06 at 5.19.51 PM.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqf1w2/btrI6qAGUoC/3gvOrGIkBRQloowfTvsI61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqf1w2/btrI6qAGUoC/3gvOrGIkBRQloowfTvsI61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqf1w2/btrI6qAGUoC/3gvOrGIkBRQloowfTvsI61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqf1w2%2FbtrI6qAGUoC%2F3gvOrGIkBRQloowfTvsI61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;980&quot; data-filename=&quot;Screen Shot 2022-08-06 at 5.19.51 PM.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추가로 읽으면 좋을 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BufferedReader &amp;amp; BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659796371836&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;BufferedReader &amp;amp; BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바&quot; data-og-description=&quot;BufferedReader / BufferedWriter bufferedReader, bufferedWriter는 이름에서 확인할 수 있듯이 버퍼를 이용하여 읽고 쓰는 역할을 하는 메서드입니다. 버퍼란? 버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하.&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/257&quot; data-og-url=&quot;https://soopeach.tistory.com/257&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1Rdo1/hyPkymuNnt/0vEAI1GYF3uNDjOz0rwQs1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/chIW5e/hyPmjVwl5l/zhXOBtCOajN5uDNwdpwSs0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yxCP0/hyPkK8iecW/6wUhrOaKZ5Q44xFVO94zA1/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/257&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1Rdo1/hyPkymuNnt/0vEAI1GYF3uNDjOz0rwQs1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/chIW5e/hyPmjVwl5l/zhXOBtCOajN5uDNwdpwSs0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yxCP0/hyPkK8iecW/6wUhrOaKZ5Q44xFVO94zA1/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;BufferedReader &amp;amp; BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;BufferedReader / BufferedWriter bufferedReader, bufferedWriter는 이름에서 확인할 수 있듯이 버퍼를 이용하여 읽고 쓰는 역할을 하는 메서드입니다. 버퍼란? 버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>kotlin</category>
      <category>코틀린</category>
      <category>파일입출력</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/255</guid>
      <comments>https://soopeach.tistory.com/255#entry255comment</comments>
      <pubDate>Sat, 6 Aug 2022 17:28:47 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-07-25 until 2022-07-31</title>
      <link>https://soopeach.tistory.com/254</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-08-02 at 10.38.16 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;1282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lX2ZP/btrIEYl3ftw/ODnLk6pkBY6HZpVYDPXky0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lX2ZP/btrIEYl3ftw/ODnLk6pkBY6HZpVYDPXky0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lX2ZP/btrIEYl3ftw/ODnLk6pkBY6HZpVYDPXky0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlX2ZP%2FbtrIEYl3ftw%2FODnLk6pkBY6HZpVYDPXky0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;1282&quot; data-filename=&quot;Screen Shot 2022-08-02 at 10.38.16 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음으로 월요일이 아니라 화요일에 올리게 되었다..! 그만큼 정신이 없으셨다는 거겠지!!!&lt;br /&gt;부스트 캠프 챌린지의 2주차가 막을 내렸다... 이번 주는 나름 개념 공부를 먼저하고 구현을 시작하는 방향으로 노력했던 것 같은데 생각보다 코딩 시간이 많이 나왔다?...&amp;nbsp;&lt;br /&gt;힘든데 정말 좋은 경험인 것 같다...!!! 이제 부스트 캠프 챌린지는 약 2주정도 남았는데 남은 2주도 화이팅~~&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/254</guid>
      <comments>https://soopeach.tistory.com/254#entry254comment</comments>
      <pubDate>Tue, 2 Aug 2022 10:41:27 +0900</pubDate>
    </item>
    <item>
      <title>코틀린에서 Thread 사용하기( + start()-스레드 시작, join()-스레드 대기상태로 만들기)</title>
      <link>https://soopeach.tistory.com/253</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;코틀린에서 스레드 생성 및 실행하기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 가지의 스레드 생성 방법이 모두 나와있는 전체 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659187039547&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 1번째 스레드 - Thread()를 상속받아 생성
    // testThread 생성
    val testTh = testThread()

    // 2번째 스레드 - Runnable을 구현하여 생성
    // Runnable 인터페이스를 구현한 testThreadWithRunnable 객체 생성
    val runnable = testThreadWithRunnable()
    // Thread의 인자로 runnable을 주어 스레드 생성.
    val testThWithRunnable = Thread(runnable)

    // 3번째 스레드 - thread() 함수를 이용하여 생성
    val simpleTh = thread(false) {
        println(&quot;this is simple thread ${Thread.currentThread().name}&quot;)
    }

    // name = 동작하고 있는 스레드의 이름을 출력 - 메인
    println(&quot;${Thread.currentThread().name}&quot;)

    // 첫 번째 스레드 실행.
    testTh.start()
    // 두 번째 스레드 실행.
    testThWithRunnable.start()
    // 세 번째 스레드 실행
    simpleTh.start()

}

// Thread를 상속받음
class testThread : Thread() {
    override fun run() {
        // name = 동작하고 있는 스레드의 이름을 출력
        println(&quot;this is testTh - ${name}&quot;)
    }
}

// Runnable 인터페이스를 구현
class testThreadWithRunnable : Runnable {
    override fun run() {
        // Thread를 상속받은 것이 아니라 Runnable을 구현한 것이기 때문에
        // 동작중인 스레드의 이름을 알기 위해선 Thread.currentThread().name 를 사용
        println(&quot;this is ThreadWithRunnableInterface - ${Thread.currentThread().name}&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;pre id=&quot;code_1659187063374&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;main
this is testTh - Thread-0
this is ThreadWithRunnableInterface - Thread-1
this is simple thread Thread-2&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;첫 번째 방법 - Thread 클래스를 상속받기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린에서 Thread를 생성하고 사용하기 위한 방법들 중 첫 번째 방법은 Thread 클래스를 상속받아 run() 메서드를 오버라이딩 하는 것입니다! run() 메서드를 오버라이딩하고 스레드에서 실행하기를 원하는 코드를 run()메서드에 작성하면 됩니다.&amp;nbsp;&lt;br /&gt;그 후 메인 함수에서 Thread클래스를 상속받은 클래스의 객체를 생성하고 start()를 사용하여 해당 객체를 스레드에서 동작하도록 만들 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 방법 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659187364548&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {

    // 1번째 스레드 - Thread()를 상속받아 생성
    // testThread 생성
    val testTh = testThread()

    // 스레드 실행.
    testTh.start()

}

// Thread를 상속받음
class testThread : Thread() {
    override fun run() {
        // name = 동작하고 있는 스레드의 이름을 출력
        repeat(5) {
            println(&quot;Count ${5 - it} - ${name}&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 소스 코드는 메인스레드가 아닌 별도의 스레드(Thread-0)에서 5 ~ 1 까지 카운트 다운을 진행합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;pre id=&quot;code_1659188187202&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Count 5 - Thread-0
Count 4 - Thread-0
Count 3 - Thread-0
Count 2 - Thread-0
Count 1 - Thread-0&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두 번째 방법 - Runnable 인터페이스 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린은 다중 상속을 허용하지 않기 때문에 위에서 설명한 방법인 Thread를 상속받는 클래스를 만들고 해당 클래스를 사용하면 다른 클래스를 상속받을 수 없게됩니다.&amp;nbsp;&lt;br /&gt;Thread()를 상속받는 것 대신 Runnable 인터페이스를 구현한 객체를 Thread를 생성할 때 인자로 전달하여 사용할 수도 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 방법 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659188154477&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {

    // 2번째 스레드 - Runnable을 구현하여 생성
    // Runnable 인터페이스를 구현한 testThreadWithRunnable 객체 생성
    val runnable = testThreadWithRunnable()
    // Thread의 인자로 runnable을 주어 스레드 생성.
    val testThWithRunnable = Thread(runnable)

    // 스레드 실행.
    testThWithRunnable.start()

}

// Runnable 인터페이스를 구현
class testThreadWithRunnable : Runnable {
    override fun run() {
        // Thread를 상속받은 것이 아니라 Runnable을 구현한 것이기 때문에
        // 동작중인 스레드의 이름을 알기 위해선 Thread.currentThread().name 를 사용
        repeat(5) {
            println(&quot;Count ${5 - it} - ${Thread.currentThread().name}&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;pre id=&quot;code_1659188173333&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Count 5 - Thread-0
Count 4 - Thread-0
Count 3 - Thread-0
Count 2 - Thread-0
Count 1 - Thread-0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 방법과 동일한 출력 결과를 가집니다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세 번째 방법 - thread() 메서드 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 보기에는 제일 간단한 방법인 것 같습니다..!! thread() 메서드를 이용하여 간단하게 스레드를 생성할 수 있습니다.&lt;br /&gt;이 thread() 메서드는 인자로 Boolean값을 받는데, 이는 스레드 생성과 동시에 실행을 할 것이냐를 판단합니다. default는 true로 인자를 주지 않았을 경우에는 스레드를 생성과 동시에 실행하며 false를 인자로 주었을 경우에는 스레드를 생성만 하고 실행은 별도로 start() 메서드를 이용하여 실행시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 start = false로 설정하여 별도로 스레드를 실행하도록 지정하였습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세 번째 방법 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659189071412&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {

    // 3번째 스레드 - thread() 함수를 이용하여 생성
    val simpleTh = thread(false) {
        repeat(5){
            println(&quot;Count ${5 - it} - ${Thread.currentThread().name}&quot;)
        }
    }

    // 세번째 스레드 실행
    simpleTh.start()

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;pre id=&quot;code_1659189148737&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Count 5 - Thread-0
Count 4 - Thread-0
Count 3 - Thread-0
Count 2 - Thread-0
Count 1 - Thread-0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 동일한 결과를 출력합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스레드의 처리 순서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 3번째 방법으로 총 3개의 스레드를 생성해보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659189575523&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 첫 번째 스레드
    val firThread = thread(false) {
        repeat(5) {
            println(&quot;this is firThread ${Thread.currentThread().name}&quot;)
        }
    }
    // 두 번째 스레드
    val secThread = thread(false) {
        repeat(5) {
            println(&quot;this is secThread ${Thread.currentThread().name}&quot;)
        }
    }
    // 세 번째 스레드
    val thirdThread = thread(false) {
        repeat(5) {
            println(&quot;this is thirdThread ${Thread.currentThread().name}&quot;)
        }
    }

    // 첫 번째 스레드 실행
    firThread.start()
    // 두 번째 스레드 실행
    secThread.start()
    // 세 번째 스레드 실행
    thirdThread.start()

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이렇게 총 3개의 스레드를 생성하고 순차적으로 실행하도록 코드를 구성하였습니다. 과연 출력 결과가 어떻게 나올까요?&lt;br /&gt;첫 번째 스레드, 두 번째 스레드, 세 번째 스레드 이렇게 순차적으로 실행했으니 순차적으로 5씩 출력이 될까요??&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-30 at 11.05.24 PM.png&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCZw53/btrIywinRKd/sZ0sK3eOPxduo1jfddB8f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCZw53/btrIywinRKd/sZ0sK3eOPxduo1jfddB8f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCZw53/btrIywinRKd/sZ0sK3eOPxduo1jfddB8f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCZw53%2FbtrIywinRKd%2FsZ0sK3eOPxduo1jfddB8f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;210&quot; height=&quot;325&quot; data-filename=&quot;Screen Shot 2022-07-30 at 11.05.24 PM.png&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엥? 굉장히 난잡한 순서로 출력이 된 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이런 결과가 나오게 되었을까요??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드의 동작 순서는 OS 스케쥴러가 진행하기 때문에 무엇이 먼저 얼마나 오래동안 진행될지는 알 수가 없습니다.&lt;br /&gt;따라서 위의 코드와 동일한 코드를 작성하고 반복해서 코드를 실행해보면 계속해서 다른 결과가 나오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 main 스레드에서 순차적으로 코드를 실행하다가 start()로 스레드를 실행하게 되면 별도의 스레드가 생성되고 생성된 스레드에서 해당 스레드가 별로도 돌아가게 됩니다.(run()이 동작)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 우리가 원하는 순차적인 스레드 실행은 어떻게 할 수 있을까요?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스레드를 순차적으로 실행하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join()함수를 사용하면 해당 thread의 작업이 모두 완료되기 전까지 blocking되어 대기 상태가 됩니다.&lt;br /&gt;이 join() 함수를 사용하여 순차적으로 스레드를 실행할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659198302974&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 첫 번째 스레드
    val firThread = thread(false) {
        repeat(5) {
            println(&quot;this is firThread ${Thread.currentThread().name}&quot;)
        }
    }
    // 두 번째 스레드
    val secThread = thread(false) {
        firThread.join()
        repeat(5) {
            println(&quot;this is secThread ${Thread.currentThread().name}&quot;)
        }
    }

    // 세 번째 스레드
    val thirdThread = thread(false) {
        firThread.start()
        secThread.start()
        secThread.join()
        repeat(5) {
            println(&quot;this is thirdThread ${Thread.currentThread().name}&quot;)
        }
    }

    thirdThread.start()

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-31 at 2.02.06 AM.png&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm3H7n/btrIvpqeOjv/qQR3YMvo9mAL9wx0JrhySk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm3H7n/btrIvpqeOjv/qQR3YMvo9mAL9wx0JrhySk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm3H7n/btrIvpqeOjv/qQR3YMvo9mAL9wx0JrhySk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm3H7n%2FbtrIvpqeOjv%2FqQR3YMvo9mAL9wx0JrhySk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;209&quot; height=&quot;319&quot; data-filename=&quot;Screen Shot 2022-07-31 at 2.02.06 AM.png&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 소스 코드는 아래와 같이 동작합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;firThread 생성 -&amp;gt; secThread 생성 -&amp;gt; thirdThread 생성 -&amp;gt; thirdThread가 start()로 호출되어 별도의 스레드에 할당&amp;nbsp;&lt;br /&gt;-&amp;gt; firThread 가 start()로 호출되어 별도의 스레드에 할당 -&amp;gt; secThread가 start()로 호출되어 별도의 스레드에 할당&lt;br /&gt;firThread, secThread, thirdThread가 이제 각각의 스레드에 할당되어 동작&amp;nbsp;&lt;br /&gt;firThread는 정상 동작&lt;br /&gt;secThread는 firThread.join()이 있으므로 firThread의 동작이 완료될 때까지 대기상태&lt;br /&gt;thirdThread는 secThread의 동작이 완료될 때까지 대기상태&lt;br /&gt;firThread의 동작이 완료되면 secThread의 동작이 시작, secThread의 동작이 완료되면 thirdThread가 동작&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 join()을 사용하여 해당 스레드가 완료되기 전까지 대기 상태로 만들 수 있습니다!&lt;br /&gt;ex) firThread.join() 를 호출하면 firThread의 동작이 완료될 때까지 해당 스레드는 대기 상태가 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;join()을 사용하며 timeout을 주기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 join()을 사용하여 해당 스레드의 동작이 완료되기 전까지 대기 상태로 만들 수 있다는 것을 확인했습니다!&amp;nbsp;&lt;br /&gt;하지만 해당 스레드에 오류가 생겨 무한히 반복되게 된다면 대기 상태도 무한히 유지될 것입니다.&amp;nbsp;&lt;br /&gt;이를 해결하기 위하여 join()을 호출할 때 인자의 값으로 ms단위(1000 = 1초)의 시간을 전달하여 Timeout을 지정할 수 있습니다!&lt;br /&gt;참고로, 인자를 사용하지 않고 join()으로만 사용한다면 default값은 0입니다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659202377547&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 첫 번째 스레드
    val firThread = thread(false) {
        Thread.sleep(2000)
        repeat(5) {
            println(&quot;this is firThread ${Thread.currentThread().name}&quot;)
        }
    }
    // 두 번째 스레드
    val secThread = thread(false) {
        firThread.join(500)
        repeat(5) {
            println(&quot;this is secThread ${Thread.currentThread().name}&quot;)
            Thread.sleep(1000)
        }
    }

    // 세 번째 스레드
    val thirdThread = thread(false) {
        firThread.start()
        secThread.start()
        secThread.join(500)
        repeat(5) {
            println(&quot;this is thirdThread ${Thread.currentThread().name}&quot;)
        }
    }

    thirdThread.start()

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-31 at 2.33.11 AM.png&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djkg26/btrIyZq47rw/gjnlyNaenFTjUfCUrJc0Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djkg26/btrIyZq47rw/gjnlyNaenFTjUfCUrJc0Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djkg26/btrIyZq47rw/gjnlyNaenFTjUfCUrJc0Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjkg26%2FbtrIyZq47rw%2FgjnlyNaenFTjUfCUrJc0Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;203&quot; height=&quot;318&quot; data-filename=&quot;Screen Shot 2022-07-31 at 2.33.11 AM.png&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread.sleep()은 해당 스레드를 sleep()의 인자로 주어진 수(ms단위)만큼 스레드를 대기 시킵니다.&lt;br /&gt;ex) thirdThread에서 Thread.sleep(1000)를 호출하면 thirdThread는 1초간 대기 상태 후 작업 시작.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firThread는 2초를 쉬고 반복문을 5번 출력,&lt;br /&gt;secThread는 firThread.join(500)을 사용했으므로, firThread가 종료될 때까지 대기 but, 0.5초가 지나도 firThread가 종료되지 않는다면 작업 시작,&lt;br /&gt;thirdThread는 firThread와 secThread를 실행시킴. secThread가 종료될 때까지 대기 but, 0.5초가 지나도 secThread가 종료되지 않는다면 작업시작.&lt;br /&gt;따라서 위의 사진과 같이 thirdThread가 가장 먼저(secThread가 가장 먼저 출력될 수도 있음 -- firThread, secThread가 동시에 실행되며 secThread는 firThread에 대한 0.5초의 Timeout을 thirdThread는 secThread에 대한 0.5초의 Timeout을 가졌기 때문.)&lt;br /&gt;출력되고 secThread, firThread가 지연된 시간을 맞춰 출력되는 모습을 볼 수 있습니다!!&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>kotlin</category>
      <category>thread</category>
      <category>쓰레드</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/253</guid>
      <comments>https://soopeach.tistory.com/253#entry253comment</comments>
      <pubDate>Sun, 31 Jul 2022 02:40:28 +0900</pubDate>
    </item>
    <item>
      <title>프로세스, 스레드 그리고 멀티 프로세스 VS 멀티 스레드</title>
      <link>https://soopeach.tistory.com/252</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;멀티 프로세스와 멀티 스레드는 시스템의 컴퓨팅 성능을 높이기 위하여 사용되는 처리방식&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;헷갈리는 키워드&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실행 단위&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU core에서 실행하는 하나의 단위로 프로세스와 스레드를 포괄하는 개념.&lt;/li&gt;
&lt;li&gt;즉, 실행단위는 프로세스, 스레드 둘 다 가리킬 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 스레드만 가지고 있는 단일 스레드 프로세스&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동시성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동시성은 한순간에 여러가지 일을 하는 것 X&lt;/li&gt;
&lt;li&gt;굉장히 빠른 속도로 실행하는 일을 전환하여 한 번에 여러가지 일을 하는 것처럼 보이는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스와 스레드&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로세스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;프로그램&lt;/b&gt;&lt;/span&gt;은 단순히 실행대기 중인 명령어(코드)와 정적인 데이터의 묶음이며 보조 기억장치에 존재.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt;는 코드로 작성된 프로그램이 메모리에 적재되어 사용할 수 있는 상태가 된 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt;는 실행 중인 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;프로그램&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보조 기억장치(ex. HDD)에 있는 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;프로그램&lt;/span&gt;&lt;/b&gt;을 실행하면, &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;프로그램&lt;/span&gt;&lt;/b&gt; 실행을 위하여 메모리 할당이 이루어지고, 이 할당된 공간으로 바이너리 코드가 올라가게 됨. 이 때부터 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;프로세스&lt;/span&gt;&lt;/b&gt;라고 불림.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스레드&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;스레드&lt;/b&gt;&lt;/span&gt;란 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt; 내에서 실제로 작업을 수행하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt;에는 한 개 이상의 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;스레드&lt;/b&gt;&lt;/span&gt;가 존재하여 작업을 수행함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 개 이상의 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;스레드&lt;/b&gt;&lt;/span&gt;를 가지는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt;를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;멀티 스레드 프로세스&lt;/b&gt;&lt;/span&gt; 라고 함.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티 프로세스와 멀티 스레드&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 프로세스 (Multi Process)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 프로세스란 두 개 이상의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)를 동시에 처리하는 것. - 병렬 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 프로세스간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야할 경우 사용.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멀티 프로세스의 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립된 구조로 안전성이 높음.&lt;/li&gt;
&lt;li&gt;여러 개의 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업 속도가 느려지는 손해 정도는 생기지만 작업이 정지되거나 하는 등의 큰 손해는 발생하지 않음.&lt;/li&gt;
&lt;li&gt;여러 개의&amp;nbsp; 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적으로 저렴함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멀티 프로세스의 단점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립된 메모리 영역이기 때문에 작업량이 많을 수록 (&lt;b&gt;Context Switching&lt;/b&gt;이 자주 일어나 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능 저하의 가능성이 존재.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;오버헤드란? &lt;/b&gt;간단히 말하면 특정 기능을 수행하는데 드는 간접적인 시간, 메모리와 같은 자원을 뜻함.&lt;br /&gt;20초의 실행시간을 가진 프로그램이 1분이 걸리게 된다면 이 프로그램의 오버헤드는 40초.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Context Switching&lt;/b&gt;과정에서 캐시 메모리 초기화등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Context Swithcing&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;는 하나의 프로세스만 실행할 수 있는데, 여러 프로세스를 동시에 수행하는 것처럼 보이기 위하여 여러 개의 프로세스들을 교체해가면서 작업을 진행함.&lt;br /&gt;프로세스를 교체하는 과정에서 이전의 프로세스의 상태(문맥 = Context)를 보관하고, 새로운 프로세스의 상태를 적재하는 작업을 함.&lt;br /&gt;이것이 &lt;b&gt;Context Switching&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 스레드 (Multi Thread)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 스레드란 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것을 의미.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ln33/btrIyZElrRF/O6Pc6Y8Yj3bic0BsgttKTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ln33/btrIyZElrRF/O6Pc6Y8Yj3bic0BsgttKTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ln33/btrIyZElrRF/O6Pc6Y8Yj3bic0BsgttKTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ln33%2FbtrIyZElrRF%2FO6Pc6Y8Yj3bic0BsgttKTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;270&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멀티 스레드의 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 자원 소모 감소 - 자원의 효율성이 증가&lt;/li&gt;
&lt;li&gt;프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있음.&lt;/li&gt;
&lt;li&gt;시스템 처리율 향상 - 처리 비용 감소&lt;/li&gt;
&lt;li&gt;스레드 간 데이터를 주고받는 것이 간단해짐. - 시스템 자원 소모 감소&lt;/li&gt;
&lt;li&gt;스레드 사이의 작업량이 적어 Context Switching이 빠르게 이루어짐.(캐시 메모리를 비울 필요 X)&lt;/li&gt;
&lt;li&gt;간단한 통신 방법으로 프로그램 응답시간 단축&lt;/li&gt;
&lt;li&gt;스레드는 프로세스 내의 스택 영역을 제외한 메모리 영역을 공유하므로 통신 비용이 적음.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙 영역을 공유하므로 데이터를 주고받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멀티 스레드의 단점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원을 공유하기에 동기화 문제가 발생할 수 있음 - 병목 현상, 교착상태(데드락) 등
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;병목(bottleneck)현상이란?&lt;/b&gt; 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교착 상태(deadlock)란?&lt;/b&gt; 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주의 깊은 설계가 필요하고 디버깅이 어려움.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 부분까지 동기화하면, 대기시간으로 성능 저하 발생&lt;/li&gt;
&lt;li&gt;버그가 발생하면 찾기가 힘듦.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받으.&lt;/li&gt;
&lt;li&gt;단일 프로세스 시스템일 경우 큰 효과를 기대하기 어려움.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티 프로세스 VS 멀티 스레드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티 프로세스는 독립된 구조로 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지않아 안전성이 높지만,&amp;nbsp;&lt;br /&gt;멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지함.&lt;/li&gt;
&lt;li&gt;멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching의 비용이 적지만,&amp;nbsp;&lt;br /&gt;동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 가능성이 있음.&lt;/li&gt;
&lt;li&gt;멀티 프로세스, 멀티 스레드 모두 동시에 여러 작업을 수행하다는 점에서는 동일하지만, 각각의 특징과 장단점이 있어 시스템에 따라 적합한 동작 방식을 선택해야함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://livenow14.tistory.com/67&quot;&gt;https://livenow14.tistory.com/67&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>CS</category>
      <category>multi process</category>
      <category>Multi Thread</category>
      <category>Process</category>
      <category>thread</category>
      <category>멀티 스레드</category>
      <category>멀티 프로세스</category>
      <category>스레드</category>
      <category>프로세스</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/252</guid>
      <comments>https://soopeach.tistory.com/252#entry252comment</comments>
      <pubDate>Sat, 30 Jul 2022 16:57:08 +0900</pubDate>
    </item>
    <item>
      <title>싱글 스레드와 멀티 스레드의 차이[Kotlin - 코틀린](카운트 다운 + 입/출력 / 구현을 통하여 알아보자!)</title>
      <link>https://soopeach.tistory.com/251</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;먼저 보고오면 좋을 글 - 코틀린에서 스레드 사용하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/253&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코틀린에서 Thread 사용하기( + start()-스레드 시작, join()-스레드 대기상태로 만들기)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659202934489&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;코틀린에서 Thread 사용하기( + start()-스레드 시작, join()-스레드 대기상태로 만들기)&quot; data-og-description=&quot;코틀린에서 스레드 생성 및 실행하기 3 가지의 스레드 생성 방법이 모두 나와있는 전체 코드 import kotlin.concurrent.thread fun main() { // 1번째 스레드 - Thread()를 상속받아 생성 // testThread 생성 val..&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/253&quot; data-og-url=&quot;https://soopeach.tistory.com/253&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d4pRKK/hyPf4rNDs1/p8kQkaBHTewIpMb1TnWVY1/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325,https://scrap.kakaocdn.net/dn/ohOnS/hyPf30MfAK/UmLikBLUgxg0W5KDBlzZAK/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325,https://scrap.kakaocdn.net/dn/4hl5q/hyPgdvvGQr/ntTFws3KDK7vMxt3a7WvkK/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/253&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/253&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d4pRKK/hyPf4rNDs1/p8kQkaBHTewIpMb1TnWVY1/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325,https://scrap.kakaocdn.net/dn/ohOnS/hyPf30MfAK/UmLikBLUgxg0W5KDBlzZAK/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325,https://scrap.kakaocdn.net/dn/4hl5q/hyPgdvvGQr/ntTFws3KDK7vMxt3a7WvkK/img.png?width=210&amp;amp;height=325&amp;amp;face=0_0_210_325');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코틀린에서 Thread 사용하기( + start()-스레드 시작, join()-스레드 대기상태로 만들기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코틀린에서 스레드 생성 및 실행하기 3 가지의 스레드 생성 방법이 모두 나와있는 전체 코드 import kotlin.concurrent.thread fun main() { // 1번째 스레드 - Thread()를 상속받아 생성 // testThread 생성 val..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 우리가 사용하는 채팅 시스템을 떠올려보면 채팅을 주고받음과 동시에 사진도 보내고, 사진도 다운로드하고... 그외 등등 여러 작업을 동시에 하고 있다. 이는 해당 시스템이 멀티 스레드로 동작하기 때문이다. 만약 채팅 시스템이 멀티 스레드가 아닌 싱글 스레드로 동작한다면... 사진을 업로드하는 동안, 사진을 다운받는 동안.. 단일 스레드 혼자이 작업들을 하느라 해당 프로그램이 멈추고 다운로드, 업로드에 집중하게 되어 채팅을 실시간으로 하지 못하게 될 것이다.&lt;br /&gt;이를 조금 더 이해하기 쉽게 간단한 예시를 통하여 코틀린으로 구현해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서 사용할 예시는 아주 간단히 &quot;10 ~ 1까지 카운트를 하는 작업 + 3번 반복( text를 입력받아 그대로 출력하는 작업)&quot; 을 진행할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;싱글 스레드일 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글 스레드 일경우 어떨까... 우리가 알듯이 싱글 스레드를 사용하면 위에서 아래로 순차적으로 코드가 동작한다.(main함수 하나만 사용)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 소스코드&lt;/h4&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 10 - 1까지 카운트 다운
    repeat(10) {
        println(&quot;카운트 다운 ${10 - it}&quot;)
        Thread.sleep(1000)
    }
    println(&quot;카운트 다운이 완료되었습니다.&quot;)

    // 콘솔 창에 입력받은 값을 그대로 출력 - 3번 반복
    repeat(3) {
        println(&quot;채팅을 입력해주세요 : &quot;)
        val text = readln()
        println(&quot;\&quot;${text}\&quot;을/를 전송하였습니다. 남은 채팅 횟수 ${3 - (it+1)}&quot;)
    }
    println(&quot;이용 가능한 채팅횟수를 다 사용하였습니다.&quot;)

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방식으로 코드가 구성되어있다면 어떠한 결과가 나올까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 다들 쉽게 예상할 수 있을 것이다.&amp;nbsp;&lt;br /&gt;총 10회의 카운트 다운이 끝나고, 카운트 다운이 끝났다는 것을 알려주는 문구가 출력된 후,&lt;br /&gt;3번의 텍스트 입/출력이 반복된 후 채팅횟수가 끝났다는 문구가 출력되고 프로그램이 종료된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 소스코드의 출력결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-30 at 1.51.55 PM.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A3h70/btrIseW0BbS/BFV7qkplIZCZMwx0DgBkz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A3h70/btrIseW0BbS/BFV7qkplIZCZMwx0DgBkz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A3h70/btrIseW0BbS/BFV7qkplIZCZMwx0DgBkz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA3h70%2FbtrIseW0BbS%2FBFV7qkplIZCZMwx0DgBkz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;892&quot; data-filename=&quot;Screen Shot 2022-07-30 at 1.51.55 PM.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659156779489&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 콘솔 창에 입력받은 값을 그대로 출력 - 3번 반복
    repeat(3) {
        println(&quot;채팅을 입력해주세요 : &quot;)
        val text = readln()
        println(&quot;\&quot;${text}\&quot;을/를 전송하였습니다. 남은 채팅 횟수 ${3 - (it + 1)}&quot;)
    }
    println(&quot;이용 가능한 채팅횟수를 다 사용하였습니다.&quot;)

    // 10 - 1까지 카운트 다운
    repeat(10) {
        println(&quot;카운트 다운 ${10 - it}&quot;)
        Thread.sleep(1000)
    }
    println(&quot;카운트 다운이 완료되었습니다.&quot;)
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 동일한 코드인데, 입/출력, 카운트 다운을 하는 과정의 순서만 바뀌었다.&lt;br /&gt;마찬가지로 3번의 입/출력이 반복된 후 카운트 다운이 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 소스코드의 출력결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-30 at 1.53.28 PM.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5ALAE/btrIA2HbgO4/8rrIj1pt6f40EcNhoqWIw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5ALAE/btrIA2HbgO4/8rrIj1pt6f40EcNhoqWIw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5ALAE/btrIA2HbgO4/8rrIj1pt6f40EcNhoqWIw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5ALAE%2FbtrIA2HbgO4%2F8rrIj1pt6f40EcNhoqWIw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;898&quot; data-filename=&quot;Screen Shot 2022-07-30 at 1.53.28 PM.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상한대로 결과가 나타난다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티 스레드일 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리가 원하는 기능은 이렇게 카운트 다운, 입/출력이 순차적으로 이루어지는 것이 아니다. 카운트 다운이 진행되는 동안 3번의 입/출력을 하는 것이다. 위와 같이 싱글 스레드를 사용할 경우 스레드가 순차적으로 작업들을 처리하여 한 작업을 하는 동안 다른 작업은 진행할 수 없게된다.&amp;nbsp;&lt;br /&gt;이번에는 다수의 스레드를 사용하여 동시에 작업이 진행되도록 해보자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 소스코드&lt;/h4&gt;
&lt;pre id=&quot;code_1659157288819&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 콘솔 창에 입력받은 값을 그대로 출력 - 3번 반복하는 스레드 생성.
    val chatTh = thread(false){
        repeat(3) {
            println(&quot;채팅을 입력해주세요 : &quot;)
            val text = readln()
            println(&quot;\&quot;${text}\&quot;을/를 전송하였습니다. 남은 채팅 횟수 ${3 - (it + 1)}&quot;)
        }
    }

    // 10 - 1까지 카운트 다운하는 스레드 생성.
    val countTh = thread(false){
        repeat(10) {
            println(&quot;카운트 다운 ${10 - it}&quot;)
            Thread.sleep(1000)
        }
    }

    // 입/출력을 담당하는 스레드를 실행
    chatTh.start()
    println(&quot;이용 가능한 채팅횟수를 다 사용하였습니다.&quot;)

    // 카운트 다운을 담당하는 스레드를 실행.
    countTh.start()
    println(&quot;카운트 다운이 완료되었습니다.&quot;)

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글 스레드를 사용한 코드와 달리, 이번 소스코드에는 thread를 사용하여 두 개의 스레드를 생성한 것을 볼 수 있다. thread()의 인자로 false가 주어졌는데 이는 스레드를 생성만 하겠다는 소리이다. 스레드를 생성만하고 실행을 하지 않으면 스레드 실행은 당연히 되지 않는다.&lt;br /&gt;그래서 아래에 .start()를 사용하여 스레드를 실행시켜준 것. 하지만 thread()의 인자로 true를 주게되면 생성과 동시에 스레드를 실행한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에 대해서는 출력 결과가 어떻게 나올까?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 소스코드의 출력결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-30 at 2.00.53 PM.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zdPr1/btrIBVgKH4X/qLNCFGXkN4Ygp0kwAAWhyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zdPr1/btrIBVgKH4X/qLNCFGXkN4Ygp0kwAAWhyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zdPr1/btrIBVgKH4X/qLNCFGXkN4Ygp0kwAAWhyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzdPr1%2FbtrIBVgKH4X%2FqLNCFGXkN4Ygp0kwAAWhyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;902&quot; data-filename=&quot;Screen Shot 2022-07-30 at 2.00.53 PM.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음?... 멀티스레드를 사용하면 동시에 잘 된다고..?&lt;br /&gt;맞다. 멀티스레드를 사용하여 동시에 잘 진행되었다. 하지만 위의 코드에는 문제가 있다. 채팅을 입력하지도 않았는데 채팅횟수를 소진했다는 문구가 출력되었다. 또한 카운트 다운이 시작되기도 전에 카운트 다운이 완료되었다는 종료문구가 출력되었다...&lt;br /&gt;왜 이러한 현상이 생기게 된 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 소스코드가 전체적으로 동작되는 과정을 보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;chatTh라는 스레드를 생성 -&amp;gt; countTh라는 스레드를 생성 -&amp;gt; chatTh 스레드를 실행 -&amp;gt; 채팅횟수가 다 사용되었다는 문구를 출력 -&amp;gt; countTh 스레드를 실행 -&amp;gt; 카운트 다운이 완료되었다는 문구를 출력.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순으로 동작하게 된다. 마지막 카운트 다운이 완료되었다는 문구를 출력하게 되면 main함수는 끝난다. 하지만 프로그램은 종료되지 않고 카운트 다운, 입/출력이 완료될 때까지 프로그램이 돌아가게 된다.&lt;br /&gt;여기서 우리는 메인 함수가 종료되어도 나머지 스레드의 작업이 종료되기전까지 프로그램이 실행된다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 스레드가 실행되는 것을 간단히 확인해보면, &lt;br /&gt;메인 스레드(main 메서드를 실행하는 스레드)에서 별도의 스레드를 생성하고 .start()함수를 사용하여 그 스레드를 실행하면 메인 스레드에서 start()가 동작한다. 이 start()는 별도의 스레드를 만들어서 해당 스레드의 작업을 생성한 그 별도의 스레드에서 진행하도록 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이 스레드들의 동작 순서는 OS스케쥴러가 진행하기 때문에 무엇이 먼저 진행될지는 알 수 없다.&lt;br /&gt;이를 눈으로 보고 싶다면 ,두 개의 스레드를 생성 후 하나는 0, 하나는 1을 반복하여 출력하도록 만들고 코드를 여러 번 실행시켜보면 된다.&lt;br /&gt;실행시킬때마다 다른 결과가 출력된다.(여러 번 반복해야 눈에 잘 보인다.. 적게 반복하면 하나의 스레드가 이미 연산을 먼저 끝낼 가능성이 있음.)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 우리가 원하는 대로 별도의 스레드에서 입/출력을 담당하는 부분과, 카운트 다운을 담당하는 부분이 잘 동작하고 있으며 메인 스레드 또한 스레드를 생성, 시작만 시킨 후 그대로 아래의 코드를 순차적으로 실행한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 그럼 개선해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 소스코드&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1659158935708&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import kotlin.concurrent.thread

fun main() {

    // 콘솔 창에 입력받은 값을 그대로 출력 - 3번 반복하는 스레드 생성.
    val chatTh = thread(false) {
        repeat(3) {
            println(&quot;채팅을 입력해주세요 : &quot;)
            val text = readln()
            println(&quot;\&quot;${text}\&quot;을/를 전송하였습니다. 남은 채팅 횟수 ${3 - (it + 1)}&quot;)
        }
    }

    // 10 - 1까지 카운트 다운하는 스레드 생성.
    val countTh = thread(false) {
        repeat(10) {
            println(&quot;카운트 다운 ${10 - it}&quot;)
            Thread.sleep(1000)
        }
    }

    // 입/출력을 담당하는 스레드를 실행
    chatTh.start()

    // 카운트 다운을 담당하는 스레드를 실행.
    countTh.start()

    val afterChatTh = thread(true) {
        chatTh.join()
        println(&quot;이용 가능한 채팅횟수를 다 사용하였습니다.&quot;)
    }

    val afterCountTh = thread(true) {
        countTh.join()
        println(&quot;카운트 다운이 완료되었습니다.&quot;)
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 과연 기대하는 대로 출력이 될까??&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 소스코드의 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-30 at 2.27.39 PM.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9ql0L/btrIAEzqFdn/3izbHnSVLwO93Bu8QexWz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9ql0L/btrIAEzqFdn/3izbHnSVLwO93Bu8QexWz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9ql0L/btrIAEzqFdn/3izbHnSVLwO93Bu8QexWz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9ql0L%2FbtrIAEzqFdn%2F3izbHnSVLwO93Bu8QexWz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;898&quot; data-filename=&quot;Screen Shot 2022-07-30 at 2.27.39 PM.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오... 원하는대로 카운트 다운, 반복되는 입/출력이 동시에 실행되면서..!&lt;br /&gt;채팅 횟수를 모두 소진한 후 채팅관련 경고문구가, 카운트 다운이 완료된 후 카운트 다운 관련 경고문구가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 소스 코드는 아래와 같은 순서로 동작한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;chatTh 스레드 생성 -&amp;gt; countTh 스레드 생성 -&amp;gt; chatTh.start()를 통하여 별도의 스레드에서 chatTh를 실행 -&amp;gt; countTh.start()를 통하여 별도의 스레드에서 counthTh를 실행 -&amp;gt; afterChatTh 스레드를 생성과 동시에 별도의 스레드에서 실행 -&amp;gt; afterChatTh 스레드를 생성과 동시에 별도의 스레스에서 실행 -&amp;gt; 메인 스레드 종료.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 소스코드와 두 번째 소스코드의 차이는 경고문을 출력하는 부분을 별도의 스레드에 넣은 것 뿐이다. 심지어 생성과 동시에 동작하도록 만들었다.(thread의 인자로 true를 주었기 때문) 하지만 이번에는 채팅, 카운트 다운 관련 경고문구가 즉시 출력되는 것이 아니라 해당 기능들이 완료된 후 출력되는 것을 볼 수 있다!! 이는 .join()메서드를 사용했기 때문이다. afterChatTh의 스레드 내부를 보면, chatTh.join()을 사용한 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatTh.join()은 chatTh 스레드가 끝난 후 아래의 코드들이 실행됨을 의미한다. 따라서 afterChatTh 스레드는 별도의 스레드에서 동작 중이지만 chatTh 스레드의 동작이 완료되어야 아래의 코드들이 실행이 된다! 기다리고 있는 것이다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 구현을 통하여 싱글 스레드, 멀티 스레드의 차이를 알아보았다..!! 쉽게 생각하면 싱글 스레드는 혼자 일하기 때문에 일을 순서대로 하는 것이고 멀티 스레드는 여러 명이 일하기 때문에 동시에 처리하는 것이라고 생각하면 된다.&amp;nbsp;&lt;br /&gt;사실 이게 말이 쉽지 실제로 프로그램이 동작하는 것을 구현하면 예상과 다른 결과가 많이 나왔었는데 이번에 직접 기능들을 구현해보니 조금 더 이해가 수월했던 것 같다아아~~~&lt;/p&gt;</description>
      <category>오늘 배운 것[Today_I_Learned]</category>
      <category>kotlin</category>
      <category>멀티 스레드</category>
      <category>스레드</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/251</guid>
      <comments>https://soopeach.tistory.com/251#entry251comment</comments>
      <pubDate>Sat, 30 Jul 2022 14:39:01 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-07-18 until 2022-07-24</title>
      <link>https://soopeach.tistory.com/250</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-25 at 9.42.46 AM.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X7i8s/btrH6HqMFOE/dPE1kzR7cLoocrPBO9Vjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X7i8s/btrH6HqMFOE/dPE1kzR7cLoocrPBO9Vjk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X7i8s/btrH6HqMFOE/dPE1kzR7cLoocrPBO9Vjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX7i8s%2FbtrH6HqMFOE%2FdPE1kzR7cLoocrPBO9Vjk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;732&quot; data-filename=&quot;Screen Shot 2022-07-25 at 9.42.46 AM.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스트 캠프 1주차였다...!!!!&lt;br /&gt;마아아악 코딩만 한 것은 아니라서, 코딩 시간은 좀 적지만... 정말 많은 공부를 할 수 있었다~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/249&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;네이버 부스트 캠프 웹 모바일 7기 1주차 회고&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658709967644&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;네이버 부스트 캠프 웹 모바일 7기 1주차 회고&quot; data-og-description=&quot;별로 회고랄건 없지만 느꼈던 감정들을 조금 끄적거려보려고 한다. 우선 빡세다... 첫날 느꼈던 감정이다. 정말 빡세다라는 생각이 들었다. 이게 공부구나.. 첫날에는 코딩이 정말 빡세다고 느꼈&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/249&quot; data-og-url=&quot;https://soopeach.tistory.com/249&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pGiSu/hyPbLlW2MZ/K4NhrkiasYlnpd72kVQQWk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/drqSc3/hyPdhKfqdt/hNcLBxPTwGyuM3EK6kbLkK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bXZHrj/hyPbPV7QrR/nRxYtPCYg7OXU9242mVLW0/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/249&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/249&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pGiSu/hyPbLlW2MZ/K4NhrkiasYlnpd72kVQQWk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/drqSc3/hyPdhKfqdt/hNcLBxPTwGyuM3EK6kbLkK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bXZHrj/hyPbPV7QrR/nRxYtPCYg7OXU9242mVLW0/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;네이버 부스트 캠프 웹 모바일 7기 1주차 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;별로 회고랄건 없지만 느꼈던 감정들을 조금 끄적거려보려고 한다. 우선 빡세다... 첫날 느꼈던 감정이다. 정말 빡세다라는 생각이 들었다. 이게 공부구나.. 첫날에는 코딩이 정말 빡세다고 느꼈&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;느낀 점은 요기에... ㅎㅎ&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/250</guid>
      <comments>https://soopeach.tistory.com/250#entry250comment</comments>
      <pubDate>Mon, 25 Jul 2022 09:47:01 +0900</pubDate>
    </item>
    <item>
      <title>부스트캠프 웹・모바일 7기 1주차 회고</title>
      <link>https://soopeach.tistory.com/249</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;별로 회고랄건 없지만 느꼈던 감정들을 조금 끄적거려보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;빡세다...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫날 느꼈던 감정이다. 정말 빡세다라는 생각이 들었다. 이게 공부구나..&lt;br /&gt;첫날에는 코딩이 정말 빡세다고 느꼈다. 거짓말 안치고 무호흡 코딩을 했다...대략 5-6시간?? 그랬더니 하루종일 앉아서 코딩만 했는데 숨이차는 경험을 해봤다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그 후 2,3,4일 차는 여전히 빡셌다.... 첫날이랑은 다른 느낌의 빡셈인데, 나는 대학교 2학년 1학기까지만 배운 상태라 현재 CS지식이 전무하다. 사실상 전공자라고 할 수도 없다... 내스스로가 공부 열심히하신 비전공자분들 보다 훨씬 CS지식이 없다고 생각한다.(비전공자분들을 비하하려는 말은 아닙니다..! 사실 스스로 열심히 공부했던 것이 아니라면 전공자도 큰 차이가 없다고 생각합니다..!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 챌린지 과정은 CS를 교육하는 과정이다보니 CS개념이 전무한 나는 정말 빡세게 느껴졌다. 시간이 모자라다는 생각도 들고, 특히 아예 처음 보는 개념들이다 보니 쉽지가 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또 내가 고치고 싶은 버릇? 성격?이 여기서도 적용이 되는데.. 괜히 시간 제한이 주어지면 불안해서 당황하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그에 여러 글을 쓸 때마다 비슷하게 언급했던 것 같다 ㅋㅋㅋ 아직도 변하지 않았다... 이번 1주차에서도 마찬가지이다.&lt;br /&gt;미션을 해결해야하는데 시간은 한정되어있고, 개념 공부는 해야겠고, 미션은 이해가 안가고... 이 세가지가 복합적으로 내 머릿속을 마구마구 휘저어놓았다.&amp;nbsp;&lt;br /&gt;코테에서도 느꼈던 부분이지만 정말 설계없는 구현은 굉장히 비효율적이다. 물론 몇몇 특이 케이스에 한해서는 아다리가 맞는 경우가 있으나 무조건 설계 후 구현을 하는 것이 좋다고 거의 매일 느끼고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 내 성격상 알면서도 그게 쉽지 않았다. 진짜 개념공부만 수행하다 미션을 아예 못할 것 같다는 생각이 들어 마음이 조급해지고 개념을 깊게 공부하지 못하고, 문제도 정확히 이해하지 못한 상태에서 구현하려다보니 중간에 코드를 뒤엎어야할 일이 생기기도하고 아예 방향이 틀어져 돌이킬 수 없는 경우가 생기기도&amp;nbsp; 했다... 노력해야겠다... 내일부터는 꼭...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주말에는 못다한 학습 정리를 조금했다. 마음편하게 개념들을 정리하니 훨씬 이해가 잘 갔다. 미션 수행중에도 이러한 마음 가짐으로 임해야겠다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;그리고 같이 챌린지 과정을 수행하고 계신 캠퍼분들이 너무 너무 대단하시고 같이 챌린지 과정을 수행할 수 있어 영광이다.&lt;br /&gt;굉장히 잘하시는 분들도 많이 계시고 무엇보다 열정이 다들 너무나도 뛰어나서 동기부여가 된다. 불이 붙으면 옆으로 번지고 그 옆으로 번지고 또 그 옆으로 번지고... 이런식으로 무한히 번지게 되는데 현재 캠퍼분들은 개개인이 모두 불타고 계셔서 모든 캠퍼분들이 꺼지지 않는 불의 상태가 될 수 있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리..&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쨋든 1주차를 보내고 느낀점을 조금 적어봤다... 그리고 2주차부터는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조급해하지 말기&lt;/li&gt;
&lt;li&gt;설계없는 구현은 하지 말것 &amp;lt;--- 이거 특히 절대. 제발.&lt;/li&gt;
&lt;li&gt;문서화를 조금 더 이쁘게 하고싶다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>부스트캠프</category>
      <category>부스트캠프 웹・모바일 7기</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/249</guid>
      <comments>https://soopeach.tistory.com/249#entry249comment</comments>
      <pubDate>Sun, 24 Jul 2022 23:51:38 +0900</pubDate>
    </item>
    <item>
      <title>가비지 컬렉션(Garbage Collection)</title>
      <link>https://soopeach.tistory.com/248</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;먼저 보면 좋을 JVM의 구성 및 동작 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/247&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JVM(자바 가상 머신)의 내부 구성 및 동작 원리&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658651390460&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JVM(자바 가상 머신)의 내부 구성 및 동작 원리&quot; data-og-description=&quot;JVM(Java Virtual Machine)의 동작 방식 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일. Class Loader가..&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/247&quot; data-og-url=&quot;https://soopeach.tistory.com/247&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBPePy/hyPbK1gGjX/WkwPA4kBeDTdegE2QZE9h0/img.png?width=770&amp;amp;height=634&amp;amp;face=0_0_770_634,https://scrap.kakaocdn.net/dn/sGnk8/hyPbTw2DXK/2TXEn57HW5xfjDyGVJvYp0/img.png?width=770&amp;amp;height=634&amp;amp;face=0_0_770_634,https://scrap.kakaocdn.net/dn/XMIjK/hyPbPg6HF2/DcGaoQSH0tbGvYEqXAU1p0/img.png?width=1280&amp;amp;height=416&amp;amp;face=0_0_1280_416&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/247&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/247&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBPePy/hyPbK1gGjX/WkwPA4kBeDTdegE2QZE9h0/img.png?width=770&amp;amp;height=634&amp;amp;face=0_0_770_634,https://scrap.kakaocdn.net/dn/sGnk8/hyPbTw2DXK/2TXEn57HW5xfjDyGVJvYp0/img.png?width=770&amp;amp;height=634&amp;amp;face=0_0_770_634,https://scrap.kakaocdn.net/dn/XMIjK/hyPbPg6HF2/DcGaoQSH0tbGvYEqXAU1p0/img.png?width=1280&amp;amp;height=416&amp;amp;face=0_0_1280_416');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JVM(자바 가상 머신)의 내부 구성 및 동작 원리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JVM(Java Virtual Machine)의 동작 방식 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일. Class Loader가..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가비지 컬렉션(Garbage Collection)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션(Garbage Collection)은 자바의 메모리 관리법 중 하나인데 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역중 필요없게된 메모리를 주기적으로 삭제하는 프로세스임. 가비지 컬렉션은 줄여서 GC라고도 불림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C/C++에서는 가비지 컬렉터가 없어 프로그래머가 수동으로 메모리를 할당, 해제 하여 관리해야했음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM기반의 JAVA, Kotlin은 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 프로그래머가 메모리 관리, 누수에 대하여 신경쓰지 않고 오롯이 개발에만 집중할 수 있음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가비지 컬렉션의 단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션은 메모리 관리측면에 있어 굉장히 유용하지만 단점도 존재.&lt;br /&gt;아래의 두 가지 단점이 대표적인 단점.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메모리가 언제 해제되는지 정확한 시점을 알 수 없음.&lt;/li&gt;
&lt;li&gt;가비지 컬렉션이 동작하는 동안에는 다른 동작들이 멈추기 때문에 오버헤드가 발생함.(&quot;Stop-the-World&quot;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 단점때문에 GC가 너무 자주 동작하면 소프트웨어 성능 하락의 문제가 될 수 있음.&lt;br /&gt;이러한 특성이 있는 GC는 실시간으로 계속 동작해주어야 하는(잠시라도 멈추면 안되는) 시스템들에는 GC의 사용이 적합하지 않음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가비지 컬렉션의 대상이 되는 객체들&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/As3Go/btrH9HQMXGo/3qr2XdINWZTD9aEfLEu1qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/As3Go/btrH9HQMXGo/3qr2XdINWZTD9aEfLEu1qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/As3Go/btrH9HQMXGo/3qr2XdINWZTD9aEfLEu1qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAs3Go%2FbtrH9HQMXGo%2F3qr2XdINWZTD9aEfLEu1qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;555&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 객체들은 Heap 영역에서 생성되고 Method Area, Stack Area등 Root Area에서는 Heap Area에 존재하는 객체의 주소만 참조하는 형식으로 구성됨. 하지만 Heap Area에 생성된 객체들이 메서드가 끝나는 등의 특정 이벤트로 인하여 해당 객체의 메모리 주소를 가지고 있는 참조 변수가 사라진다면 위의 그림에서 빨간색으로 표시된 객체와 같이 어디에서도 참조되어지지 않는 객체가 생기게 됨.&lt;br /&gt;이러한 객체를 &lt;b&gt;&quot;Unreachable&quot;&lt;/b&gt;하다고 하며 이러한 객체들을 GC가 제거해줌.(참조되고 있다면 &lt;b&gt;&quot;Reachable&quot;&lt;/b&gt;)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Reachable : 객체가 참조되고 있는 상태&lt;br /&gt;Unreachable : 객체가 참조되고 있지 않는 상태&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mark And Swap 알고리즘&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EvbBZ/btrH0QP2C9q/5xCvKGciCdYU9s5hpKIW01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EvbBZ/btrH0QP2C9q/5xCvKGciCdYU9s5hpKIW01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EvbBZ/btrH0QP2C9q/5xCvKGciCdYU9s5hpKIW01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEvbBZ%2FbtrH0QP2C9q%2F5xCvKGciCdYU9s5hpKIW01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;333&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션 은 더 효율적으로 동작하기 위하여 Mark And Swap 알고리즘으로 동작함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트에서 해당 객체에 접근이 가능한지에 대한 여부를 메모리 해제의 기준으로 잡음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mark 과정 : Root에서 시작하여 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체들을 참조하고 있는지 찾아서 마킹&lt;/li&gt;
&lt;li&gt;Sweep 과정 : 참조하고 있지 않은 객체 , Unreachable 객체들을 Heap에서 제거&lt;/li&gt;
&lt;li&gt;Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축&lt;br /&gt;(이 과정은 GC의 종류에 따라 하지 않는 경우도 있음.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GC의 대상이 되는 Heap의 영역&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/re5IZ/btrH6IJsqJi/gwwPt5lwuZqlhJkFDM1kSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/re5IZ/btrH6IJsqJi/gwwPt5lwuZqlhJkFDM1kSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/re5IZ/btrH6IJsqJi/gwwPt5lwuZqlhJkFDM1kSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fre5IZ%2FbtrH6IJsqJi%2FgwwPt5lwuZqlhJkFDM1kSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;439&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적인 GC를 위하여 Heap Area는 위와 같이 Young generation(Eden+Survival)과 Old generation으로 나누어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GC의 동작 과정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/30TTH/btrH6ICKpdV/JPUksQn42VZSMmGRoS4o80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/30TTH/btrH6ICKpdV/JPUksQn42VZSMmGRoS4o80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/30TTH/btrH6ICKpdV/JPUksQn42VZSMmGRoS4o80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F30TTH%2FbtrH6ICKpdV%2FJPUksQn42VZSMmGRoS4o80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;440&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 처음 생성되면 Heap 영역의 Eden 영역에 age-bit 0으로 할당됨.&lt;br /&gt;age-bit는 Minor GC에서 살아남을 때마다 1씩 증가!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x8nCZ/btrH9IoHJlB/GNLAFbt2x5CbdYkFw85kok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x8nCZ/btrH9IoHJlB/GNLAFbt2x5CbdYkFw85kok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x8nCZ/btrH9IoHJlB/GNLAFbt2x5CbdYkFw85kok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx8nCZ%2FbtrH9IoHJlB%2FGNLAFbt2x5CbdYkFw85kok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;453&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 지나 Heap 영역의 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 동작하게 됨.&lt;br /&gt;참조 정도에 따라 Survival 0 영역으로 이동되거나 회수됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세 번째 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGOb2/btrH74MiYdm/6SakrtKvG6ZOokP48vifK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGOb2/btrH74MiYdm/6SakrtKvG6ZOokP48vifK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGOb2/btrH74MiYdm/6SakrtKvG6ZOokP48vifK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGOb2%2FbtrH74MiYdm%2F6SakrtKvG6ZOokP48vifK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;436&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속해서 Eden 영역에는 신규 객체들이 생성됨.&lt;br /&gt;이렇게 Eden 영역에 지속적으로 신규 객체가 생기게 되면 Eden 영역에 객체가 다 쌓이게 됨.&lt;br /&gt;Eden 영역에 객체가 다 쌓이게 되면 Young Generation(Eden+Survival) 영역에 있는 객체들을 참조 정도에 따라&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;비어있는 Survival인&lt;/span&gt;&amp;nbsp;Survival 1 영역으로 이동 혹은 회수. 살아남아 Survival 1로 이동한 객체들은 age-bit가 1 증가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;네 번째 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beIp0W/btrH3a7RdPk/OKAC8xGZdBLDjuKuOUIjr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beIp0W/btrH3a7RdPk/OKAC8xGZdBLDjuKuOUIjr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beIp0W/btrH3a7RdPk/OKAC8xGZdBLDjuKuOUIjr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeIp0W%2FbtrH3a7RdPk%2FOKAC8xGZdBLDjuKuOUIjr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;443&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다시 Eden 영역에 신규 객체들로 가득 차게되면 다시 한 번 Minor GC가 동작.&lt;br /&gt;이번에는 Young Generation에 있는 객체들을 비어있는 Survival인 Survival 0으로 이동시킨 뒤 age 1증가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정을 반복!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다섯 번째 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mGlOE/btrH0SAkf3U/ru8AKamYh8MI2LQf8QqTvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mGlOE/btrH0SAkf3U/ru8AKamYh8MI2LQf8QqTvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mGlOE/btrH0SAkf3U/ru8AKamYh8MI2LQf8QqTvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmGlOE%2FbtrH0SAkf3U%2Fru8AKamYh8MI2LQf8QqTvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;426&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정들이 반복되면 age-bit가 특정 숫자(JVM에서 설정해 놓은 age-bit) 이상으로 되는 경우가 발생.&amp;nbsp;&lt;br /&gt;이때 JVM에서 설정해놓은 age-bit에 도달하게 되면 해당 객체는 오랫동안 쓰일 객체라고 판단하여 Old Generation 영역으로 이동.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 과정은 프로모션(&quot;Promotion&quot;)이라고 불림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마지막 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnLpFt/btrH2oEEV6f/ZRJ0BVu2sdD8ZHVs28w8g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnLpFt/btrH2oEEV6f/ZRJ0BVu2sdD8ZHVs28w8g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnLpFt/btrH2oEEV6f/ZRJ0BVu2sdD8ZHVs28w8g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnLpFt%2FbtrH2oEEV6f%2FZRJ0BVu2sdD8ZHVs28w8g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;444&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 지나 Old 영역에 할당된 메모리가 허용치를 넘게되면, Old 영역에 있는 모든 객체들을 검사하여 참조되고 있지 않은 객체들을 한꺼번에 삭제하는 GC가 동작.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Old Generation영역의 메모리를 회수하는 GC가 Major GC임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Major GC는 시간이 오래 걸리는 작업이며, 이때 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈추게 됨.&lt;br /&gt;이러한 상태를 &quot;Stop-the-World&quot;라고 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가비지 컬렉터의 전체적인 라이프 사이클&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkMOXt/btrH9Ivt9FN/sDefmANwDVzavP36UG5ekk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkMOXt/btrH9Ivt9FN/sDefmANwDVzavP36UG5ekk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkMOXt/btrH9Ivt9FN/sDefmANwDVzavP36UG5ekk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkMOXt%2FbtrH9Ivt9FN%2FsDefmANwDVzavP36UG5ekk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;342&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/829&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-factory.tistory.com/829&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>GC</category>
      <category>jvm</category>
      <category>가비지 컬렉션</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/248</guid>
      <comments>https://soopeach.tistory.com/248#entry248comment</comments>
      <pubDate>Sun, 24 Jul 2022 19:44:12 +0900</pubDate>
    </item>
    <item>
      <title>JVM(자바 가상 머신)의 내부 구성 및 동작 원리</title>
      <link>https://soopeach.tistory.com/247</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;JVM(Java Virtual Machine)의 동작 방식&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWzb1h/btrH33mOWnl/Vod1dGkmVtIrNs1KBTCSG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWzb1h/btrH33mOWnl/Vod1dGkmVtIrNs1KBTCSG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWzb1h/btrH33mOWnl/Vod1dGkmVtIrNs1KBTCSG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWzb1h%2FbtrH33mOWnl%2FVod1dGkmVtIrNs1KBTCSG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;634&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자바 컴파일러(javac)&lt;/b&gt;가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Class Loader&lt;/b&gt;가 class파일들을 JVM Runtime Data Area로 로딩.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Execution Engine&lt;/b&gt;이 class 파일들을 해석함(interpret).&lt;/li&gt;
&lt;li&gt;해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행됨.&lt;br /&gt;Execution Engine에 의하여 GC, 스레드 동기화가 이루어짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JVM의 구조&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스 로더(Class Loader)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmbbHD/btrH2hZ81J3/VTv139DXAOiR78GNYEwkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmbbHD/btrH2hZ81J3/VTv139DXAOiR78GNYEwkX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmbbHD/btrH2hZ81J3/VTv139DXAOiR78GNYEwkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmbbHD%2FbtrH2hZ81J3%2FVTv139DXAOiR78GNYEwkX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;348&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바는 동적으로 클래스를 읽어옴. 따라서 프로그램이 실행 중인 런타임에서야 모든 코드가 JVM과 연결됨.&lt;br /&gt;이렇게 동적으로 클래스 로딩을 해주는 것이 클래스 로더.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 소스코드를 작성하면 .java파일이 생성되고 .java파일을 컴파일러가 컴파일하면 .class파일이 생성됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 로더는 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 &lt;b&gt;Runtime Data Area&lt;/b&gt;로 적재.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행 엔진(Execution Engine)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 로더에 의하여 JVM으로 로드된 .class파일(바이트 코드)들은 Runtime Data Area의 Method Area에 배치됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 실행 엔진이 정의된 내용으로 바이트 코드를 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 엔진은 바이트 코드를 명령어 단위로 읽어서 실행.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가비지 컬렉터(Garbage Collector)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM2RDP/btrH2hTskCX/JwsoNBF2Xe7PyPhDKYmFXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM2RDP/btrH2hTskCX/JwsoNBF2Xe7PyPhDKYmFXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM2RDP/btrH2hTskCX/JwsoNBF2Xe7PyPhDKYmFXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM2RDP%2FbtrH2hTskCX%2FJwsoNBF2Xe7PyPhDKYmFXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;411&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM은 가비지 컬렉터(Garbage Collector, GC)를 이용하여 사용자가 더이상 사용하지 않는 메모리를 자동으로 회수해줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 메모리를 관리하지 않아도 자동으로 관리해주므로 더욱 프로그래밍이 용이함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heap 메모리 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거. 이 동작을 하는 구체적인 시간은 알 수 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일지 정지 상태가 됨. (&quot;Stop-the-World&quot;)&lt;br /&gt;아래 링크에서 자세히 확인할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/248&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;가비지 컬렉션(Garbage Collection)&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;런타임 데이터 영역(Runtime Data Area)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4gZ32/btrH5fgj1YF/hcSkGQdqezlYzqpFvlzKb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4gZ32/btrH5fgj1YF/hcSkGQdqezlYzqpFvlzKb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4gZ32/btrH5fgj1YF/hcSkGQdqezlYzqpFvlzKb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4gZ32%2FbtrH5fgj1YF%2FhcSkGQdqezlYzqpFvlzKb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;325&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임 데이터 영역 = 프로그램을 수행하기 위하여 OS에서 메모리를 할당받은 공간.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임 데이터 영역은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모든 스레드(Thread)가 공유해서 사용하는 영역(GC의 대상)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙 영역(Heap Area)&lt;/li&gt;
&lt;li&gt;메서드 영역(Method Area)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스레드(Thread)마다 하나씩 생성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 영역(Stack Area)&lt;/li&gt;
&lt;li&gt;PC 레지스터(PC Register)&lt;/li&gt;
&lt;li&gt;네이티브 메서드 스택(Native Method Stack)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드 영역(Method Area)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상들을 저장하는 메모리 공간.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class, Interface에 대한 런타임 Constant Pool, Static 변수, Method 및 Field 등을 보관.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Field Information
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 멤버 변수의 이름, 데이터 타입, 접근 제어자에 대한 정보를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Method Information
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 멤버 메소드의 이름, 반환 타입, 매개변수, 접근 제어자에 대한 정보 저장&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Constant Pool
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스에서 사용된 상수가 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Static Variable
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적(static) 변수들에 대한 정보들이 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Type Information
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입이 class 혹은 interface인지 여부, 패키지명, Super Class 정보 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;힙 영역(Heap Area)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;new 키워드로 생성된 객체와 배열이 생성되는 영역&lt;/li&gt;
&lt;li&gt;주기적으로 GC가 제거해주는 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/burHJJ/btrH6HRcLjX/hkAtDKhG88HHY9DH5t523k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/burHJJ/btrH6HRcLjX/hkAtDKhG88HHY9DH5t523k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/burHJJ/btrH6HRcLjX/hkAtDKhG88HHY9DH5t523k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FburHJJ%2FbtrH6HRcLjX%2FhkAtDKhG88HHY9DH5t523k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;416&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 영역은 효율적인 GC를 위하여 위와 같이 크게 3가지의 영역으로 나누어짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Young Genertation(Eden+Survivor) 영역 - &lt;/b&gt;자바 객체가 생성되자마자 저장, 생긴지 얼마 되지 않은 객체들이 저장되는 영역.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당. Eden 영역에 데이터가 어느정도 할당되게 되면 참조정도에 따라 Survivor의 빈 공간으로 이동 or 회수됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Young Generation(Eden+survivor)영역이 차게되면 다시 한 번 참조 정도에 따라 Tenured Generation(Old)영역으로 이동하거나 회수됨.&amp;nbsp;Young Generation - Tenured Generation 사이의 GC를 &lt;b&gt;Minor GC&lt;/b&gt;라고 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Old 영역 에 할당된 메모리가 허용치를 넘게되면 Old 영역에 있는 모든 객체들을 검사하여 참조하지 않는 객체를 한꺼번에 삭제(GC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 작업은 시간이 오래걸리며 GC를 실행한 스레드를 제외한 모든 스레드는 작업을 멈추게됨(&quot;Stop-the-World&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &quot;Stop-the-World&quot;가 발생하고 Old 영역의 메모리를 회수하는 GC를 &lt;b&gt;Major GC&lt;/b&gt;라고 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 영역(Stack Area)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역 변수, 매개 변수, 반환 값 등이 생성되는 영역.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 호출될 때 메모리에 할당되고 메서드가 종료되면 할당 해제.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PC 레지스터(PC Register) - 프로그램 카운터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread가 생성될 때마다 생성되고 현재 스레드가 실행되는 부분의 주소와 명령을 지정하고 있는 영역.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 스레드마다 하나씩 존재.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네이티브 메서드 스택(Native Method Stack)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 이외의 언어(C, C++, 어셈블리 등)으로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역. - 일반적으로 C 스택을 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 JIN(Java Native Interpreter)를 통하여 바이트 코드로 전환하여 저장.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/828&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-factory.tistory.com/828&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>jvm</category>
      <category>Memory</category>
      <category>메모리</category>
      <category>자바 가상머신</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/247</guid>
      <comments>https://soopeach.tistory.com/247#entry247comment</comments>
      <pubDate>Sun, 24 Jul 2022 16:15:47 +0900</pubDate>
    </item>
    <item>
      <title>캐시 메모리(Cache Memory) 그리고 캐시의 지역성(Cache Locality)</title>
      <link>https://soopeach.tistory.com/246</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;캐시 메모리(Cache Memory)란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 메모리란 속도가 빠른 장치(CPU)와 속도가 느린 장치(RAM)사이의 속도 차이에 따른 병목 현상을 줄이기 위한 메모리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 메모리는 &lt;b&gt;메인메모리와 CPU사이에 위치&lt;/b&gt;해있으며 &lt;b&gt;속도가 굉장히 빠르지만 비싸고 용량이 적다&lt;/b&gt;는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 프로그램을 실행하게되면 RAM에서 로딩하고 CPU가 해당 프로그램을 캐시 메모리에 저장하고 필요할게 가져와서 사용하기 때문에 메인 메모리보다 실행 속도가 월등히 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적으로 캐싱을 하기 위하여 CPU가 다음에는 어떤 데이터를 원하는지 예측할 필요가 있는데 이를 위하여 캐시의 지역성(Cache Locality)이라는 개념이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;캐시의 지역성(Cache Locality)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시는 용량이 적기 때문에 효율성이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적으로 동작을 하기 위하여 캐시의 적중률(Hit-rate)를 극대화 시켜야하는데 이때 데이터 지역성(Locality)를 이용한다.&lt;br /&gt;지역성은 프로그램이 모든 코드 혹은 데이터에 균등하게 접근하지 않는 다는 특성을 전제조건으로 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 지역성은 기억장치 내의 데이터들에 균등하게 접근하는 것이 아니라 특정 순간 특정 부분을 집중적으로 참조하는 특성이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 캐시의 지역성으로는 공간 지역성(Spatial Locality)과 시간 지역성(Temopral Locality)가 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;공간 지역성(Spatial Locality)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최근에 사용했던 데이터와 인접한 데이터가 참조될 가능성이 높다는 특성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 캐시나 디스크 캐시일 경우 한 메모리 주소에 접근할 때 그 주소뿐 아니라 해당 블록을 전부 가져오는데 이때 메모리 주소를 오름차순 혹은 내림차순으로 접근하면, 캐시에 이미 저장된 같은 블록에 있는 데이터에 접근하므로 캐시의 효율성이 크게 상승.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시간 지역성(Temporal Locality)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최근에 사용했던 데이터가 재참조될 가능성이 높다는 특성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 상의 같은 주소에 여러 차례 읽기, 쓰기를 수행할 때 상대적으로 작은 캐시를 사용해도 효율성을 꾀할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>Cache</category>
      <category>캐시</category>
      <category>캐시메모리</category>
      <category>캐시의 지역성</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/246</guid>
      <comments>https://soopeach.tistory.com/246#entry246comment</comments>
      <pubDate>Sat, 23 Jul 2022 22:25:21 +0900</pubDate>
    </item>
    <item>
      <title>LinkedList 구현[코틀린 - Kotlin]</title>
      <link>https://soopeach.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실제 LinkedList는 훨씬 더 복잡하게 이루어져있지만.. 링크드 리스트의 원리를 간단히 파악해보기 위하여 삽입, 추가, 삭제 정도의 기능만 간단하게 구현해보았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LinkedList란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트(LinkedList)란 노드로 구성된 리스트 이다!&amp;nbsp;&lt;br /&gt;노드에는 데이터와 다음 노드를 가리키는 포인터가 존재한다. 코틀린에서는 포인터가 존재하지 않으므로 객체를 참조하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간복잡도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정값을 찾기 위해서는 첫 노드(헤드)부터 순차 탐색을 해야하므로 &lt;b&gt;시간복잡도가 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삽입
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결리스트는 노드로 이루어져있기 때문에 삽입을 할 때 &lt;b&gt;시간복잡도가 O(1)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;포인터를 사용하여 노드에서 포인터만 변경해주면 되기 때문.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 삭제하기 위해선 검색과 해당 값을 찾기 위하여 마찬가지로 &lt;b&gt;시간복잡도가 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연결리스트는 새로운 노드가 추가될 때마다 메모리가 새로 할당되므로 동적 메모리 할당이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;Array와 LinkedList의 차이&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Array는 Random Access가 가능하므로 &lt;b&gt;시간복잡도 O(1)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;LinkedList는 탐색의&lt;b&gt; 시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삽입 / 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Array는 삽입, 삭제 작업을 한 후 배열의 크기를 재할당한 후 복사해야 할 수도 있기 때문에&lt;b&gt;&lt;br /&gt;시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;LinkedList는 삽입 삭제의 &lt;b&gt;시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 탐색이 많이 사용된다면 array를, 삽입 / 삭제가 많이 사용된다면 linkedList를 사용하는 것이 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ArrayList와 LinkedList의 차이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ArrayList는 index를 사용하여 Random Access가 가능하므로 시간복잡도가 O(1)&lt;/li&gt;
&lt;li&gt;LinkedList는 탐색의&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삽입 / 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ArrayList는 삽입 / 삭제를 할 후 해당 데이터를 제외한 모든 데이터를 임시 배열을 생성 후 복사함.&lt;br /&gt;&lt;b&gt;시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;LinkedList는 삽입 삭제의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;시간복잡도 O(N)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 탐색이 많이 사용된다면 arrayList를, 삽입 / 삭제가 많이 사용된다면 linkedList를 사용하는 것이 효율적이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node 데이터 클래스&lt;/h3&gt;
&lt;pre id=&quot;code_1658566184788&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 노드 클래스는 데이터와 다음 노드의 위치를 가짐. 
data class Node&amp;lt;E&amp;gt;(
    var data: E,
    var next: Node&amp;lt;E&amp;gt;? = null
)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MyLinkedList 클래스&lt;/h3&gt;
&lt;pre id=&quot;code_1658566225141&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyLinkedList&amp;lt;E&amp;gt;{

    // head는 가장 첫 번째 노트를 뜻함. 없다면 리스트가 비어있다는 뜻.
    private var head: Node&amp;lt;E&amp;gt;? = null

    // 처음으로 삽입.(private)
    private fun addHead(item: E){
        head = Node(item, null)
    }

    // 맨 마지막에 삽입.
    fun add(item: E){
        // 헤드 노드가 비어있으면 처음으로 삽입.
        if(head == null) addHead(item)
        else {
            var curNode = head
            // 마지막 노드까지 탐색 (다음 노드가 null이면 마지막 노드)
            while (curNode?.next != null){
                // 다음 노드로 갱신.
                curNode = curNode?.next
            }
            // 가장 마지막 노드의 다음으로 아이템 추가
            curNode?.next = Node(item,null)
        }
    }

    // 원하는 인덱스에 삽입.
    fun add(index: Int, item: E){
        if (index == 0) {
            if (head == null) addHead(item)
            else {
                val newNode = Node(item,head)
                head = newNode
            }

        }
        var curIndex = 0
        var curNode = head
        var preNode: Node&amp;lt;E&amp;gt;? = null
        while (curIndex &amp;lt; index){
            preNode = curNode
            curNode = curNode?.next
            curIndex++
        }
        // 중간에 추가할 노드
        val newNode = Node(item, null)
        newNode.next = preNode?.next
        preNode?.next = newNode

    }

    // 아이템 삭제.
    fun remove(item: E){
        if(head == null) return println(&quot;값이 존재하지 않습니다.&quot;)
        else {
            // 만약 첫 번째 노드를 지워야 한다면
            // 새로운 head는 head의 next
            if (head?.data == item){
                head = head?.next
            } else {
                var curNode = head
                // curNode의 다음 노드의 데이터가 item일 때까지 순차 탐색
                // 만약 현재 node의 다음 노드의 next가 null이라면 해당 값이 존재하지 않는다는 뜻.
                while (curNode?.next?.data != item &amp;amp;&amp;amp; curNode?.next?.next != null){
                    curNode = curNode.next
                }
                // 삭제할 노드를 건너뛰고(삭제) 연결.
                curNode?.next = curNode?.next?.next
            }
        }
    }

    // 리스트의 모든 값 출력.
    fun printAll(){
        if(head == null) return println(&quot;리스트가 비어있습니다.&quot;)
        else {
            var curNode = head
            // 현재 노드의 다음 노드가 null이 아닐 때까지
            while (curNode?.next != null){
                println(&quot;${curNode?.data}&quot;)
                curNode = curNode?.next
            }
            println(&quot;${curNode?.data}&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메인 함수 및 출력 결과&lt;/h3&gt;
&lt;pre id=&quot;code_1658566357385&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main(){

    val myLinkedList = MyLinkedList&amp;lt;Int&amp;gt;()

    myLinkedList.add(1)// 1 삽입
    myLinkedList.add(2)// 2 삽입
    myLinkedList.add(4)// 4 삽입
    myLinkedList.add(5)// 5 삽입
    myLinkedList.add(0,0) // 0번째 인덱스(맨앞)에 0 삽입
    myLinkedList.add(3,3) // 3번째 인덱스에 3 삽입
    myLinkedList.printAll() // 전체 출력
    myLinkedList.println(&quot;---&quot;) // --- 출력
    myLinkedList.remove(4) // 4라는 값 제거
    myLinkedList.remove(2) // 2라는 값 제거
    myLinkedList.printAll() // 전체 출력

}

// 출력 결과
0
1
2
3
4
5
---
0
1
3
5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조(DataStructure)</category>
      <category>DataStructure</category>
      <category>linkedlist</category>
      <category>연결리스트</category>
      <category>자료구조</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/245</guid>
      <comments>https://soopeach.tistory.com/245#entry245comment</comments>
      <pubDate>Sat, 23 Jul 2022 18:19:00 +0900</pubDate>
    </item>
    <item>
      <title>쉘(Shell, sh)에 대하여...(개요, 종류, Bash의 기본기능)</title>
      <link>https://soopeach.tistory.com/244</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;쉘(Shell, sh)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘은 운영체제 커널과 사용자 간의 인터페이스&amp;nbsp;역할(다리의 역할)을 수행하는 텍스트 기반의 명령어 해석기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스는 현재 GUI 환경이 좋재하지만 GUI 환경이 구축되기 이전 CLI 환경에서 명령어를 타이핑하여 컴퓨터를 운용했다.&lt;br /&gt;요즘에도 CLI 환경에서만 이용할 수 있는 강력한 기능들이 있어 CLI는 여전히 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 CLI 환경(터미널)에 입력한 명령을 해석하고 관리하는 프로그램을 쉘(Shell) 이라고 한다.&amp;nbsp;&lt;br /&gt;쉘은 사용자와 커널을 연결시켜주는 역할을 하며 사용자가 입력한 명령어를 해석하여 운영체제가 해당 명령어를 알아들을 수 있게 해준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;쉘의 종류&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bourne Shell (sh)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유닉스 7버전의 기본 쉘. (본쉘)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C Shell (csh)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어 기반으로 개발되어 프로그램 작성 기능이 좋음.&lt;/li&gt;
&lt;li&gt;History, alias 등 여러 유용한 기능이 있음.&lt;/li&gt;
&lt;li&gt;명령행 편집 기능이 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TC Shell (tcsh)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 쉘과 통합해서 탄생된 쉘. TC쉘이라고 불림.&lt;/li&gt;
&lt;li&gt;C 쉘에 없는 명령어 자동완성, 편집기능을 지원.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Korn Shell (ksh)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본쉘을 확장해서 만들어진 쉘. C 쉘의 여러 기능이 추가됨.&lt;/li&gt;
&lt;li&gt;History, vi, 명령행 편집 등 여러 기능을 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bourne Again Shell (bash)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본쉘을 기반으로 만들어진 쉘.&lt;/li&gt;
&lt;li&gt;현재 리눅스의 표준쉘.&lt;/li&gt;
&lt;li&gt;GNU 프로젝트를 위해 개발되었으며 맥 OS 등 여러 운영체제에서 사용됨.&lt;/li&gt;
&lt;li&gt;sh와 호환되는 문법과 history, 명령행 편집 등 다양한 기능을 가지고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Z shell (zsh)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본쉘의 확장된 버전.&lt;/li&gt;
&lt;li&gt;다양한 기능, 플러그인, 테마가 존재.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맞춤법 검사.&lt;/li&gt;
&lt;li&gt;로그인 / 로그아웃 감시 기능.&lt;/li&gt;
&lt;li&gt;바이트 코드와 같은 내장 프로그래밍 기능.&lt;/li&gt;
&lt;li&gt;구문의 과학적 표기적 지원.&lt;/li&gt;
&lt;li&gt;부동 소수점 산술 및 기타 기능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 쉘 / C 쉘만 명령행 편집기능이 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 나열되어있는 순서로 개발됨.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bash 쉘의 기본 기능들( 일부 zsh와 비교 )&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;명령행 자동완성 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리눅스에서 가장 많이 사용되는 기능 중 하나&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 파일이나 디렉토리명이 너무 길어서 불편한 경우&amp;nbsp; 글자 몇 개만 입력한 뒤 Tab을 누르면 자동완성 기능이 동작.&lt;br /&gt;만약 해당 글자들이 포함되는 파일이 여러개 있다면 Tab을 두 번 눌러 목록을 확인할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- bash에서 Tab을 두 번 눌러 목록을 확인한 후 한 번 눌러 자동 완성하기.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAqXW/btrHZQ9HH4U/u5iOJ4Rhl1zz8JhAkvKjAK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAqXW/btrHZQ9HH4U/u5iOJ4Rhl1zz8JhAkvKjAK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAqXW/btrHZQ9HH4U/u5iOJ4Rhl1zz8JhAkvKjAK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/kAqXW/btrHZQ9HH4U/u5iOJ4Rhl1zz8JhAkvKjAK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;74&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- zsh에서 플러그인 설치를 통해 해당 기능이 자동으로 적용.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3qhZe/btrHZrWZ454/4R2ZtWzDRPhkBoGcASnqrK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3qhZe/btrHZrWZ454/4R2ZtWzDRPhkBoGcASnqrK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3qhZe/btrHZrWZ454/4R2ZtWzDRPhkBoGcASnqrK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/3qhZe/btrHZrWZ454/4R2ZtWzDRPhkBoGcASnqrK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;276&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;History 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C 쉘이나 ksh 등 여러 쉘이 가지고 있는 기본적인 기능들 중 하나&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행했던 명령어가 히스토리 리스트에 저장되어 방향키 위, 아래로 이전에 사용했던 명령어를 볼 수 있으면 해당 명령어 사용 가능.&lt;/li&gt;
&lt;li&gt;history 명령어 입력 시 사용자가 입력했던 명령어들(설정에 따라 다름)을 확인할 수 있음.&lt;/li&gt;
&lt;li&gt;History 관련 환경변수로 최대 저장되는 명령어의 개수, 파일크기, 위치등을 확인할 수 있음.&lt;/li&gt;
&lt;li&gt;echo $HISTSIZE로 최대 저장되는 명령어의 개수를 확인할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/35O4w/btrHZDbMRya/4qjZPqk7vE24flA3zRmxJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/35O4w/btrHZDbMRya/4qjZPqk7vE24flA3zRmxJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/35O4w/btrHZDbMRya/4qjZPqk7vE24flA3zRmxJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F35O4w%2FbtrHZDbMRya%2F4qjZPqk7vE24flA3zRmxJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;216&quot; height=&quot;39&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;History의 환경변수들
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HISTSIZE : 저장하는 명령어 개수 지정&lt;/li&gt;
&lt;li&gt;HISTFILESIZE : 실제 히스토리 파일의 크기&lt;/li&gt;
&lt;li&gt;HISYFILE : 히스토리 파일의 위치&lt;/li&gt;
&lt;li&gt;HISTCONTROL : 중복되는 명령의 기록 유무 지정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;= erasedups : 히스토리에서 중복 제거&lt;/li&gt;
&lt;li&gt;= ignoredups : 이전 행과 일치하면 등록 안함&lt;/li&gt;
&lt;li&gt;= ignorespace : 공백은 기록하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- bash에서 위, 아래 방향키로 history 탐색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfQgHa/btrH0vREvSY/WVPdbQDLP9A7sOr5kRPqBk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfQgHa/btrH0vREvSY/WVPdbQDLP9A7sOr5kRPqBk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfQgHa/btrH0vREvSY/WVPdbQDLP9A7sOr5kRPqBk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dfQgHa/btrH0vREvSY/WVPdbQDLP9A7sOr5kRPqBk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;58&quot; data-filename=&quot;1.gif&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;alias 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자주 사용하는 명령어들을 특정한 단어로 실행 가능하도록 만들어줌.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 명령어에 별칭을 지정하여 해당 별칭을 입력하면 설정된 명령어가 실행되도록 만들어줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alias 명령어 사용 방법&lt;/p&gt;
&lt;pre id=&quot;code_1658512052107&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alias 별칭='명령어'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭에 명령어를 지정. - 명령어는 (' ')작은 따옴표로 묶어야함.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1658512068102&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unalias 별칭&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp; 지정된 별칭 - 명령어 관계를 해제.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1658512083968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alias&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 명령어를 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 별칭으로 명령어 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIBHtC/btrHZCqrF9W/DyXFIB8zMnGsIEW0tge9Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIBHtC/btrHZCqrF9W/DyXFIB8zMnGsIEW0tge9Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIBHtC/btrHZCqrF9W/DyXFIB8zMnGsIEW0tge9Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIBHtC%2FbtrHZCqrF9W%2FDyXFIB8zMnGsIEW0tge9Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;59&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지정되어있는 명령어들 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzoE44/btrH2f77cUi/5w1UdkqpPhFKu8KMb71kc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzoE44/btrH2f77cUi/5w1UdkqpPhFKu8KMb71kc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzoE44/btrH2f77cUi/5w1UdkqpPhFKu8KMb71kc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzoE44%2FbtrH2f77cUi%2F5w1UdkqpPhFKu8KMb71kc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;237&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 별명으로 지정한 명령어 해제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-22 at 2.26.41 PM.png&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pj0R7/btrH1aTMBhZ/7iwUiXWmq0OXKbYVOZPh01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pj0R7/btrH1aTMBhZ/7iwUiXWmq0OXKbYVOZPh01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pj0R7/btrH1aTMBhZ/7iwUiXWmq0OXKbYVOZPh01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpj0R7%2FbtrH1aTMBhZ%2F7iwUiXWmq0OXKbYVOZPh01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;58&quot; data-filename=&quot;Screen Shot 2022-07-22 at 2.26.41 PM.png&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;명령행 편집 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명령어를 입력하는 도중 커서 이동이나 삭제 등을 빠르게 할 수 있는 기능.(mac에서도 control)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ctrl + a : 가장 왼쪽으로 이동&lt;/li&gt;
&lt;li&gt;Ctrl + e : 가장 오른쪽으로 이동&lt;/li&gt;
&lt;li&gt;Ctrl + k : 커서 오른쪽 행 전체 삭제&lt;/li&gt;
&lt;li&gt;Ctrl + u : 행 전체 삭제&lt;/li&gt;
&lt;li&gt;Ctrl + y : 삭제 취소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스[Linux]</category>
      <category>bash</category>
      <category>SH</category>
      <category>shell</category>
      <category>zsh</category>
      <category>쉘</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/244</guid>
      <comments>https://soopeach.tistory.com/244#entry244comment</comments>
      <pubDate>Sat, 23 Jul 2022 02:55:36 +0900</pubDate>
    </item>
    <item>
      <title>메모리의 동적할당(C언어)</title>
      <link>https://soopeach.tistory.com/243</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/241&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;C언어의 메모리 구조&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1658501085804&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C언어의 메모리 구조&quot; data-og-description=&quot;C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/241&quot; data-og-url=&quot;https://soopeach.tistory.com/241&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdAhoq/hyPbPmJcRU/UVhJDXGHPBmyyF4aquTW61/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/S8eBh/hyPaqa3XrD/nCqK3c9t84JZoOOrbwVbxk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/3heoS/hyPbMp0NXq/LRQPnbmXIH1i2HLZVkc4zk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/241&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/241&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdAhoq/hyPbPmJcRU/UVhJDXGHPBmyyF4aquTW61/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/S8eBh/hyPaqa3XrD/nCqK3c9t84JZoOOrbwVbxk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/3heoS/hyPbMp0NXq/LRQPnbmXIH1i2HLZVkc4zk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 메모리 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 미리 결정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런타임에 사용자가 결정하게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 런타임에 메모리를 할당받는 것을 메모리의 동적 할당(dynamic allocation) 이라고 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;malloc()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당하게 해주는 함수.&lt;/p&gt;
&lt;pre id=&quot;code_1658501220447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void *malloc(size_t size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;malloc() 함수는 인자로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달 받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;malloc()은 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 공간을 찾음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 찾은 공간의 첫 번째 바이트를 가리키는 주소값을 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 힙 영역에 할당할 수 있는 적당한 공간이 없다면 널 포인터를 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호 없는 정수!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;free()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해주는 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결장되어, 프로그램에 실행되는 내내 고정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변환됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 free() 함수를 사용하여 다 사용한 메모리를 해제하지 않으면, 메모리가 부족해지는 현상이 발생할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(Memory leak)이라고 함.&lt;/p&gt;
&lt;pre id=&quot;code_1658501892046&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void free(void *ptr);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수의 타입이 void형 포인터로 선언되어 있으므로, 어떠한 타입의 포인터라도 인수로 전달될 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;calloc()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calloc() 함수는 malloc() 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calloc() 함수와 malloc() 함수의 차이점은 인자의 개수임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 calloc() 함수는 메모리를 할당받은 후에 해당 메모리의 모든 비트값을 전부 0으로 초기화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calloc() 함수도 메모리를 동적으로 할당하기 때문에 free() 함수로 할당받은 메모리를 해제해야함.&lt;/p&gt;
&lt;pre id=&quot;code_1658502091013&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void *calloc(size_t nmemb, size_t size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calloc() 함수의 첫 번째 인수는 메모리 공간의 개수를, 두 번째 인수는 각 공간의 바이트 수를 나타냄.&lt;br /&gt;따라서 calloc() 함수는 힙 영역에 size 크기의 메모리 공간을 nmemb개 할당받을 수 있도록 요청함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 두 코드는 동일한 기능을 수행함.&lt;/p&gt;
&lt;pre id=&quot;code_1658502207238&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. ptr_arr = (int*) malloc(arr_len * sizeof(int));

2. ptr_arr = (int*) calloc(arr_len, sizeof(int));&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;realloc()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;realloc() 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용하는 함수.&lt;/p&gt;
&lt;pre id=&quot;code_1658502314310&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void *realloc(void *ptr, size_t size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;realloc() 함수의 첫 번째 인수는 크기를 바꾸고자 하는 메모리 공간을 가리키는 포인터를 전달받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 인수로는 해당 메모리 공간에 재할당할 크기를 전달함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 첫 번째 인수로 NULL이 전달되면 malloc() 함수와 같은 동작을 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출처&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/c/c_memory_malloc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.tcpschool.com/c/c_memory_malloc&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>c</category>
      <category>CS</category>
      <category>메모리</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/243</guid>
      <comments>https://soopeach.tistory.com/243#entry243comment</comments>
      <pubDate>Sat, 23 Jul 2022 00:06:38 +0900</pubDate>
    </item>
    <item>
      <title>스택 프레임(Stack Frame)이란? + 스택 오버플로우(Stack Overflow)</title>
      <link>https://soopeach.tistory.com/242</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/241&quot;&gt;C언어의 메모리 구조&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1658499398694&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C언어의 메모리 구조&quot; data-og-description=&quot;C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/241&quot; data-og-url=&quot;https://soopeach.tistory.com/241&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdAhoq/hyPbPmJcRU/UVhJDXGHPBmyyF4aquTW61/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/S8eBh/hyPaqa3XrD/nCqK3c9t84JZoOOrbwVbxk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/3heoS/hyPbMp0NXq/LRQPnbmXIH1i2HLZVkc4zk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/241&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/241&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdAhoq/hyPbPmJcRU/UVhJDXGHPBmyyF4aquTW61/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/S8eBh/hyPaqa3XrD/nCqK3c9t84JZoOOrbwVbxk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512,https://scrap.kakaocdn.net/dn/3heoS/hyPbMp0NXq/LRQPnbmXIH1i2HLZVkc4zk/img.png?width=314&amp;amp;height=512&amp;amp;face=0_0_314_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 메모리 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.&lt;br /&gt;스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반호나 주소값, 함수에서 선언된 지역변수 등이 저장됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 스택 프레임 덕분에 함수의 호출이 모두 끝난 후, 해당 함수가 호출되기 이전 상태로 돌아갈 수 있음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 프레임의 동작 방식&lt;/h3&gt;
&lt;pre id=&quot;code_1658499568673&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(void)

{

    func1();  // func1() 호출

    return 0;

}

 

void func1()

{

    func2();  // func2() 호출

}

 

void func2()

{

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 동작을 하는 코드가 있다고 해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zwhvv/btrH2hLwGl0/B3fF7Re5F1SMn22oGKHK3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zwhvv/btrH2hLwGl0/B3fF7Re5F1SMn22oGKHK3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zwhvv/btrH2hLwGl0/B3fF7Re5F1SMn22oGKHK3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZwhvv%2FbtrH2hLwGl0%2FB3fF7Re5F1SMn22oGKHK3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;452&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로그램이 실행되면 main() 함수가 호출되고 main() 함수의 스택 프레임이 스택에 저장.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. func2() 함수를 호출하면 해당 함수의 스택 프레임에 스택에 저장.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxNuMv/btrH0Quh3oM/Ks1PjUsFnyb1cCpnX6C5f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxNuMv/btrH0Quh3oM/Ks1PjUsFnyb1cCpnX6C5f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxNuMv/btrH0Quh3oM/Ks1PjUsFnyb1cCpnX6C5f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxNuMv%2FbtrH0Quh3oM%2FKs1PjUsFnyb1cCpnX6C5f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;456&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수읭 스택 프레임만이 스택에서 제거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 오버플로우(Stack Overflow)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 함수의 재귀 호출이 무한히 반복되면, 해당 프로그램은 스택 오버플로우(Stack overflow)에 의하여 종료됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 재귀 호출이 무한히 반복되면, 위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓이게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 계속 쌓이게 되면 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4bllL/btrHZVXuCq3/YX8OkkXQ2j16HqNg5JBUCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4bllL/btrHZVXuCq3/YX8OkkXQ2j16HqNg5JBUCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4bllL/btrHZVXuCq3/YX8OkkXQ2j16HqNg5JBUCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4bllL%2FbtrHZVXuCq3%2FYX8OkkXQ2j16HqNg5JBUCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;508&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, 해당 프로그램은 오동작을 하게 되거나 보안상 큰 취약점을 갖게됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, 에러를 발생시키고 강제 종료를 시키게 됨.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/c/c_memory_stackframe&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.tcpschool.com/c/c_memory_stackframe&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>c</category>
      <category>CS</category>
      <category>메모리</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/242</guid>
      <comments>https://soopeach.tistory.com/242#entry242comment</comments>
      <pubDate>Fri, 22 Jul 2022 23:35:28 +0900</pubDate>
    </item>
    <item>
      <title>C언어의 메모리 구조</title>
      <link>https://soopeach.tistory.com/241</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ctgwe/btrH0bTkIz6/JWj0TKvhTTkRkZ5Y9o8FL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ctgwe/btrH0bTkIz6/JWj0TKvhTTkRkZ5Y9o8FL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ctgwe/btrH0bTkIz6/JWj0TKvhTTkRkZ5Y9o8FL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCtgwe%2FbtrH0bTkIz6%2FJWj0TKvhTTkRkZ5Y9o8FL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;512&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 언어에서 대략 메모리 구조는 위와 같이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 영역(Code)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 영역은 실행할 프로그램의 코드가 저장되는 영역.&lt;/li&gt;
&lt;li&gt;텍스트 영역(Text)라고도 불림.&lt;/li&gt;
&lt;li&gt;CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 영역(Data)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장됨.&lt;/li&gt;
&lt;li&gt;데이터 영역은 프로그램의 시작과 함께 할당, 프로그램이 종료되면 소멸.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스택 영역(Stack)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역임.&lt;/li&gt;
&lt;li&gt;스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸.&lt;/li&gt;
&lt;li&gt;스택 영역에 저장되는 함수의 호출 정보는 &lt;a href=&quot;https://soopeach.tistory.com/242&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;스택 프레임(Stack Frame)&lt;/a&gt;이라고함.&lt;/li&gt;
&lt;li&gt;스택 영역은 push 동작으로 데이터를 저장하고, pop 동작으로 데이터를 인출.&lt;/li&gt;
&lt;li&gt;LIFO(Last In First Out) 방식이므로 가장 늦게 저장된 데이터가 가장 먼저 인출됨.&lt;/li&gt;
&lt;li&gt;스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;힙 영역(Heap)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리의 힙 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역.&lt;/li&gt;
&lt;li&gt;힙 영역은 사용자에 의해 메모리 공간이 &lt;a href=&quot;https://soopeach.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;동적으로 할당&lt;/a&gt;되고 해제됨.&lt;/li&gt;
&lt;li&gt;힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가 자료&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/242&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;스택 프레임(Stack Frame)이란? + 스택 오버플로우(Stack Overflow)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658500695260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스택 프레임(Stack Frame)이란? + 스택 오버플로우(Stack Overflow)&quot; data-og-description=&quot;C언어의 메모리 구조 C언어의 메모리 구조 C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림.&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/242&quot; data-og-url=&quot;https://soopeach.tistory.com/242&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dxEpzW/hyPbRZauqz/K3d9ZvLVu910JOjK8fOXOK/img.png?width=560&amp;amp;height=452&amp;amp;face=0_0_560_452,https://scrap.kakaocdn.net/dn/bcbaFY/hyPaCP7RA2/wVinGwp0mp6cOMwK1zaNNk/img.png?width=560&amp;amp;height=452&amp;amp;face=0_0_560_452,https://scrap.kakaocdn.net/dn/WEwCJ/hyPbMwNjln/O9KD5S5uYegOtQaLdICS1k/img.png?width=770&amp;amp;height=508&amp;amp;face=0_0_770_508&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/242&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/242&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dxEpzW/hyPbRZauqz/K3d9ZvLVu910JOjK8fOXOK/img.png?width=560&amp;amp;height=452&amp;amp;face=0_0_560_452,https://scrap.kakaocdn.net/dn/bcbaFY/hyPaCP7RA2/wVinGwp0mp6cOMwK1zaNNk/img.png?width=560&amp;amp;height=452&amp;amp;face=0_0_560_452,https://scrap.kakaocdn.net/dn/WEwCJ/hyPbMwNjln/O9KD5S5uYegOtQaLdICS1k/img.png?width=770&amp;amp;height=508&amp;amp;face=0_0_770_508');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스택 프레임(Stack Frame)이란? + 스택 오버플로우(Stack Overflow)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 메모리 구조 C언어의 메모리 구조 C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;메모리의 동적할당(C언어)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658502557153&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;메모리의 동적할당(C언어)&quot; data-og-description=&quot;C언어의 메모리 구조 C언어의 메모리 구조 C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림.&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/243&quot; data-og-url=&quot;https://soopeach.tistory.com/243&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NSqli/hyPaxVx1bf/JH3QAcUYwkCeNZgDd9r6RK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0EMzS/hyPaASh8Ku/a9DDUUuCzgV9UtYx39zLW1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ox0NT/hyPaAxXqcx/nU6sZYNBWeqv8akSG59cN0/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/243&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NSqli/hyPaxVx1bf/JH3QAcUYwkCeNZgDd9r6RK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0EMzS/hyPaASh8Ku/a9DDUUuCzgV9UtYx39zLW1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ox0NT/hyPaAxXqcx/nU6sZYNBWeqv8akSG59cN0/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;메모리의 동적할당(C언어)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 메모리 구조 C언어의 메모리 구조 C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출처&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/c/c_memory_structure&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.tcpschool.com/c/c_memory_structure&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터 과학(ComputerScience)</category>
      <category>c</category>
      <category>CS</category>
      <category>메모리</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/241</guid>
      <comments>https://soopeach.tistory.com/241#entry241comment</comments>
      <pubDate>Fri, 22 Jul 2022 23:12:20 +0900</pubDate>
    </item>
    <item>
      <title>코틀린으로 크롤링하기(Jsoup)</title>
      <link>https://soopeach.tistory.com/240</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;크롤링에 대하여&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 크롤링(Web-Crawling)이란 소프트웨어 프로그램을 통해 자동으로 웹사이트에 엑세스하여 데이터를 추출하는 것을 뜻합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링은 법적으로 민감하기 때문에 수집한 데이터를 사용하는데에 있어 제약이 있고 주의해야합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 언어의 다양한 라이브러리로 크롤링을 할 수 있는데 이 글에서는 코틀린으로 Jsoup라이브러리를 사용하여 크롤링을 해보겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IntelliJ에 Jsoup라이브러리 추가하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/239&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ntelliJ IDEA에서 외부 라이브러리 추가하기(jsoup)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658315499274&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;IntelliJ IDEA에서 외부 라이브러리 추가하기(jsoup)&quot; data-og-description=&quot;Kotlin으로 IntelliJ IDEA를 사용하며 콘솔창으로 작업되는 간단한 프로그램을 만들어보고 있다... 도중 외부 라이브러리가 필요하게 되어 IntelliJ 외부 라이브러리를 추가하는 법을 공부하게 되었다. &quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/239&quot; data-og-url=&quot;https://soopeach.tistory.com/239&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bN8JEl/hyO83NHhUK/1CXMlk7S1N2MBB0NKIzslK/img.png?width=596&amp;amp;height=284&amp;amp;face=0_0_596_284,https://scrap.kakaocdn.net/dn/bROP0z/hyPaAC7TJh/26EurkVh2nOke9LhStYqO0/img.png?width=596&amp;amp;height=284&amp;amp;face=0_0_596_284,https://scrap.kakaocdn.net/dn/1PwLO/hyO83z9TvX/fkDZLUAZuI1BbYtdcNoaP1/img.png?width=369&amp;amp;height=296&amp;amp;face=0_0_369_296&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/239&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/239&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bN8JEl/hyO83NHhUK/1CXMlk7S1N2MBB0NKIzslK/img.png?width=596&amp;amp;height=284&amp;amp;face=0_0_596_284,https://scrap.kakaocdn.net/dn/bROP0z/hyPaAC7TJh/26EurkVh2nOke9LhStYqO0/img.png?width=596&amp;amp;height=284&amp;amp;face=0_0_596_284,https://scrap.kakaocdn.net/dn/1PwLO/hyO83z9TvX/fkDZLUAZuI1BbYtdcNoaP1/img.png?width=369&amp;amp;height=296&amp;amp;face=0_0_369_296');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;IntelliJ IDEA에서 외부 라이브러리 추가하기(jsoup)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Kotlin으로 IntelliJ IDEA를 사용하며 콘솔창으로 작업되는 간단한 프로그램을 만들어보고 있다... 도중 외부 라이브러리가 필요하게 되어 IntelliJ 외부 라이브러리를 추가하는 법을 공부하게 되었다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 페이지 크롤링하기&lt;/h3&gt;
&lt;pre id=&quot;code_1658315560819&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.jsoup.Jsoup

val url = &quot;크롤링하고 싶은 주소&quot;
val docs = Jsoup.connect(url).get()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Jsoup의 conntect메서드를 통하여 url을 지정해주고 get()을 사용하면 해당 url의 모든 정보를 크롤링할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 8.52.18 PM.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KyeWx/btrHM7xrP7b/U7vCJMr7jnWTwscmNmNoYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KyeWx/btrHM7xrP7b/U7vCJMr7jnWTwscmNmNoYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KyeWx/btrHM7xrP7b/U7vCJMr7jnWTwscmNmNoYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKyeWx%2FbtrHM7xrP7b%2FU7vCJMr7jnWTwscmNmNoYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;527&quot; data-filename=&quot;Screen Shot 2022-07-20 at 8.52.18 PM.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 url인 이 블로그 메인페이지의 모든 HTML코드를 가져오는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;selector를 이용하여 원하는 부분만 추출하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지의 전체를 크롤링해서 데이터를 가져온 후 select()를 사용하여 원하는 부분의 정보들만 추출할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 8.57.38 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GY3fD/btrHObMAHAd/RWQG6pU7Iq5APpZotnxUu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GY3fD/btrHObMAHAd/RWQG6pU7Iq5APpZotnxUu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GY3fD/btrHObMAHAd/RWQG6pU7Iq5APpZotnxUu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGY3fD%2FbtrHObMAHAd%2FRWQG6pU7Iq5APpZotnxUu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;93&quot; data-filename=&quot;Screen Shot 2022-07-20 at 8.57.38 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지에서 F12를 누르면 위와같이 페이지가 구성된 HTML 소스코드를 확인할 수 있고 해당 소스 코드를 분석하여 원하는 부분의 데이터만 가져올 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진에서 보면 블로그의 메인페이지를 기준으로 post_title이라는 클래스를 가진 h2태그 안에 게시글의 제목이 있는 것을 확인할 수 있습니다. 이를 이용하여 메인페이지를 기준으로 게시글의 제목이 있는 부분만 코드를 불러오도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1658319035090&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val url = &quot;https://soopeach.tistory.com/&quot;
val docs = Jsoup.connect(url).get()

// 여러개의 selector를 사용할 때 붙여쓰는 경우 
// ex) h2.post_title 
// 은 클래스 속성이 post_title인 h2 태그,
// 공백을 두고 쓰는 경우
// ex &amp;gt; #sidebar #search-form 
// 은 아이디 속성이 #sidebar인 코드의 자식들 중 아이디 속성이 #search-form인 부분

// h2태그(&amp;lt;h2&amp;gt;)를 가진 코드
docs.select(&quot;h2&quot;)

// 클래스명이 post_title(class=&quot;post_title&quot;)인 코드
docs.select(&quot;.post_title&quot;)

// h2태그를 가진 코드 중 클래스명이 post_title인 코드
docs.select(&quot;h2.post_title&quot;)

// id가 sidebar(id=&quot;sidebar&quot;)인 코드
docs.select(&quot;#sidebar&quot;)

// id가 sidebar인 코드중 id가 search-form인 코드
docs.select(&quot;#sidebar #search-form&quot;)

// id가 sidebar인 코드중 id가 search-form인 코드 중 class가 search-bar인 코드
docs.select(&quot;#sidebar #search-form .search-bar&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jsoup으로 가져온 파일은 Document 타입의 객체가 되는데 Document 클래스에 있는 select() 메서드를 이용하여 css를 이용한 쿼리문을 지정해줄 수 있습니다. 위의 코드에서 예시를 확인할 수 있습니다.&amp;nbsp;&lt;br /&gt;태그로 찾고 싶은 경우는 태그를 그대로, id는 #id명, class는 .class명, 또한 계층적인 구조도 위와 같이 연속적으로 쿼리를 지정하여 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsoup.org/cookbook/extracting-data/selector-syntax&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;훨씬 다양한 selector문법은 공식문서&lt;/a&gt;&amp;nbsp;에서 확인할 수 있습니다!&lt;/p&gt;
&lt;figure id=&quot;og_1658319294494&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Use selector-syntax to find elements: jsoup Java HTML parser&quot; data-og-description=&quot;Use selector-syntax to find elements Problem You want to find or manipulate elements using a CSS or jquery-like selector syntax. Solution Use the Element.select(String selector) and Elements.select(String selector) methods: File input = new File(&amp;quot;/tmp/inpu&quot; data-og-host=&quot;jsoup.org&quot; data-og-source-url=&quot;https://jsoup.org/cookbook/extracting-data/selector-syntax&quot; data-og-url=&quot;https://jsoup.org/cookbook/extracting-data/selector-syntax&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g8woM/hyPaCOvXBE/Bsm8KJaBJ3DZIQ6Wije2M1/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480&quot;&gt;&lt;a href=&quot;https://jsoup.org/cookbook/extracting-data/selector-syntax&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsoup.org/cookbook/extracting-data/selector-syntax&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g8woM/hyPaCOvXBE/Bsm8KJaBJ3DZIQ6Wije2M1/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Use selector-syntax to find elements: jsoup Java HTML parser&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use selector-syntax to find elements Problem You want to find or manipulate elements using a CSS or jquery-like selector syntax. Solution Use the Element.select(String selector) and Elements.select(String selector) methods: File input = new File(&quot;/tmp/inpu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsoup.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 9.01.02 PM.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqOu7f/btrHOASXtIb/wK9Tr1vnEgZw4YFg5imT7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqOu7f/btrHOASXtIb/wK9Tr1vnEgZw4YFg5imT7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqOu7f/btrHOASXtIb/wK9Tr1vnEgZw4YFg5imT7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqOu7f%2FbtrHOASXtIb%2FwK9Tr1vnEgZw4YFg5imT7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;661&quot; data-filename=&quot;Screen Shot 2022-07-20 at 9.01.02 PM.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cssQuery로 &quot;.post_title&quot; 사용하여 클래스명이 post_tilte인 속성을 가지는 코드들만 추출하고 출력한 모습입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타임아웃(시간제한) 지정하기&lt;/h3&gt;
&lt;pre id=&quot;code_1658319434914&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최대 1초
val docs = Jsoup.connect(url).timeout(1000).get()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 형태로 timeout을 지정하여 최대 응답시간을 설정할 수 있습니다. 해당 시간이 초과된다면&lt;/p&gt;
&lt;pre id=&quot;code_1658319473994&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Exception in thread &quot;main&quot; java.net.SocketTimeoutException: Read timed out&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러를 발생시키게 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 9.18.24 PM.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rv7ec/btrHN2CrrVj/IvwkVOxkFRgdUQaJOGs3LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rv7ec/btrHN2CrrVj/IvwkVOxkFRgdUQaJOGs3LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rv7ec/btrHN2CrrVj/IvwkVOxkFRgdUQaJOGs3LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frv7ec%2FbtrHN2CrrVj%2FIvwkVOxkFRgdUQaJOGs3LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;757&quot; data-filename=&quot;Screen Shot 2022-07-20 at 9.18.24 PM.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>Crawling</category>
      <category>JSoup</category>
      <category>kotlin</category>
      <category>코틀린</category>
      <category>크롤링</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/240</guid>
      <comments>https://soopeach.tistory.com/240#entry240comment</comments>
      <pubDate>Wed, 20 Jul 2022 21:20:10 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ IDEA에서 외부 라이브러리 추가하기(jsoup)</title>
      <link>https://soopeach.tistory.com/239</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin으로 IntelliJ IDEA를 사용하며 콘솔창으로 작업되는 간단한 프로그램을 만들어보고 있다...&amp;nbsp;&lt;br /&gt;도중 외부 라이브러리가 필요하게 되어 IntelliJ 외부 라이브러리를 추가하는 법을 공부하게 되었다.&lt;br /&gt;'코틀린에서 외부 라이브러리를 추가하는 법' 이라고 검색하니 거의 대부분의 글들은 안드로이드를 기반으로 설명을 해주었다...&lt;br /&gt;(Gradle 사용하는 경우)&lt;br /&gt;하지만 IntelliJ에서도 간단하게 외부 라이브러리를 추가할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가할 라이브러리 다운&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글을 크롤링을 하기위한 라이브러리인 jsoup을 사용할 것이다.&lt;br /&gt;&lt;a href=&quot;https://jsoup.org/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jsoup.org/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658291159995&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download and install jsoup&quot; data-og-description=&quot;Download and install jsoup jsoup is available as a downloadable .jar java library. The current release version is 1.15.2. What's new See the 1.15.2 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso&quot; data-og-host=&quot;jsoup.org&quot; data-og-source-url=&quot;https://jsoup.org/download&quot; data-og-url=&quot;https://jsoup.org/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDgeCt/hyO82177LD/U8GEV4kXhhLjnUWkntK6Q1/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480&quot;&gt;&lt;a href=&quot;https://jsoup.org/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsoup.org/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDgeCt/hyO82177LD/U8GEV4kXhhLjnUWkntK6Q1/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download and install jsoup&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download and install jsoup jsoup is available as a downloadable .jar java library. The current release version is 1.15.2. What's new See the 1.15.2 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsoup.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요 링크에서 jar 파일로 되어진 jsoup의 라이브러리를 받아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IntelliJ 프로젝트에서 라이브러리 추가&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.29.24 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZrEew/btrHJb7EvBq/k80MCDBbRGbd2xakvHEW5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZrEew/btrHJb7EvBq/k80MCDBbRGbd2xakvHEW5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZrEew/btrHJb7EvBq/k80MCDBbRGbd2xakvHEW5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZrEew%2FbtrHJb7EvBq%2Fk80MCDBbRGbd2xakvHEW5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;284&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.29.24 PM.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsoup 라이브러리를 추가하기 전에는 위와같이 jsoup이 import가 되지 않는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.30.17 PM.png&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkQQwh/btrHJjqHl8t/JGVdfVtUKjDrdUR99xMmI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkQQwh/btrHJjqHl8t/JGVdfVtUKjDrdUR99xMmI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkQQwh/btrHJjqHl8t/JGVdfVtUKjDrdUR99xMmI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkQQwh%2FbtrHJjqHl8t%2FJGVdfVtUKjDrdUR99xMmI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;206&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.30.17 PM.png&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsoup 라이브러리를 추가하기 위하여 File -&amp;gt; Project Structure 경로로 이동해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.30.54 PM.png&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKHUS/btrHJZyR7wk/98s879iiZ1vghfVgm5PJh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKHUS/btrHJZyR7wk/98s879iiZ1vghfVgm5PJh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKHUS/btrHJZyR7wk/98s879iiZ1vghfVgm5PJh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKHUS%2FbtrHJZyR7wk%2F98s879iiZ1vghfVgm5PJh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;384&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.30.54 PM.png&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 메뉴에서 Modules -&amp;gt; Dependencies경로로 이동하면 위와 같은 화면이 나타나게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.31.55 PM.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqyCs/btrHK1bVbnW/fHms4n8yMigJFaDnnfsJRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqyCs/btrHK1bVbnW/fHms4n8yMigJFaDnnfsJRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqyCs/btrHK1bVbnW/fHms4n8yMigJFaDnnfsJRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqyCs%2FbtrHK1bVbnW%2FfHms4n8yMigJFaDnnfsJRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;401&quot; height=&quot;236&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.31.55 PM.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Export위에 있는 +버튼을 눌러 위에서 다운로드해준 jar 파일을 추가해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.32.31 PM.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FxMC1/btrHM7QgduO/ShKbbuI36AzlVy0cHB9bwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FxMC1/btrHM7QgduO/ShKbbuI36AzlVy0cHB9bwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FxMC1/btrHM7QgduO/ShKbbuI36AzlVy0cHB9bwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFxMC1%2FbtrHM7QgduO%2FShKbbuI36AzlVy0cHB9bwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;678&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.32.31 PM.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체크 상자를 위와 같이 체크표시 해준 후 OK를 눌러주면 적용 끝!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.33.27 PM.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8kuB/btrHKo6jRZ9/x7xnMWeZXkRO0dOgljiKE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8kuB/btrHKo6jRZ9/x7xnMWeZXkRO0dOgljiKE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8kuB/btrHKo6jRZ9/x7xnMWeZXkRO0dOgljiKE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8kuB%2FbtrHKo6jRZ9%2Fx7xnMWeZXkRO0dOgljiKE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;296&quot; data-filename=&quot;Screen Shot 2022-07-20 at 1.33.27 PM.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생하지 않고 import가 되는 모습을 확인할 수 있다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- 회색인 이유는 사용하지 않아서!&lt;/p&gt;</description>
      <category>정보[Information]</category>
      <category>IntelliJ</category>
      <category>kotlin</category>
      <category>인텔리제이</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/239</guid>
      <comments>https://soopeach.tistory.com/239#entry239comment</comments>
      <pubDate>Wed, 20 Jul 2022 13:34:01 +0900</pubDate>
    </item>
    <item>
      <title>M1 mac(실리콘 맥)에서 무료 가상환경에 Linux 설치하기[Ubuntu - 우분투]</title>
      <link>https://soopeach.tistory.com/238</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;m1 Mac에서는 VMWare 혹은 &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Parallels의 가상환경을 사용할 수 있는데 둘 다 유료라서 사용에 제약이 있을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;UTM을 이용하면 무료로 가상환경에 Linux설치를 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://mac.getutm.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mac.getutm.app/&lt;/a&gt; &lt;/p&gt;
&lt;figure id=&quot;og_1658206276487&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;UTM&quot; data-og-description=&quot;Securely run operating systems on your Mac&quot; data-og-host=&quot;mac.getutm.app&quot; data-og-source-url=&quot;https://mac.getutm.app/&quot; data-og-url=&quot;https://mac.getutm.app/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhVWTw/hyO8RFhwoW/rxEzYC3J3PsBTf4cvkD3K0/img.png?width=800&amp;amp;height=646&amp;amp;face=0_0_800_646,https://scrap.kakaocdn.net/dn/BAsmG/hyO8VgAD8M/OiQgWTgHM1XKrOyeET91lk/img.png?width=800&amp;amp;height=646&amp;amp;face=0_0_800_646,https://scrap.kakaocdn.net/dn/barh3q/hyO7GegYSQ/LKlgurm0GKGKnvgkKt7JO1/img.png?width=800&amp;amp;height=640&amp;amp;face=0_0_800_640&quot;&gt;&lt;a href=&quot;https://mac.getutm.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mac.getutm.app/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhVWTw/hyO8RFhwoW/rxEzYC3J3PsBTf4cvkD3K0/img.png?width=800&amp;amp;height=646&amp;amp;face=0_0_800_646,https://scrap.kakaocdn.net/dn/BAsmG/hyO8VgAD8M/OiQgWTgHM1XKrOyeET91lk/img.png?width=800&amp;amp;height=646&amp;amp;face=0_0_800_646,https://scrap.kakaocdn.net/dn/barh3q/hyO7GegYSQ/LKlgurm0GKGKnvgkKt7JO1/img.png?width=800&amp;amp;height=640&amp;amp;face=0_0_800_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;UTM&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Securely run operating systems on your Mac&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mac.getutm.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측에 Download를 누르면 무료로 다운로드할 수 있고 우측에 있는 Appstore를 누르면 Appstore에서 약 12000원을 주고 구입할 수 있다. 기능적으로는 전적으로 동일하니 개발자에게 도움이 되고싶다면 유로버전을, 그럴 여유가 없다면 무료버전을 이용하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;우분투 Image 파일 다운로드 하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server/arm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ubuntu.com/download/server/arm&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658207050356&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ubuntu for ARM | Download | Ubuntu&quot; data-og-description=&quot;Download Ubuntu Server for ARM with support for the very latest ARM-based server systems powered by certified 64-bit processors.&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/download/server/arm&quot; data-og-url=&quot;https://ubuntu.com/download/server/arm&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server/arm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/download/server/arm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu for ARM | Download | Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download Ubuntu Server for ARM with support for the very latest ARM-based server systems powered by certified 64-bit processors.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크에서 Ubuntu 22.04(LTS)버전의 이미지 파일을 다운로드 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UTM로 Linux 가상 머신 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UTM을 설치한 후 실행해보면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-19 at 12.39.28 PM.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPTJtw/btrHIYlcz4g/Tq3kMktkkcCZmjkKidSQ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPTJtw/btrHIYlcz4g/Tq3kMktkkcCZmjkKidSQ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPTJtw/btrHIYlcz4g/Tq3kMktkkcCZmjkKidSQ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPTJtw%2FbtrHIYlcz4g%2FTq3kMktkkcCZmjkKidSQ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;653&quot; data-filename=&quot;Screen Shot 2022-07-19 at 12.39.28 PM.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 화면이 나타나는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 상단에 있는 Create a New Virtual Machine을 눌러 새로운 가상 머신을 만들어보자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSrkEV/btrHIfHMD4d/jR18xxHXdHJaKStxr4HT20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSrkEV/btrHIfHMD4d/jR18xxHXdHJaKStxr4HT20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSrkEV/btrHIfHMD4d/jR18xxHXdHJaKStxr4HT20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSrkEV%2FbtrHIfHMD4d%2FjR18xxHXdHJaKStxr4HT20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;899&quot; height=&quot;656&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Virtualize 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBsLI7/btrHDbUmj32/fVWOu5rUtIqqK05lKVTDe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBsLI7/btrHDbUmj32/fVWOu5rUtIqqK05lKVTDe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBsLI7/btrHDbUmj32/fVWOu5rUtIqqK05lKVTDe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBsLI7%2FbtrHDbUmj32%2FfVWOu5rUtIqqK05lKVTDe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;650&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CYDyu/btrHIGZqSi2/ZXLYc8iZR8M41J4To1NGx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CYDyu/btrHIGZqSi2/ZXLYc8iZR8M41J4To1NGx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYDyu/btrHIGZqSi2/ZXLYc8iZR8M41J4To1NGx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYDyu%2FbtrHIGZqSi2%2FZXLYc8iZR8M41J4To1NGx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;650&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Boot ISO Image에서 Browse를 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9VYZp/btrHCZzoTl7/svklWdjWUk1zCLO1UNgZh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9VYZp/btrHCZzoTl7/svklWdjWUk1zCLO1UNgZh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9VYZp/btrHCZzoTl7/svklWdjWUk1zCLO1UNgZh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9VYZp%2FbtrHCZzoTl7%2FsvklWdjWUk1zCLO1UNgZh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;642&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 다운받은 ubuntu 이미지 파일 선택 후 넘어가면 가상 기기의 사양을 선택하게 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTbVnX/btrHFQhtQwP/1sdYyD52G4veyhltTIjhFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTbVnX/btrHFQhtQwP/1sdYyD52G4veyhltTIjhFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTbVnX/btrHFQhtQwP/1sdYyD52G4veyhltTIjhFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTbVnX%2FbtrHFQhtQwP%2F1sdYyD52G4veyhltTIjhFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;897&quot; height=&quot;650&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;memory와 cpu 를 알아서 사양을 조절해줌.(필자의 컴퓨터는 M1 Pro 기본형-16기가 메모리, 512기가 ssd)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LP8Vh/btrHDcy1Wet/srUKB1NYZynB2Undtu7t40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LP8Vh/btrHDcy1Wet/srUKB1NYZynB2Undtu7t40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LP8Vh/btrHDcy1Wet/srUKB1NYZynB2Undtu7t40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLP8Vh%2FbtrHDcy1Wet%2FsrUKB1NYZynB2Undtu7t40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;651&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장용량 조정.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk9RGz/btrHEXVoiZl/g3pspFXcakdMeJcd9xzUK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk9RGz/btrHEXVoiZl/g3pspFXcakdMeJcd9xzUK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk9RGz/btrHEXVoiZl/g3pspFXcakdMeJcd9xzUK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk9RGz%2FbtrHEXVoiZl%2Fg3pspFXcakdMeJcd9xzUK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;650&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 폴더는 별도의 설정을 하지 않았음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9VJb/btrHDdrawI1/mhELO1L587LNVYGTiXfOz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9VJb/btrHDdrawI1/mhELO1L587LNVYGTiXfOz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9VJb/btrHDdrawI1/mhELO1L587LNVYGTiXfOz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9VJb%2FbtrHDdrawI1%2FmhELO1L587LNVYGTiXfOz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;651&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 머신의 이름을 지정.&lt;br /&gt;짠~! 가상머신이 완성되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상머신을 실행하여 우분투 설치하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3FEtV/btrHDByF63l/lfh760SQUiU0IkPsyi6cIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3FEtV/btrHDByF63l/lfh760SQUiU0IkPsyi6cIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3FEtV/btrHDByF63l/lfh760SQUiU0IkPsyi6cIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3FEtV%2FbtrHDByF63l%2Flfh760SQUiU0IkPsyi6cIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;897&quot; height=&quot;652&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동영상 재생 표시(?) == 플레이 버튼 을 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8FFEb/btrHDdEOjGU/PJcsTntG8q8JFsXjaszfD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8FFEb/btrHDdEOjGU/PJcsTntG8q8JFsXjaszfD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8FFEb/btrHDdEOjGU/PJcsTntG8q8JFsXjaszfD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8FFEb%2FbtrHDdEOjGU%2FPJcsTntG8q8JFsXjaszfD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;650&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Install Ubuntu Server에서 Enter를 눌러 설치 시작!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caApYq/btrHIGZxL6b/kKNqvXk2G2RPFdqszQKwL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caApYq/btrHIGZxL6b/kKNqvXk2G2RPFdqszQKwL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caApYq/btrHIGZxL6b/kKNqvXk2G2RPFdqszQKwL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaApYq%2FbtrHIGZxL6b%2FkKNqvXk2G2RPFdqszQKwL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1321&quot; height=&quot;623&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언어는 기본적인 영어로 지정&lt;/li&gt;
&lt;li&gt;그 외의 나머지 설정등은 따로 손 건들지 않았다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name, password 부분은 개인이 원하는 것으로 지정 ( 로그인할 때 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOtpN/btrHIGrGJEP/g9NGLgek9BE4k2bKtGFvU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOtpN/btrHIGrGJEP/g9NGLgek9BE4k2bKtGFvU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOtpN/btrHIGrGJEP/g9NGLgek9BE4k2bKtGFvU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOtpN%2FbtrHIGrGJEP%2Fg9NGLgek9BE4k2bKtGFvU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;829&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 화면은 설치중인 화면이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료된다면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ovM6k/btrHDByJCJy/45ohb10b9XMrCvKCbq39n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ovM6k/btrHDByJCJy/45ohb10b9XMrCvKCbq39n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ovM6k/btrHDByJCJy/45ohb10b9XMrCvKCbq39n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FovM6k%2FbtrHDByJCJy%2F45ohb10b9XMrCvKCbq39n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;84&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단바가 요렇게 바뀌고&lt;br /&gt;view full log 아래에 reboot 관련 메뉴가 나오는데 &lt;s&gt;눌러서 재부팅 하기!&lt;/s&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;s&gt;재부팅을 한 후 무한 로딩이 발생하는 경우가 있는데 그럼 종료 후 다시 재부팅 하기!&lt;/s&gt;&lt;s&gt;&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 머신을 종료한 후 CD/DVD에서 우분투 ISO 파일 제거하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3FuG/btrHDANosUy/meNK1HZINVyggXlM6K5T90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3FuG/btrHDANosUy/meNK1HZINVyggXlM6K5T90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3FuG/btrHDANosUy/meNK1HZINVyggXlM6K5T90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3FuG%2FbtrHDANosUy%2FmeNK1HZINVyggXlM6K5T90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;290&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CD/DVD를 Clear하여 주기!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOcbJK/btrHFHq9ZN2/MUJu0oKGIlhwHUAVn2y3Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOcbJK/btrHFHq9ZN2/MUJu0oKGIlhwHUAVn2y3Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOcbJK/btrHFHq9ZN2/MUJu0oKGIlhwHUAVn2y3Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOcbJK%2FbtrHFHq9ZN2%2FMUJu0oKGIlhwHUAVn2y3Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;641&quot; height=&quot;284&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CD/DVD가 empty가 된 것을 확인할 수 있다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 가상 머신을 돌려보면!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tAlut/btrHFQWfYec/mKrKCLaaaVcdK4FPxFxER0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tAlut/btrHFQWfYec/mKrKCLaaaVcdK4FPxFxER0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tAlut/btrHFQWfYec/mKrKCLaaaVcdK4FPxFxER0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtAlut%2FbtrHFQWfYec%2FmKrKCLaaaVcdK4FPxFxER0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;838&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu Server가 정상적으로 접속됨을 확인할 수 있다!!&lt;/p&gt;</description>
      <category>리눅스[Linux]</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/238</guid>
      <comments>https://soopeach.tistory.com/238#entry238comment</comments>
      <pubDate>Tue, 19 Jul 2022 14:45:33 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-07-11 until 2022-07-17</title>
      <link>https://soopeach.tistory.com/237</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-18 at 10.16.34 PM.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJCld/btrHEYeDHlr/ltQxj0byWPhrOhbMKplcHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJCld/btrHEYeDHlr/ltQxj0byWPhrOhbMKplcHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJCld/btrHEYeDHlr/ltQxj0byWPhrOhbMKplcHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJCld%2FbtrHEYeDHlr%2FltQxj0byWPhrOhbMKplcHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;1014&quot; data-filename=&quot;Screen Shot 2022-07-18 at 10.16.34 PM.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하하 이번 주는 할 말이없다... 번아웃 온김에 그냥 아예 푹 쉬어버렸다...&amp;nbsp;&lt;br /&gt;오늘부터 네이버 부스트 캠프 7기가 시작되었는데... 새로운 경험이며 굉장히 재미있다... 오늘 코딩한 시간이 지난주에 코딩한 시간보다 많다...&amp;nbsp;&lt;br /&gt;이번 주는 어느정도의 강제성도 있으니 분발하여 화이팅 해봐야겠다.&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/237</guid>
      <comments>https://soopeach.tistory.com/237#entry237comment</comments>
      <pubDate>Mon, 18 Jul 2022 22:18:46 +0900</pubDate>
    </item>
    <item>
      <title>Git, Gist에 이미지 혹은 움짤 업로드 하기</title>
      <link>https://soopeach.tistory.com/236</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;README.md에 설명을 작성하던 중 로컬에 있는 이미지를 올린 후 Git으로 Push를 하면 원격 저장소에 있는 README.md에는 이미지가 아니라 로컬 이미지 경로가 그대로 출력되는 것을 확인하였습니다... &lt;br /&gt;이를 해결하기 위하여 깃허브 서버로 이미지를 업로드한 후 해당 링크를 복사해서 로컬, 원격 저장소에 있는 README.md에 붙여넣으면 정상적으로 이미지가 나타나는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;깃허브 서버로 이미지 업로드 하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브 서버로 이미지를 업로드하기 위하여 아무 repository에서 README 혹은 issues를 입력하는 화면으로 이동합니다.&amp;nbsp;&lt;br /&gt;이 글에서는 issue를 기준으로 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;issues -&amp;gt; New issue로 들어오면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.47.45 PM.png&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QMOUr/btrHCxPIbqf/HLQnIdwyk60S4Xi4414vWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QMOUr/btrHCxPIbqf/HLQnIdwyk60S4Xi4414vWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QMOUr/btrHCxPIbqf/HLQnIdwyk60S4Xi4414vWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQMOUr%2FbtrHCxPIbqf%2FHLQnIdwyk60S4Xi4414vWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;435&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.47.45 PM.png&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 화면을 볼 수 있습니다! 로컬에 있는 이미지를 Leave a comment 부분으로 드롭하게 되면 깃허브 서버에 이미지가 업로드 되어 링크가 생기는데 해당 링크를 이용하면 로컬, 원격 어디서든 이미지를 업로드할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.49.18 PM.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NaphJ/btrHCoyCN5B/aQIMRSmhoAv2K2lOgG2X1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NaphJ/btrHCoyCN5B/aQIMRSmhoAv2K2lOgG2X1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NaphJ/btrHCoyCN5B/aQIMRSmhoAv2K2lOgG2X1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNaphJ%2FbtrHCoyCN5B%2FaQIMRSmhoAv2K2lOgG2X1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;436&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.49.18 PM.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 생성이 되는 링크를 사용하면 됩니다.&amp;nbsp;&lt;br /&gt;png, jpeg, gif등의 포멧모두 위와 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Preview에서 이미지로 보이는 모습&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.49.23 PM.png&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caLSPJ/btrHBztEj93/eAqJOkxr0Ik6A9Ttkq01x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caLSPJ/btrHBztEj93/eAqJOkxr0Ik6A9Ttkq01x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caLSPJ/btrHBztEj93/eAqJOkxr0Ik6A9Ttkq01x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaLSPJ%2FbtrHBztEj93%2FeAqJOkxr0Ik6A9Ttkq01x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;762&quot; data-filename=&quot;Screen Shot 2022-07-18 at 6.49.23 PM.png&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>정보[Information]</category>
      <category>GIST</category>
      <category>git</category>
      <category>깃허브</category>
      <category>이미지</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/236</guid>
      <comments>https://soopeach.tistory.com/236#entry236comment</comments>
      <pubDate>Mon, 18 Jul 2022 18:51:11 +0900</pubDate>
    </item>
    <item>
      <title>Kogorithm을 수료하며...(알고리즘 풀이 스터디 - Kotlin)</title>
      <link>https://soopeach.tistory.com/235</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Kogorithm - 전현수 copy.jpg&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qaUx3/btrHppSBk3r/dXRQqggglEX9zRATblhKAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qaUx3/btrHppSBk3r/dXRQqggglEX9zRATblhKAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qaUx3/btrHppSBk3r/dXRQqggglEX9zRATblhKAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqaUx3%2FbtrHppSBk3r%2FdXRQqggglEX9zRATblhKAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1755&quot; height=&quot;1240&quot; data-filename=&quot;Kogorithm - 전현수 copy.jpg&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kogorithm 스터디가 끝나고 스터디장님께서 정말 너무 너무 이쁜 수료증을 만들어주셨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이름 그대로 코틀린으로 알고리즘을 푸는 스터디였는데 엄청난 실력을 요구하지는 않아서 덕분에 참여할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃을 사용하여 스터디를 진행하였기 때문에 팀원들에게 피해를 끼치지 않으려고 처음에 깃도 정말 엄청 공부했었다. 덕분에 clone, push, commit 밖에 할 줄 몰랐던 내가 이제는 branch를 파서 PR도 보낼 수 있고 이슈도 사용할 수 있게 되었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디 인원은 나를 포함한 총 4명으로 구성되었고 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;매주 정해진 유형의 문제를 5문제를 풀어온 후 토요일마다 서로 코드리뷰를 해준 후 이전 코딩테스트에 나왔던 기출문제 하나를 같이 푸는 식으로 진행되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드리뷰는 처음 해보는 것이라서 떨리기도 하고 미흡하기도 했을 텐데 팀원분들이 정말 잘 이해해주셔서 너무 감사하다. 동일한 문제들을 각자의 코딩 스타일대로 풀어온 후 서로 리뷰를 하니 새로운 방식, 새로운 함수들을 알 수 있게 되어 이 부분이 정말 큰 도움이 된 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 알고리즘을 조금씩 꾸준히 하긴 했지만, 혼자서 하면 금방 의지가 식을 것 같아 스터디를 참여했다. 다른 분들이 열심히 하는 모습을 보니 나 또한 게을리 공부할 수 없었고 덕분에 네이버 부스트 캠프 합격이라는 좋은 결과를 얻었다! 물론 스터디원들 전부 좋은 결과를 얻으셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개월이라는 길지도 짧지도 않은 시간 동안 포기하지 않고 꾸준히 한 나를 포함한 스터디 인원들 전부 너무너무 대단한 것 같다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 프로젝트, 스터디들을 참여해보긴 했지만, 진짜 죄다 중간에 그냥 흐지부지되어버렸는데 Kogorithm 스터디를 통해 처음으로 제대로된 스터디를 경험할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쨋든 나름 의미가 있는 수료증이다. 스터디원분들 모두 더 잘되었으면 좋겠고 나도 더욱 열심히 공부해야겠다~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>retrospect</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/235</guid>
      <comments>https://soopeach.tistory.com/235#entry235comment</comments>
      <pubDate>Sat, 16 Jul 2022 17:14:02 +0900</pubDate>
    </item>
    <item>
      <title>네이버 부스트캠프 7기 웹모바일 온보딩 키트 수령!</title>
      <link>https://soopeach.tistory.com/234</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 네이버 부스트캠프 웹모바일 7기의 온보딩 키드가 도착하였습니다..!! &lt;br /&gt;태어나서 온보딩 키트라는 것을 처음 수령해보는 것이라 굉장히 설레고 특별한 경험인 것 같습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-42_005.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3Zq5/btrHnUdnimX/GYHiq8VtXxEhi2eu6HO7b1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3Zq5/btrHnUdnimX/GYHiq8VtXxEhi2eu6HO7b1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3Zq5/btrHnUdnimX/GYHiq8VtXxEhi2eu6HO7b1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3Zq5%2FbtrHnUdnimX%2FGYHiq8VtXxEhi2eu6HO7b1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-42_005.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배상자를 열어보니 위와 같은 모습이었습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박스 안에 boostcamp띠가 둘러진 박스가 또 있는 상태였구 띠를 빼준 후 상자를 다시 열어보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-42_004.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl1C5x/btrHmhNEl1n/kCplkMXSkVUULBjnyAqCgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl1C5x/btrHmhNEl1n/kCplkMXSkVUULBjnyAqCgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl1C5x/btrHmhNEl1n/kCplkMXSkVUULBjnyAqCgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl1C5x%2FbtrHmhNEl1n%2FkCplkMXSkVUULBjnyAqCgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-42_004.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요렇게 서류봉투 느낌의 봉투와 슬리퍼가 담겨있는 슬리퍼 주머니가 들어가 있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-26-30.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAWIlb/btrHksPFxCj/i6FEAA2pUBVf3QahK5Kao0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAWIlb/btrHksPFxCj/i6FEAA2pUBVf3QahK5Kao0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAWIlb/btrHksPFxCj/i6FEAA2pUBVf3QahK5Kao0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAWIlb%2FbtrHksPFxCj%2Fi6FEAA2pUBVf3QahK5Kao0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-26-30.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류봉투안의 구성품들과 슬리퍼를 꺼내놓은 모습입니다! 정말 이쁜 굿즈들을 온보딩 키트로 받을 수 있어 너무 영광이고 감동입니다..!&amp;nbsp;&lt;br /&gt;온보딩 키드를 받고나니 이제야 정말 네이버 부스트 캠프 7기의 일원이 된 것이 실감이 납니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-41_002.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpYRss/btrHnyaBl2A/ZhrtWP4jrB19pdO4V5ZKok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpYRss/btrHnyaBl2A/ZhrtWP4jrB19pdO4V5ZKok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpYRss/btrHnyaBl2A/ZhrtWP4jrB19pdO4V5ZKok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpYRss%2FbtrHnyaBl2A%2FZhrtWP4jrB19pdO4V5ZKok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-41_002.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬리퍼의 사이즈는 남, 여로 구분되어서 오는 것 같더라구요! 저는 남자치고는 발의 크기가 너무 작아서 슬리퍼는 조금 큰 상태이지만 실내용으로 딱 적합할 것 같아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-41_001.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FoXuI/btrHnxQhv9i/2UJ45dIJajz2DoOjBRrRi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FoXuI/btrHnxQhv9i/2UJ45dIJajz2DoOjBRrRi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FoXuI/btrHnxQhv9i/2UJ45dIJajz2DoOjBRrRi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFoXuI%2FbtrHnxQhv9i%2F2UJ45dIJajz2DoOjBRrRi0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2022-07-15-15-27-41_001.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 부스트 캠프 온보딩 키트에서 받은 스티커들을 붙였습니다! 너무 아까워서 다 붙이고 싶었지만 참았습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단에있는 스티커 3개는 예전에 토스카드와 같이 받아서 그 때 붙인 스티커이고 사과로고 위에있는 스티커와 우측 하단의 오리의 스티커가 부스트 캠프에서 받은 스티커입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 다음 주 월요일이면 4주간의 챌린지가 시작되는데 기대가 되기도하고 두렵기도 합니다! 엄청 힘들다던데 그만큼 성장할 수 있다는 후기들이 대부분이더라구요. 딱 제가 원하는 방식이었는데 운 좋게 참여할 수 있게 되어서 너무너무 행복하네요! 챌린지 성실히 수행하고 멤버쉽까지 갈 수 있도록 열심히 노력해봐야겠습니다!!!&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>네이버 부스트캠프</category>
      <category>네이버커넥트재단</category>
      <category>부스트캠프</category>
      <category>부스트캠프웹모바일7기</category>
      <category>부캠온보딩키트</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/234</guid>
      <comments>https://soopeach.tistory.com/234#entry234comment</comments>
      <pubDate>Fri, 15 Jul 2022 15:38:17 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 2941번 크로아티아 알파벳[Kotlin - 코틀린]</title>
      <link>https://soopeach.tistory.com/233</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 2941번 문제입니다. (solved.ac) 기준 실버 5 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2941&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2941&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657699433840&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2941번: 크로아티아 알파벳&quot; data-og-description=&quot;예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj &amp;scaron; s= ž z= &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2941&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2941&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dlB0qR/hyO4Ia67JB/PPmrS9fkNmKH4KwtAEa6u0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2941&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2941&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dlB0qR/hyO4Ia67JB/PPmrS9fkNmKH4KwtAEa6u0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2941번: 크로아티아 알파벳&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj &amp;scaron; s= ž z=&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-13 at 5.03.33 PM.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UOOEp/btrHdLmVAlR/Xl3wnj6z8Lzn4uWAKjjfWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UOOEp/btrHdLmVAlR/Xl3wnj6z8Lzn4uWAKjjfWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UOOEp/btrHdLmVAlR/Xl3wnj6z8Lzn4uWAKjjfWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUOOEp%2FbtrHdLmVAlR%2FXl3wnj6z8Lzn4uWAKjjfWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2300&quot; height=&quot;1770&quot; data-filename=&quot;Screen Shot 2022-07-13 at 5.03.33 PM.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-13 at 5.12.02 PM.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;1650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKYpD/btrHbVYdWe6/ZvMEJTjFGK4irlqVRCRVe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKYpD/btrHbVYdWe6/ZvMEJTjFGK4irlqVRCRVe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKYpD/btrHbVYdWe6/ZvMEJTjFGK4irlqVRCRVe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKYpD%2FbtrHbVYdWe6%2FZvMEJTjFGK4irlqVRCRVe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2306&quot; height=&quot;1650&quot; data-filename=&quot;Screen Shot 2022-07-13 at 5.12.02 PM.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;1650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 주어진 크로아티아 알파벳 변경 표를 참고하여 입력받은 문자열을 탐색하며 크로아티아 알파벳으로 변경이 가능한 문자들을 하나의 크로아티아 알파벳으로 변경할 수 있도록하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 c=를 크로아티아 알파벳인 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;č로 변환하게 된다면 2개의 문자가 1개로 줄어드는 것이고 dz= 를 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;dž로 변환하게 된다면 3개의 문자가 1개로 줄어드는 것 입니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;기본적인 문자열의 길이를 처음 입력받은 문자열의 길이로 지정해주고 크로아티아 알파벳으로 변경 가능한 문자열들을 찾을 때 마다 줄어든 문자의 수 만큼 기본 문자열의 길이에서 빼줄 수 있도록 하였습니다. (dz=를 제외하고 다른 모든 부분은 -1이고 dz=만 -2)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정답 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1657700265700&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {

    val string = readln()
    var ans = string.length

    string.forEachIndexed { index, it -&amp;gt;
        if (index + 1 &amp;lt; string.length)
            when (it) {
                'c' -&amp;gt; {
                    if (string[index + 1] == '=' || string[index + 1] == '-') ans--
                }
                'd' -&amp;gt; {
                    if (index + 2 &amp;lt; string.length)
                        if (string[index + 1] == 'z' &amp;amp;&amp;amp; string[index + 2] == '=') ans--
                    if (string[index + 1] == '-') ans--
                }
                'l' -&amp;gt; {
                    if (string[index + 1] == 'j') ans--
                }
                'n' -&amp;gt; {
                    if (string[index + 1] == 'j') ans--
                }
                's' -&amp;gt; {
                    if (string[index + 1] == '=') ans--
                }
                'z' -&amp;gt; {
                    if (string[index + 1] == '=') ans--
                }
            }
    }
    println(ans)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 문제풀이[Algorithm]</category>
      <category>Algorithm</category>
      <category>kotlin</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/233</guid>
      <comments>https://soopeach.tistory.com/233#entry233comment</comments>
      <pubDate>Wed, 13 Jul 2022 17:21:51 +0900</pubDate>
    </item>
    <item>
      <title>네이버 부스트 캠프 웹, 모바일 7기 최종 합격(안드로이드)</title>
      <link>https://soopeach.tistory.com/232</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-12 at 7.32.13 PM.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qEe5K/btrG9MlCGdi/FmRK1KAaOKIqapOVyOHgTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qEe5K/btrG9MlCGdi/FmRK1KAaOKIqapOVyOHgTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qEe5K/btrG9MlCGdi/FmRK1KAaOKIqapOVyOHgTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqEe5K%2FbtrG9MlCGdi%2FFmRK1KAaOKIqapOVyOHgTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;159&quot; data-filename=&quot;Screen Shot 2022-07-12 at 7.32.13 PM.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우와... 네이버 부스트캠프 웹,모바일 7기에 최종 합격을 하게되었다!!!&amp;nbsp;&lt;br /&gt;어... 사실 1차 코딩테스트도 잘 보지 못했다고 생각하고 2차 또한 잘 보지 못했다고 생각해서.. 사실 정말 정말 가고 싶었지만..(내심 굉장히 기대를 많이 했었지만) 반 포기 상태였는데 오늘 새벽에 대충 합격을 암시하는 꿈을 꾸었다...(너무 간절해서 꿈에 나온 듯..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 조금 전 정말 정말 감사하게도.. 최종 합격 소식을 들을 수 있었다.!! 아무래도 네이버 부스트캠프의 목적 자체가 지속적으로 발전 가능한 개발자들을 양성하는 것이 목표이지, 뛰어난 실력자를 채용하는 것이 목표가 아니라서 합격할 수 있었던 것 같다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트 자체의 통과 여부도 중요하겠지만... 자소서와 제출한 포트폴리오(저는 블로그 주소를 제출하였습니다.) 또한 고려해서 평가를 해주시는 것 같다! 정말 네이버 부스트 캠프 7기에 합류할 수 있어 너무너무 영광이고 미친듯이 노력해서 멤버십까지 갈 수 있도록 해야겠다!!&lt;/p&gt;</description>
      <category>리뷰[Review]</category>
      <category>review</category>
      <category>네이버부스트캠프</category>
      <category>리뷰</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/232</guid>
      <comments>https://soopeach.tistory.com/232#entry232comment</comments>
      <pubDate>Tue, 12 Jul 2022 20:15:46 +0900</pubDate>
    </item>
    <item>
      <title>와카타임[WakaTime] 2022-07-04 until 2022-07-10</title>
      <link>https://soopeach.tistory.com/231</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-11 at 8.40.57 PM.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcP5H7/btrGTZAtzA1/1kozkicoQzUeLR5Gbk41rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcP5H7/btrGTZAtzA1/1kozkicoQzUeLR5Gbk41rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcP5H7/btrGTZAtzA1/1kozkicoQzUeLR5Gbk41rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcP5H7%2FbtrGTZAtzA1%2F1kozkicoQzUeLR5Gbk41rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;1054&quot; data-filename=&quot;Screen Shot 2022-07-11 at 8.40.57 PM.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;1054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-07-11 at 8.41.05 PM.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p4owc/btrG0Cx9U9k/yZXqG64k6JIVwMDEKFMd00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p4owc/btrG0Cx9U9k/yZXqG64k6JIVwMDEKFMd00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p4owc/btrG0Cx9U9k/yZXqG64k6JIVwMDEKFMd00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp4owc%2FbtrG0Cx9U9k%2FyZXqG64k6JIVwMDEKFMd00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;708&quot; data-filename=&quot;Screen Shot 2022-07-11 at 8.41.05 PM.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 거의 알고리즘 위주의 공부, 간단한 영화 프로젝트 마무리, 포트폴리오 사이트 수정들을 한 것 같다.&lt;br /&gt;강아지가 갑자기 많이 아파서 입원을 했는데... 상태가 좋지 않다... 이번 주에 맘고생을 정말 많이 했는데 그래서인지 주 마지막의 쯤에 번아웃이 왔다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇을 공부해야될 지도 모르겠고 그냥 너무 무기력해졌다... 당분간은 하고 싶었던 것들을 마음대로 하면서 멘탈을 좀 회복시켜보려고 한다.&lt;/p&gt;</description>
      <category>와카타임회고[RetroSpectWakaTime]</category>
      <category>retrospect</category>
      <category>wakatime</category>
      <category>와카타임</category>
      <category>회고</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/231</guid>
      <comments>https://soopeach.tistory.com/231#entry231comment</comments>
      <pubDate>Mon, 11 Jul 2022 20:46:33 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드[Android] 커스텀 dialog(대화창) 만들기(setView)</title>
      <link>https://soopeach.tistory.com/230</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 dialog(대화창) 만들기(기본, 리스트, 라디오버튼, 체크박스)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/140&quot;&gt;안드로이드[Android] 기본 dialog(대화창) 만들기(기본, 리스트, 라디오버튼, 체크박스)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657428912583&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;안드로이드[Android] 기본 dialog(대화창) 만들기(기본, 리스트, 라디오버튼, 체크박스)&quot; data-og-description=&quot;대화창(이하 다이어로그)는 일반적으로 상대방에게 알림을 보여주거나 추가적인 정보를 주고받을 수 있는 화면 전체를 가리지 않고 일부만 차지하는 화면입니다. dialog를 view, fragment등을 통해서&quot; data-og-host=&quot;soopeach.tistory.com&quot; data-og-source-url=&quot;https://soopeach.tistory.com/140&quot; data-og-url=&quot;https://soopeach.tistory.com/140&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRdZY6/hyO3kf1U6S/kEoBPOt6PIkro9imw5IE91/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900,https://scrap.kakaocdn.net/dn/DvglE/hyO1VWtt33/q1XKwyxin0kpK2G9uk8zUk/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900,https://scrap.kakaocdn.net/dn/jKiLr/hyO3nDOQk9/Z4kkMrM2eXGt0M2FWPYKH1/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900&quot;&gt;&lt;a href=&quot;https://soopeach.tistory.com/140&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soopeach.tistory.com/140&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRdZY6/hyO3kf1U6S/kEoBPOt6PIkro9imw5IE91/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900,https://scrap.kakaocdn.net/dn/DvglE/hyO1VWtt33/q1XKwyxin0kpK2G9uk8zUk/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900,https://scrap.kakaocdn.net/dn/jKiLr/hyO3nDOQk9/Z4kkMrM2eXGt0M2FWPYKH1/img.png?width=415&amp;amp;height=900&amp;amp;face=0_0_415_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;안드로이드[Android] 기본 dialog(대화창) 만들기(기본, 리스트, 라디오버튼, 체크박스)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;대화창(이하 다이어로그)는 일반적으로 상대방에게 알림을 보여주거나 추가적인 정보를 주고받을 수 있는 화면 전체를 가리지 않고 일부만 차지하는 화면입니다. dialog를 view, fragment등을 통해서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soopeach.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;setView를 이용한 커스텀 dialog(대화창) 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 해보았던 기본 다이어로그가 아닌 별도의 custom 레이아웃을 구성하여 해당 뷰를 setView를 이용하여 다이어로그로 띄워보도록 하겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 모습&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jul-10-2022 14-03-34.gif&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3e6Qg/btrGRIFdE0A/szFVrkWfFeK3WWP36aKnGk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3e6Qg/btrGRIFdE0A/szFVrkWfFeK3WWP36aKnGk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3e6Qg/btrGRIFdE0A/szFVrkWfFeK3WWP36aKnGk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b3e6Qg/btrGRIFdE0A/szFVrkWfFeK3WWP36aKnGk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;902&quot; data-filename=&quot;Jul-10-2022 14-03-34.gif&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 하기 버튼을 누르면 로그인을 위한 커스텀 다이어로그가 띄워지고 커스텀 다이어로그에서 아이디, 비밀번호를 입력한 후 &quot;로그인&quot; 버튼을 누르면 입력한 아이디와 비밀번호를 출력하도록 하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;login_dialog.xml - 커스텀 다이어로그 소스코드 구성&lt;/h2&gt;
&lt;pre id=&quot;code_1657431613248&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;&amp;gt;

    &amp;lt;EditText
        android:id=&quot;@+id/id&quot;
        android:layout_width=&quot;0dp&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:hint=&quot;아이디를 입력해주세요.&quot;
        app:layout_constraintStart_toStartOf=&quot;parent&quot;
        app:layout_constraintEnd_toEndOf=&quot;parent&quot;
        app:layout_constraintTop_toTopOf=&quot;parent&quot;
        android:layout_marginHorizontal=&quot;15dp&quot;
        android:layout_marginTop=&quot;5dp&quot;/&amp;gt;

    &amp;lt;EditText
        android:id=&quot;@+id/password&quot;
        android:layout_width=&quot;0dp&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:hint=&quot;비밀번호를 입력해주세요.&quot;
        android:inputType=&quot;textPassword&quot;
        app:layout_constraintStart_toStartOf=&quot;parent&quot;
        app:layout_constraintEnd_toEndOf=&quot;parent&quot;
        app:layout_constraintTop_toBottomOf=&quot;@id/id&quot;
        android:layout_marginHorizontal=&quot;15dp&quot;
        android:layout_marginTop=&quot;5dp&quot;/&amp;gt;
    &amp;lt;Button
        android:id=&quot;@+id/btnLogin&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;로그인&quot;
        app:layout_constraintTop_toBottomOf=&quot;@id/password&quot;
        app:layout_constraintEnd_toEndOf=&quot;parent&quot;
        android:layout_marginTop=&quot;5dp&quot;
        android:layout_marginEnd=&quot;15dp&quot;/&amp;gt;


&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메인 엑티비티 소스코드 구성&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1657431706859&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.customdialog

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.example.customdialog.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btn.setOnClickListener {
            CustomDialog()
        }
    }

    fun CustomDialog() {

        val dialogView = layoutInflater.inflate(R.layout.login_dialog, null)
        val id = dialogView.findViewById&amp;lt;EditText&amp;gt;(R.id.id)
        val password = dialogView.findViewById&amp;lt;EditText&amp;gt;(R.id.password)
        val btnLogin = dialogView.findViewById&amp;lt;Button&amp;gt;(R.id.btnLogin)
        
        val builder = AlertDialog.Builder(this)
            .setView(dialogView)
            .create()

        

        btnLogin.setOnClickListener {
            Toast.makeText(
                this,
                &quot;아이디는 ${id.text.toString()} 비밀번호는 ${password.text.toString()}&quot;,
                Toast.LENGTH_LONG
            ).show()
            builder.dismiss()
        }

        builder.show()

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메인 엑티비티의 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 뷰 바인딩을 사용하였고 메인 엑티비티에 있는 로그인 하기 버튼을 누르면 CustomDialog() 함수를 호출하도록 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;customDialog()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;customDialog() 함수는 가장 먼저 layoutInflater.inflate를 사용하여 미리 만들어 둔 login_dialog.xml을 View 객체(dialogView)로 만들어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 뷰에서 findViewById를 사용하여, 뷰에 있는 id, password를 입력받는 EditText 및 로그인 버튼을 찾아줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AlertDialog를 Build할 때 setView의 인자로 위에서 inflate한 뷰(dialogView)를 넣어주고 create()해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 버튼을 눌렀을 때 실행할 동작을 위에서 찾은 로그인 버튼에 setOnClickListener를 사용하여 설정해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 간단하게 입력된 아이디, 비밀번호를 출력하고 다이어로그를 종료하도록 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 builder.show()를 사용하여 다이어로그를 화면에 띄워줄 수 있도록 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 소스코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 소스코드는 아래의 링크에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/soopeach/CustomDialog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/soopeach/CustomDialog&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>안드로이드[Android]</category>
      <category>Android</category>
      <category>dialog</category>
      <category>다이어로그</category>
      <category>대화창</category>
      <category>안드로이드</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/230</guid>
      <comments>https://soopeach.tistory.com/230#entry230comment</comments>
      <pubDate>Sun, 10 Jul 2022 14:52:22 +0900</pubDate>
    </item>
    <item>
      <title>코틀린(Kotlin)에서 큐(Queue) 사용하기</title>
      <link>https://soopeach.tistory.com/229</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Queue란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queue는 사전적 의미로 줄, 줄을 서서 기다리다 라는 뜻을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queue 자료구조 또한 사전적 의미대로 입력받은 값들을 줄을 세워서 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 빈 queue에 5, 3, 2, 1 순서대로 삽입하면 꺼낼 때는 5, 3, 2, 1 순서로 나오게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특성을 가지는 큐 자료구조는 선입선출(First In First Out - FIFO)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 줄을 서서 기다리듯이 먼저 들어온 것이 먼저 나가게 되는 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일상생활에서 큐 자료구조와 비슷한 경우를 생각해보면 손님이 가득찬 식당 앞에서 줄 서서 기다리고 있는 상태와 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코틀린에서 queue 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린 자체적으로는 Queue가 구현되어있지 않기 때문에 직접 구현하거나 java에 있는 Queue를 사용해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 인터페이스 이므로 구현체로 LinkedList(클래스)를 사용하여 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue와 LinkedList를 사용하기 위하여 java.util.*를 import해야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657276426739&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Queue의 기능들&lt;/h3&gt;
&lt;pre id=&quot;code_1657276481801&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main() {

    val queue: Queue&amp;lt;Int&amp;gt; = LinkedList() // queue = []

    // add, offer
    queue.add(1) // queue = [1]
    queue.offer(2) // queue = [1,2]
    queue.add(3) // queue = [1,2,3]
    queue.offer(4) // queue = [1,2,3,4]

    // peek
    println(queue.peek()) // 1 출력 - queue = [1,2,3,4]
    // size
    println(queue.size) // 4 출력 - queue = [1,2,3,4]
    
    // remove, poll
    println(queue.remove()) // 1 출력 - queue = [2,3,4]
    println(queue.poll()) // 2 출력 - queue = [3,4]

    // size
    println(queue.size) // 2 출력 - queue = [3,4]
    // element
    println(queue.element()) // 3 출력 - queue = [3,4]

    // isEmpty or isNotEmpty
    println(queue.isEmpty()) // false 출력 - queue = [3,4]
    println(queue.isNotEmpty()) // true 출력 - queue = [3,4]

    // 큐가 빌 때 까지 모든 값 poll
    while (queue.isNotEmpty()) {
        println(queue.poll())
    }
    // 3 출력 - queue = [4]
    // 4 출력 - queue = []
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue 선언&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 val queue: Queue&amp;lt;Int&amp;gt; = LinkedList()와 같은 형태로 선언하여 사용할 수 있습니다. &amp;lt; &amp;gt; 안에는 큐의 원소로 들어갈 자료형을 명시해줍니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue 값 삽입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 add() 혹은 offer()을 사용하여&amp;nbsp; 값을 삽입할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;add&lt;/span&gt;는 queue의 용량 제한이 발생하면 Exception이 발생하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;offer은 Exception을 발생시키지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedList에서는 메모리의 한계까지 LinkedList를 만들지 않는 이상 용량 제한이 발생하기 힘들기 때문에 add, offer 둘 다 사용해도 큰 차이는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedList를 사용하였기 때문에 시간 복잡도는 O(1)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue 첫 값 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 element() 혹은 peek()을 사용하여 첫 값을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;element&lt;/span&gt;는 큐에 값이 없다면 NoSuchElementException을 발생시키고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;peek은 null을 반환해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedList를 사용하였기 때문에 시간 복잡도는 O(1)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue 크기 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 size()를 사용하여 현재 Queue의 크기(원소들의 개수)를 확인할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue 첫 값 확인 및 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue는 remove() 혹은 poll()을 사용하여 첫 값을 확인하고 삭제할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;remove&lt;/span&gt;는 큐에 값이 없다면 NoSuchElementException을 발생시키고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poll은 null 반환해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedList를 사용하였기 때문에 시간 복잡도는 O(1)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Queue가 비었는지 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; Queue는 isEmpty(), itNotEmpty()를 이용하여 현재 큐가 비었는지, 원소가 존재하는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isEmpty()는 Queue가 비었을 경우 true를 반환, 그렇지 않다면 false를 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isNotEmpty()는 Queue가 비었을 경우 false를 반환, 그렇지 않다면 true를 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>kotlin</category>
      <category>Queue</category>
      <category>자료구조</category>
      <category>코틀린</category>
      <category>큐</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/229</guid>
      <comments>https://soopeach.tistory.com/229#entry229comment</comments>
      <pubDate>Fri, 8 Jul 2022 19:45:49 +0900</pubDate>
    </item>
    <item>
      <title>코틀린(Kotlin)에서 스택(Stack) 사용하기</title>
      <link>https://soopeach.tistory.com/228</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stack이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack이라는 단어는 쌓이다, 쌓아서 채우다 라는 사전적 의미를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전적 의미대로 Stack이라는 자료구조는 입력받은 값들을 순차적으로 쌓아서 저장합니다.&amp;nbsp;&lt;br /&gt;ex) 빈 stack에 5, 3, 2, 1 순서대로 삽입하면 꺼낼 때는 1, 2, 3, 5 순서로 뽑히게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특성을 가진 스택 자료구조는 후입선출(Last In First Out - LIFO) 즉, 나중에 들어온 것이 먼저 나가게 되는 구조를 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일상생활에서 스택 자료구조와 비슷한 경우를 생각해보면 빈 상자 혹은 책상에 책을 차곡차곡 쌓는 상태와 동일합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코틀린에서 Stack 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린 자체적으로는 Stack이 구현되어있지 않기 때문에 직접 구현하거나 java에 있는 Stack을 사용해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java에 있는 Stack을 사용하기 위해선 java.util.* (혹은 java.util.Stack)을 import 해야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657272874266&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Stack의 기능들&lt;/h3&gt;
&lt;pre id=&quot;code_1657273087027&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main() {

    val stack = Stack&amp;lt;Int&amp;gt;() // stack = []

    // push
    stack.push(1) // stack = [1]
    stack.push(2) // stack = [1,2]
    stack.push(3) // stack = [1,2,3]
    stack.push(4) // stack = [1,2,3,4]

    // peek
    println(stack.peek()) // 4 출력 - stack = [1,2,3,4]

    // size
    println(stack.size) // 4 출력 - stack = [1,2,3,4]

    // pop
    println(stack.pop()) // 4 출력 - stack = [1,2,3]

    // size
    println(stack.size) // 3 출력 - stack = [1,2,3]

    // search
    println(stack.search(1)) // 3 출력 - stack = [1,2,3]
    println(stack.search(100)) // -1 출력 - stack = [1,2,3]

    // isEmpty or isNotEmpty
    println(stack.isEmpty()) // false 출력 - stack = [1,2,3]
    println(stack.isNotEmpty()) // true 출력 - stack = [1,2,3]

    // 스택이 빌 때 까지 모든 값 pop
    while(stack.isNotEmpty()){
        println(stack.pop())
    }
    // 3 출력 - stack = [1,2]
    // 2 출력 - stack = [1]
    // 1 출력 - stack = []
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 선언&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 Stack&amp;lt;Int&amp;gt;()와 같은 형태로 선언하여 사용할 수 있습니다. &amp;lt; &amp;gt; 안에는 스택의 원소로 들어갈 자료형들을 명시해줍니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 값 삽입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 push()를 사용하여 값을 삽입할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 위에 값을 삽입하므로 O(1)입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 마지막 값 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 peek()을 사용하여 현재 스택의 마지막 값을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 값만 확인하면 되므로 O(1) 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack이 비어있을 때 peek()을 사용하면 아래와 같은 에러가 발생합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657273435133&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Exception in thread &quot;main&quot; java.util.EmptyStackException&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 크기 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 size()를 사용하여 현재 스택의 크기(원소의 개수)를 확인할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 마지막 값 확인 및 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 pop()을 사용하여 현재 스택의 마지막 값을 확인 및 삭제할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 값만 삭제하면 되므로 O(1) 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;peek()은 값을 반환만 하고, pop()은 값을 반환하고 삭제해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;peek()과 마찬가지로 비어있을 때 사용하면 아래와 같은 에러가 발생합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657273579479&quot; class=&quot;ada&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Exception in thread &quot;main&quot; java.util.EmptyStackException&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 원소 찾기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 search를 사용하여 특정 원소를 찾아보고 해당 원소가 스택에 있다면 몇 번째로 나갈 수 있는지를 반환해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 원소가 존재하지 않는다면 -1을 반환해줍니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack이 비었는지 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack은 isEmpty(), itNotEmpty()를 이용하여 현재 스택이 비었는지, 원소가 존재하는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isEmpty()는 Stack이 비었을 경우 true를 반환, 그렇지 않다면 false를 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isNotEmpty()는 Stack이 비었을 경우 false를 반환, 그렇지 않다면 true를 반환.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코틀린[Kotlin]</category>
      <category>kotlin</category>
      <category>stack</category>
      <category>스택</category>
      <category>자료구조</category>
      <category>코틀린</category>
      <author>soopeach</author>
      <guid isPermaLink="true">https://soopeach.tistory.com/228</guid>
      <comments>https://soopeach.tistory.com/228#entry228comment</comments>
      <pubDate>Fri, 8 Jul 2022 18:49:34 +0900</pubDate>
    </item>
  </channel>
</rss>