<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BLU.LOG</title>
    <link>https://junyng.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 21 Jul 2026 18:13:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>junyng</managingEditor>
    <item>
      <title>test</title>
      <link>https://junyng.tistory.com/57</link>
      <description>&lt;body&gt;
  &lt;h1&gt;Double Alert Example&lt;/h1&gt;
  &lt;input type=&quot;button&quot; value=&quot;Test&quot; onClick=&quot;alert('First Alert!');&quot;&gt;

  &lt;script&gt;
    // 버튼 요소를 선택
      const button = document.querySelector('input[type=&quot;button&quot;]');

      // 추가적으로 이벤트 리스너를 등록
      button.addEventListener('click', () =&gt; {
        alert('Second Alert!');
      });
  &lt;/script&gt;
&lt;/body&gt;</description>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/57</guid>
      <comments>https://junyng.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 20 Nov 2024 17:24:18 +0900</pubDate>
    </item>
    <item>
      <title>앱 광고 만들기</title>
      <link>https://junyng.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글 애드몹 앱 광고는 생성했으나 iOS앱에 적용중에 있습니다.&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-origin-width=&quot;1992&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XOUPf/btsKtHPSBFZ/ZioXCbCJEk8Ar22KmyuLuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XOUPf/btsKtHPSBFZ/ZioXCbCJEk8Ar22KmyuLuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XOUPf/btsKtHPSBFZ/ZioXCbCJEk8Ar22KmyuLuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXOUPf%2FbtsKtHPSBFZ%2FZioXCbCJEk8Ar22KmyuLuk%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;1992&quot; height=&quot;1184&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;1184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>앱개발</category>
      <category>개인 앱으로 자동수익 만들기</category>
      <category>라이프해킹스쿨</category>
      <category>자유로챌린지</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/56</guid>
      <comments>https://junyng.tistory.com/56#entry56comment</comments>
      <pubDate>Sat, 2 Nov 2024 20:56:58 +0900</pubDate>
    </item>
    <item>
      <title>SNS 마케팅 사례</title>
      <link>https://junyng.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 점신&lt;br /&gt;운세 보기 전에 광고를 통해 보상을 받는다는 느낌을 받았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;1454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ASMNs/btsKrI8EI6k/i7P0MIeH76wCns9D4Rhwk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ASMNs/btsKrI8EI6k/i7P0MIeH76wCns9D4Rhwk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ASMNs/btsKrI8EI6k/i7P0MIeH76wCns9D4Rhwk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FASMNs%2FbtsKrI8EI6k%2Fi7P0MIeH76wCns9D4Rhwk1%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;376&quot; height=&quot;1454&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;1454&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. wowsblitz&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-origin-width=&quot;1380&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/61o3j/btsKqZJ22pr/0Rp23ukaVs7z3st5LEy1DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/61o3j/btsKqZJ22pr/0Rp23ukaVs7z3st5LEy1DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/61o3j/btsKqZJ22pr/0Rp23ukaVs7z3st5LEy1DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F61o3j%2FbtsKqZJ22pr%2F0Rp23ukaVs7z3st5LEy1DK%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;648&quot; height=&quot;524&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;1116&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;3. 6th street&lt;br /&gt;딥 링크를 통한 유저에게 할인을 제공함으로써 충성 고객 유치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;1442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQrxN/btsKtdlX7ED/gIHVMzFsNknFOOqZ69QKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQrxN/btsKtdlX7ED/gIHVMzFsNknFOOqZ69QKuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQrxN/btsKtdlX7ED/gIHVMzFsNknFOOqZ69QKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQrxN%2FbtsKtdlX7ED%2FgIHVMzFsNknFOOqZ69QKuK%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;753&quot; height=&quot;1266&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;1442&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>앱개발</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/55</guid>
      <comments>https://junyng.tistory.com/55#entry55comment</comments>
      <pubDate>Thu, 31 Oct 2024 22:38:44 +0900</pubDate>
    </item>
    <item>
      <title>앱 개발 계획 구상</title>
      <link>https://junyng.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 직접 개발할 예정&lt;br /&gt;&lt;br /&gt;- AI 앱 디자인 툴 활용&lt;br /&gt;- 앱 배포에 필요한 홍보용 스크린샷 이미지 직접 제작&lt;br /&gt;- 기간 약 일주일&lt;/p&gt;</description>
      <category>앱개발</category>
      <category>개인 앱으로 자동수익 만들기</category>
      <category>라이프해킹스쿨</category>
      <category>자유로챌린지</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/54</guid>
      <comments>https://junyng.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 29 Oct 2024 22:58:36 +0900</pubDate>
    </item>
    <item>
      <title>앱 개발 아이템 기획</title>
      <link>https://junyng.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트, 이미지를 편리하게 복붙할 수 있는 클립보드 앱&amp;nbsp;&lt;br /&gt;&lt;br /&gt;본인이 아이폰을 사용하면서 불편함을 느꼈고 필요하다고 생각되어 만들게 되었습니다.&lt;/p&gt;</description>
      <category>개인 앱으로 자동수익 만들기</category>
      <category>라이프해킹스쿨</category>
      <category>자유로챌린지</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/53</guid>
      <comments>https://junyng.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 29 Oct 2024 00:52:56 +0900</pubDate>
    </item>
    <item>
      <title>Great SwiftUI 정리</title>
      <link>https://junyng.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://in.swiftui.wtf/great&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://in.swiftui.wtf/great&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;&lt;b&gt;조건식 보다는 모디파이어를 선호하라&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;브랜치는 훌륭하며, SwiftUI에는 이유가 있다. 하지만 불필요하게 사용될 때, 그들은 열악한 성능, 놀라운 애니메이션, 그리고 심지어 상태 손실을 초래할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;브랜치를 도입할 때, 잠시 멈추고 여러 뷰를 나타내는지 아니면 같은 뷰의 두 상태를 나타내는지 고려하세요.&quot;&lt;/span&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;a href=&quot;https://developer.apple.com/videos/play/wwdc2021/10022/?time=1498&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/videos/play/wwdc2021/10022/?time=1498&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;&lt;b&gt;State and dependencies&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- let 을 우선으로 사용하라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 부모 뷰로 부터 값을 전달 받고 이 값을 바꿔야하는 경우 Binding 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Binding과 동등한 레벨이나 클래스로 구성할 때 ObservedObject&amp;nbsp;사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 뷰 내부에서 변경이 필요한 프로퍼티의 경우 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;State&lt;span&gt; &lt;/span&gt;&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;b&gt;State는 Private여야 한다&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 뷰가 의존하는 외부 데이터와 그 자체로 생성하는 것을 명확히 하기 위함&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;b&gt;뷰 작성 할 때 기억할 것&lt;/b&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;- 부모 뷰로 부터 받는 공간으로 크기 결정할 수 있음 (UIScreen 접근하지 않기, 뷰 크기 구해야할 때는 GeometryReader 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서브 뷰를 Struct로 분리할 때, 컨테이너 뷰(ZStack, VStack, HStack...)를 감싸줄 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- body를 심플하게 만들것 (WWDC&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;Data Essentials에서 언급했듯이, 디스패치를 포함한 부작용을 만드는 것은 뷰의 생성을 늦추고 프레임 드롭을 유발할 수 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 중복 뷰 업데이트를 피하라 (관심있는 프로퍼티만 구독하라)&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS/SwiftUI</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/52</guid>
      <comments>https://junyng.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 27 Dec 2023 23:24:22 +0900</pubDate>
    </item>
    <item>
      <title>DerivedData 삭제하기</title>
      <link>https://junyng.tistory.com/51</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;xcode.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GPnLu/btsjYOsVh72/xy4kHrRQuNq8kXeDzh90Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GPnLu/btsjYOsVh72/xy4kHrRQuNq8kXeDzh90Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GPnLu/btsjYOsVh72/xy4kHrRQuNq8kXeDzh90Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGPnLu%2FbtsjYOsVh72%2Fxy4kHrRQuNq8kXeDzh90Q1%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;300&quot; height=&quot;512&quot; data-filename=&quot;xcode.png&quot; data-origin-width=&quot;1024&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;Xcode에서 프로젝트 빌드시 다음의 파생 데이터들이 발생하게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 경로: (&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;~/Library/Developer/Xcode/DerivedData)&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;- Intermediate Build Results&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Generated Indexes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Module Caches&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Symbol Caches&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;이러한 파생 데이터들은 Xcode는 빌드 과정을 최적화하고 빌드 시간을 단축하는 용도로 사용됩니다&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;b&gt;DerivedData를 삭제하는 방법은 다음과 같습니다&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;1. Xcode 클린 빌드(command + shift + k)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 터미널 명령어&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;color: #1d1d1f; text-align: left;&quot;&gt;
&lt;pre class=&quot;awk&quot; style=&quot;color: #000000; text-align: left;&quot; data-lang=&quot;Bash&quot;&gt;&lt;code&gt;rm -rf ~/Library/Developer/Xcode/DerivedData&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Xcode에서 폴더 경로 찾고 지우기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Xcode &amp;gt; Settings &amp;gt; Locations (옆의 화살표 클릭)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2. 폴더 내용 삭제하기&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-15 오전 1.42.54.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;2234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xGIqT/btsjTvg7GCb/gFfCM8awRT1aUoeeNKDKtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xGIqT/btsjTvg7GCb/gFfCM8awRT1aUoeeNKDKtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xGIqT/btsjTvg7GCb/gFfCM8awRT1aUoeeNKDKtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxGIqT%2FbtsjTvg7GCb%2FgFfCM8awRT1aUoeeNKDKtK%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;3456&quot; height=&quot;2234&quot; data-filename=&quot;스크린샷 2023-06-15 오전 1.42.54.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;2234&quot;/&gt;&lt;/span&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;
&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;github 오픈소스이며 레포에 다운로드 링크가 담겨 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/macmade/Xclean&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/macmade/Xclean&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;
&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://www.swiftlyrush.com/inside-derived-data/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.swiftlyrush.com/inside-derived-data/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Xcode</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/51</guid>
      <comments>https://junyng.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 15 Jun 2023 01:47:57 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] Carousel View 만들기</title>
      <link>https://junyng.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AppStore의 App 탭의 각 섹션을 나타내는 뷰를 유사하게 만들어보고자 합니다.&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;요구 사항으로는 Scroll Snap이 가능하며, 스크롤시 양 옆의 콘텐츠 일부가 노출되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 해당 기능을 수행하는 뷰를 Carousel View라고 명칭하는 것 같습니다.&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;RPReplay_Final1661060651_MP4_AdobeExpress.gif&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1XfQQ/btrJ80O5t6K/MK47TQvILn4HEMtEUiWSkK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1XfQQ/btrJ80O5t6K/MK47TQvILn4HEMtEUiWSkK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1XfQQ/btrJ80O5t6K/MK47TQvILn4HEMtEUiWSkK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/d1XfQQ/btrJ80O5t6K/MK47TQvILn4HEMtEUiWSkK/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;222&quot; height=&quot;480&quot; data-filename=&quot;RPReplay_Final1661060651_MP4_AdobeExpress.gif&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;480&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;Carousel View를 분석한 구조는 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-21 오후 3.11.42.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/74FLi/btrJ8lGIiqO/f3dzmoK1kIUBqksoeZ0JjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/74FLi/btrJ8lGIiqO/f3dzmoK1kIUBqksoeZ0JjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/74FLi/btrJ8lGIiqO/f3dzmoK1kIUBqksoeZ0JjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F74FLi%2FbtrJ8lGIiqO%2Ff3dzmoK1kIUBqksoeZ0JjK%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;800&quot; height=&quot;409&quot; data-filename=&quot;스크린샷 2022-08-21 오후 3.11.42.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- horizontal spacing&lt;/b&gt;: 콘텐츠 전체 영역이 시작되고 끝나는 지점을 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&lt;/b&gt; &lt;b&gt;spacing&lt;/b&gt;: 각 콘텐츠 영역 사이의 마진 값 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- visible rect:&lt;/b&gt;&amp;nbsp;부모 뷰에서 바라보는 사각형 영역 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- scrollOffsetX:&lt;/b&gt; x축의 오프셋 값 입니다.&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;Carousel View는 &lt;b&gt;visible rect&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;1. ContentView를 정의하기 위해 `@ViewBuilder` 클로저를 주입 받는 뷰를 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ViewBuilder 클로저를 통해 하나의 뷰를 주입받을 수 있습니다.&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. ContentView(`@ViewBuilder` 클로저)를 여러개 받을 수 있는 구조로 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 갯수 정보를 의미하는 &lt;span&gt;`pageCount` 를 입력 받아 ForEach문을 사용해 `@ViewBuilder` 클로저를 수행하도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 뷰(ContentView) 들은 HStack으로 감싸도록 하고 spacing 값도 입력 받습니다.&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;span&gt;이제 `ForEach(0..&amp;lt;pageCount, id:\.self)` 문을 통해 페이지 인덱스에 따라 UI를 구성할 수 있습니다.&lt;/span&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;3. DragGesture를 이용해 오프셋 값을 이동시킵니다.&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;script src=&quot;https://gist.github.com/junyng/7c13b719be09976a3a63980e52487f5b.js&quot;&gt;&lt;/script&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;carousel.gif&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djMmcb/btrLGKpY9uJ/55107J7P2SVTd2ZsMQfiPk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djMmcb/btrLGKpY9uJ/55107J7P2SVTd2ZsMQfiPk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djMmcb/btrLGKpY9uJ/55107J7P2SVTd2ZsMQfiPk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/djMmcb/btrLGKpY9uJ/55107J7P2SVTd2ZsMQfiPk/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;400&quot; height=&quot;854&quot; data-filename=&quot;carousel.gif&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;1648&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;&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;&lt;a href=&quot;https://www.youtube.com/watch?v=4Gw5lDXJ04g&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=4Gw5lDXJ04g&lt;/a&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/50</guid>
      <comments>https://junyng.tistory.com/50#entry50comment</comments>
      <pubDate>Thu, 8 Sep 2022 10:40:28 +0900</pubDate>
    </item>
    <item>
      <title>[메모리 관리] 주소 바인딩</title>
      <link>https://junyng.tistory.com/46</link>
      <description>&lt;p&gt;프로그램이 실행을 위해 물리 메모리에 적재되면 CPU는 프로세스를 위한 독자적인 주소공간을 생성합니다.&lt;/p&gt;
&lt;p&gt;이 주소를 논리적 주소(=가상 주소)라고 하고 각 프로세스마다 독립적으로 할당됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CPU가 기계어 명령을 수행하기 위해서는 논리적 주소에 근거해 매핑된 물리적 메모리 위치를 확인해야 합니다.&lt;/p&gt;
&lt;p&gt;메모리에 적재된 프로세스의&amp;nbsp;논리적 주소를 물리적 주소로 연결시켜주는 작업인 &lt;b&gt;주소 바인딩&lt;/b&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주소 바인딩&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;프로세스의 논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업을 &lt;b&gt;주소 바인딩&lt;/b&gt;이라고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로그램이 적재되는 물리적 메모리의 주소가 언제 결정되느냐에 따라&amp;nbsp;&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;컴파일 타임 바인딩&lt;/li&gt;
&lt;li&gt;로드 타임 바인딩&lt;/li&gt;
&lt;li&gt;실행 시간 바인딩&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;컴파일 타임 바인딩&lt;/b&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;로드 타임 바인딩&lt;/b&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;/li&gt;
&lt;li&gt;컴파일러가 재배치 가능 코드(reloca-table code)를 생성한 경우에 가능한 주소 바인딩입니다.&lt;/li&gt;
&lt;li&gt;프로그램 속의 코드 세그먼트를 모두 바꿔줘야 하므로 메모리 로딩할 때 오랜 시간이 소요됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;실행 시간 바인딩&lt;/b&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;MMU 하드웨어를 사용하여 논리적 주소에서 물리적 주소로 매핑합니다.&lt;/li&gt;
&lt;li&gt;일반적인 OS는 이 방법을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MMU 기법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;CPU가 특정 프로세스의 논리적 주소를 참조하려고 할 때&lt;/p&gt;
&lt;p&gt;MMU 기법은 그 주소값에 기준 레지스터의 값을 더해 물리적 주소값을 얻습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MMU 기법의 기본원리는 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2021-04-11 오후 5.14.40.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;678&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v0sKc/btq2hDiUPYS/PzOvJcv8jXj2uaY8ZsKmO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v0sKc/btq2hDiUPYS/PzOvJcv8jXj2uaY8ZsKmO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v0sKc/btq2hDiUPYS/PzOvJcv8jXj2uaY8ZsKmO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv0sKc%2Fbtq2hDiUPYS%2FPzOvJcv8jXj2uaY8ZsKmO1%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-04-11 오후 5.14.40.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;678&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;1. CPU가 논리적 주소 123번지에 있는 내용을 요청합니다.&lt;/p&gt;
&lt;p&gt;2. 재배치 레지스터에 저장된 값 23000을 더합니다.&lt;/p&gt;
&lt;p&gt;3. 물리적 메모리 23123에 저장합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 한 가지 더 고려해야할 사항이 있습니다.&lt;/p&gt;
&lt;p&gt;다중 프로그래밍 환경에서는 여러 개의 프로세스가 물리적 메모리에 동시에 올라간 경우가 대부분입니다.&lt;/p&gt;
&lt;p&gt;위의 MMU 방식을 사용하여 주소 변환을 하였을 때 그 결과가 물리적 메모리 영역을 벗어날 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;기준 레지스터와 한계 레지스터에 의한 주소 변환&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 주소 영역을 벗어나지 않도록&amp;nbsp;&lt;/span&gt;&lt;b&gt;메모리 보안&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;을 달성하기 위한 방법은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2021-04-11 오후 6.05.26.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;648&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uQuJC/btq2niLc1H0/O4xkABB4WtIodNmv2sYcD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uQuJC/btq2niLc1H0/O4xkABB4WtIodNmv2sYcD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uQuJC/btq2niLc1H0/O4xkABB4WtIodNmv2sYcD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuQuJC%2Fbtq2niLc1H0%2FO4xkABB4WtIodNmv2sYcD1%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-04-11 오후 6.05.26.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;648&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. CPU가 요청한 &lt;b&gt;프로세스의 논리적 주소 값 &amp;lt; 한계 레지스터 내에 저장된 프로세스의 크키 &lt;/b&gt;인지 확인합니다.&lt;/p&gt;
&lt;p&gt;2. 크기가 작다면 논리적 주소 값에 재배치 레지스터 값을 더해 물리적 주소를 구하여 메모리 위치를 접근하도록 허락합니다.&lt;/p&gt;
&lt;p&gt;3.&lt;b&gt; 논리적 주소 값 &amp;gt; 한계 레지스터 값&lt;/b&gt;이면 트랩을 발생시켜 해당 프로세스를 강제 종료시킵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고 자료&lt;/b&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;span&gt;&amp;nbsp;&lt;/span&gt;원리(반효경 저)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/운영체제</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/46</guid>
      <comments>https://junyng.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 11 Apr 2021 17:17:07 +0900</pubDate>
    </item>
    <item>
      <title>[메모리관리] 연속할당 방식 - 고정 분할 방식과 가변 분할 방식</title>
      <link>https://junyng.tistory.com/45</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;연속 할당 방식&lt;/h4&gt;
&lt;p&gt;프로그램을 메모리에 올릴 때, 물리적 메모리의 한 곳에 연속적으로 적재하는 방식으로&lt;/p&gt;
&lt;p&gt;&lt;b&gt;고정 분할 방식&lt;/b&gt;과 &lt;b&gt;가변 분할 방식&lt;/b&gt;이 존재합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;고정 분할 방식&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;주어진 개수 만큼의 영구적인 분할로 미리 나누어 두고 각 분할에 하나의 프로그램을 적재하는 방식입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 분할의 크기를 모두 동일하게 할 수도 있고 서로 다르게 할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;하나의 분할에는 하나의 프로그램만 적재 가능하므로 &lt;b&gt;외부 조각&lt;/b&gt;과 &lt;b&gt;내부 조각&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로그램의 크기 &amp;gt; 분할의 크기&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인 경우 발생합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;프로그램을 적재하지 못하는 빈 메모리 공간으로 사용될 수 없는 작은 분할을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;프로그램의 크기 &amp;lt; 분할의 크기&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인 경우 발생합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;프로그램이 분할에 적재되고 나서 분할 내부에 사용될 수 없는 메모리 조각을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2021-04-11 오전 9.54.02.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;596&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8tznE/btq2krawFHX/e6waRVnKquajhynld4JX90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8tznE/btq2krawFHX/e6waRVnKquajhynld4JX90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8tznE/btq2krawFHX/e6waRVnKquajhynld4JX90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8tznE%2Fbtq2krawFHX%2Fe6waRVnKquajhynld4JX90%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-04-11 오전 9.54.02.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;596&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;가변 분할 방식&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메모리에 적재되는 프로세스 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가변 분할 방식에서 프로세스의 크기보다 분할의 크기보다 크게 할당하기 때문에 &lt;b&gt;내부 조각&lt;/b&gt;은 발생하지 않습니다.&lt;/p&gt;
&lt;p&gt;하지만 이미 메모리에 존재하는 프로그램이 종료되고&lt;/p&gt;
&lt;p&gt;메모리 크기보다 더 작은 크기의 &lt;span style=&quot;color: #333333;&quot;&gt;새로운 프로세스가 할당될 때 &lt;b&gt;외부 조각&lt;/b&gt;이 발생할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;또한, 프로세스를 어떤 위치에 올릴지 결정하기 위한&amp;nbsp;&lt;b&gt;동적 메모리 할당 문제&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2021-04-11 오전 10.11.32.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;796&quot; width=&quot;200&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXwrFs/btq2gK3Z78G/b9LsTRiIjtnUWcYw9iKg00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXwrFs/btq2gK3Z78G/b9LsTRiIjtnUWcYw9iKg00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXwrFs/btq2gK3Z78G/b9LsTRiIjtnUWcYw9iKg00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXwrFs%2Fbtq2gK3Z78G%2Fb9LsTRiIjtnUWcYw9iKg00%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-04-11 오전 10.11.32.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;796&quot; width=&quot;200&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;동적 메모리 할당 문제&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;프로세스를 메모리에 올릴 때 물리적 메모리의 가용 공간(분할)이 산발적으로 존재하게 됩니다.&lt;/p&gt;
&lt;p&gt;주소 공간의 크기가 n인 프로세스를 하나의&amp;nbsp;가용공간에 적재하기 위한&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;최초 적합 방법(first-fit)
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;가용 공간을 차례대로 살펴보면서 &lt;b&gt;프로그램 크기 &amp;lt; 가용 공간 크기&lt;/b&gt;가 최초로 발견될 때, 해당 프로세스 할당합니다.&lt;/li&gt;
&lt;li&gt;모든 가용 공간을 탐색하지 않아 시간적인 측면에서 효율적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;최적 적합 방법(best-fit)
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;&lt;b&gt;프로세스 크기 &amp;lt; 가용 공간 크기&lt;/b&gt;인 &lt;b&gt;가장 작은 공간&lt;/b&gt;을 찾고 프로세스를 할당합니다.&lt;/li&gt;
&lt;li&gt;모든 가용 공간 리스트가 크기 순으로 정렬되어 있지 않으면, 모든 가용 리스트를 탐색해야하는 오버헤드가 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;최악 적합 방법(worst-fit)
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;&lt;b&gt;프로세스 크기 &amp;lt; 가용 공간 크기&lt;/b&gt;인 &lt;b&gt;가장 큰 공간&lt;/b&gt;을 찾고 프로세스를 할당합니다.&lt;/li&gt;
&lt;li&gt;모든 가용 공간 리스트가 크기 순으로 정렬되어 있지 않으면, 모든 가용 리스트를 탐색해야하는 오버헤드가 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;외부 조각 문제 해결 방법&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;가변 분할 방식에서 외부 조각 문제를 해결하기 위한 방법으로 &lt;b&gt;컴팩션(compaction) 방법&lt;/b&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고 자료&lt;/b&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;</description>
      <category>CS/운영체제</category>
      <author>junyng</author>
      <guid isPermaLink="true">https://junyng.tistory.com/45</guid>
      <comments>https://junyng.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 11 Apr 2021 01:32:43 +0900</pubDate>
    </item>
  </channel>
</rss>