<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개인적으로 공부한 내용을 정리중입니다.</title>
    <link>https://pinelover.tistory.com/</link>
    <description>swift, python, java, 아이폰 앱 개발, 안드로이드 앱 개발, 서버 공부, 머신러닝 공부, 그래픽스 공부 등등 기록입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 06:25:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>studying develop</managingEditor>
    <image>
      <title>개인적으로 공부한 내용을 정리중입니다.</title>
      <url>https://tistory1.daumcdn.net/tistory/3405184/attach/6e70f53fc465417db260a5fcfd582f86</url>
      <link>https://pinelover.tistory.com</link>
    </image>
    <item>
      <title>파이썬으로의 웹 크롤링: 절차적 튜토리얼 초보자 가이드</title>
      <link>https://pinelover.tistory.com/381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹&amp;nbsp;크롤링을&amp;nbsp;위한&amp;nbsp;Python을&amp;nbsp;배우려는&amp;nbsp;경우&amp;nbsp;집중해야&amp;nbsp;할&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;주요&amp;nbsp;개념&amp;nbsp;및&amp;nbsp;라이브러리는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;1. HTTP 및 HTML: HTTP 프로토콜 및 HTML 구조의 기본 사항을 이해하는 것은 웹 크롤링에 중요합니다.&lt;br /&gt;&lt;br /&gt;2. 요청 라이브러리: 요청은 HTTP 요청을 보내고 응답을 처리하는 데 널리 사용되는 Python 라이브러리입니다. 이를 사용하여 웹 페이지에 요청을 보내고 HTML 콘텐츠를 검색합니다.&lt;br /&gt;&lt;br /&gt;3. BeautifulSoup 라이브러리: BeautifulSoup은 HTML 및 XML 콘텐츠를 구문 분석하기 위한 라이브러리입니다. 웹 페이지의 HTML 콘텐츠에서 데이터를 추출하는 데 사용합니다.&lt;br /&gt;&lt;br /&gt;4. 정규식: 정규식은 텍스트의 패턴 일치를 위한 강력한 도구입니다. 이를 사용하여 HTML 콘텐츠에서 특정 정보를 추출합니다.&lt;br /&gt;&lt;br /&gt;5. Scrapy 프레임워크: Scrapy는 웹 크롤링 및 스크래핑을 위한 고급 Python 프레임워크입니다. 복잡한 크롤링 작업을 구축 및 관리하고 데이터 로깅 및 저장과 같은 일반적인 작업을 처리하는 편리한 방법을 제공합니다.&lt;br /&gt;&lt;br /&gt;6. 멀티스레딩 및 비동기 프로그래밍: 특히 많은 수의 페이지를 크롤링하는 경우 웹 크롤링이 느려질 수 있습니다. 프로세스 속도를 높이려면 다중 스레딩 또는 비동기 프로그래밍을 사용하여 동시에 여러 요청을 보낼 수 있습니다.&lt;br /&gt;&lt;br /&gt;7. 견고성 및 오류 처리: 웹 크롤링은 웹 페이지 구조의 변경 또는 네트워크 오류로 인해 불안정할 수 있습니다. 크롤러가 이러한 시나리오를 처리할 수 있도록 견고성과 오류 처리 전략을 구현해야 합니다.&lt;br /&gt;&lt;br /&gt;8. 이것은 웹 크롤링을 위해 Python을 배울 때 집중해야 할 핵심 개념과 라이브러리 중 일부에 불과합니다. 작은 프로젝트부터 시작하여 점차 기술과 지식을 쌓아가는 것이 좋습니다.&lt;/p&gt;</description>
      <category>개발자 이해하기</category>
      <category>공부</category>
      <category>방법</category>
      <category>웹</category>
      <category>크롤링</category>
      <category>파이썬</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/381</guid>
      <comments>https://pinelover.tistory.com/381#entry381comment</comments>
      <pubDate>Fri, 3 Feb 2023 03:56:28 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 개발자의 직업 기회: 국내외 시장 분석 새로운 산업 전망 인공지능과 빅데이터 시대 최신 트렌드 분석</title>
      <link>https://pinelover.tistory.com/380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Python&amp;nbsp;개발자의&amp;nbsp;미래는&amp;nbsp;밝아&amp;nbsp;보입니다.&amp;nbsp;Python은&amp;nbsp;세계에서&amp;nbsp;가장&amp;nbsp;빠르게&amp;nbsp;성장하고&amp;nbsp;가장&amp;nbsp;수요가&amp;nbsp;많은&amp;nbsp;프로그래밍&amp;nbsp;언어&amp;nbsp;중&amp;nbsp;하나이기&amp;nbsp;때문입니다.&amp;nbsp;Python&amp;nbsp;개발자에&amp;nbsp;대한&amp;nbsp;수요가&amp;nbsp;계속해서&amp;nbsp;증가할&amp;nbsp;것으로&amp;nbsp;예상되는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;이유는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;1. 광범위한 채택: Python은 신생 기업에서 대기업에 이르기까지 다양한 조직에서 사용되며 가장 다재다능한 프로그래밍 언어 중 하나입니다.&lt;br /&gt;&lt;br /&gt;2. 데이터 과학 및 기계 학습에서 인기 증가: Python에는 데이터 분석, 데이터 시각화 및 예측 모델 구축을 비롯한 다양한 작업에 Python을 사용하는 데이터 과학자 및 기계 학습 실무자로 구성된 크고 활발한 커뮤니티가 있습니다.&lt;br /&gt;&lt;br /&gt;3. 웹 개발에서의 사용 증가: Python은 단순성, 유연성 및 Django 및 Flask와 같은 강력한 웹 프레임워크의 가용성 덕분에 웹 개발에서 널리 사용됩니다.&lt;br /&gt;&lt;br /&gt;4. 과학 컴퓨팅 및 교육에 대한 수요가 높음: Python은 과학 컴퓨팅에서 널리 사용되며 교육 기관에서 널리 사용되므로 학생과 연구원에게 귀중한 기술이 됩니다.&lt;br /&gt;&lt;br /&gt;5. 자동화 및 스크립팅에 대한 수요 증가: Python은 다양한 자동화 및 스크립팅 작업에 사용할 수 있는 다재다능한 언어로, 소프트웨어 엔지니어, 시스템 관리자 및 네트워크 엔지니어에게 유용한 기술입니다.&lt;br /&gt;&lt;br /&gt;결론적으로&amp;nbsp;Python&amp;nbsp;개발자의&amp;nbsp;미래는&amp;nbsp;다양한&amp;nbsp;산업과&amp;nbsp;응용&amp;nbsp;프로그램에서&amp;nbsp;수요가&amp;nbsp;증가함에&amp;nbsp;따라&amp;nbsp;밝아&amp;nbsp;보입니다.&amp;nbsp;프로그래밍&amp;nbsp;분야에서&amp;nbsp;경력을&amp;nbsp;쌓는&amp;nbsp;데&amp;nbsp;관심이&amp;nbsp;있다면&amp;nbsp;Python을&amp;nbsp;배우는&amp;nbsp;것은&amp;nbsp;많은&amp;nbsp;기회를&amp;nbsp;열어줄&amp;nbsp;훌륭한&amp;nbsp;투자입니다.&lt;/p&gt;</description>
      <category>개발자 이해하기</category>
      <category>개발자</category>
      <category>미래</category>
      <category>파이썬</category>
      <category>파이썬 개발자의 직업 기회: 국내외 시장 분석 새로운 산업 전망 인공지능과 빅데이터 시대 최신 트렌드 분석</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/380</guid>
      <comments>https://pinelover.tistory.com/380#entry380comment</comments>
      <pubDate>Fri, 3 Feb 2023 03:51:53 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 공부하는 방법 시작하기</title>
      <link>https://pinelover.tistory.com/379</link>
      <description>&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다음은&amp;nbsp;Python&amp;nbsp;프로그래밍을&amp;nbsp;공부하기&amp;nbsp;위해&amp;nbsp;따를&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;단계입니다.&lt;br /&gt;&lt;br /&gt;좋은 교과서나 온라인 과정 선택: 교과서에서 온라인 과정 및 비디오 자습서에 이르기까지 Python 학습에 사용할 수 있는 많은 리소스가 있습니다. 귀하의 학습 스타일과 경험 수준에 맞는 리소스를 선택하십시오.&lt;/li&gt;
&lt;li&gt;기본 구문에 익숙해지십시오: 변수, 데이터 유형, 연산자, 제어 구조 및 함수를 포함하여 Python의 기본 구문을 배우는 것부터 시작하십시오.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;정기적으로&amp;nbsp;코딩&amp;nbsp;연습:&amp;nbsp;Python을&amp;nbsp;배우는&amp;nbsp;가장&amp;nbsp;좋은&amp;nbsp;방법은&amp;nbsp;코드를&amp;nbsp;작성하는&amp;nbsp;것입니다.&amp;nbsp;간단한&amp;nbsp;연습과&amp;nbsp;소규모&amp;nbsp;프로젝트&amp;nbsp;작업으로&amp;nbsp;시작하여&amp;nbsp;기술을&amp;nbsp;향상시키면서&amp;nbsp;점차&amp;nbsp;복잡성을&amp;nbsp;증가시킵니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;대화형&amp;nbsp;도구&amp;nbsp;사용:&amp;nbsp;Python&amp;nbsp;환경에는&amp;nbsp;코드&amp;nbsp;스니펫을&amp;nbsp;시도하고&amp;nbsp;즉각적인&amp;nbsp;피드백을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;대화형&amp;nbsp;셸이&amp;nbsp;포함되어&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;도구를&amp;nbsp;활용하여&amp;nbsp;실험하고&amp;nbsp;이해를&amp;nbsp;강화하십시오.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;커뮤니티에&amp;nbsp;참여하기:&amp;nbsp;Python&amp;nbsp;프로그래밍&amp;nbsp;전용&amp;nbsp;온라인&amp;nbsp;커뮤니티와&amp;nbsp;포럼이&amp;nbsp;많이&amp;nbsp;있습니다.&amp;nbsp;이러한&amp;nbsp;커뮤니티에&amp;nbsp;참여하면&amp;nbsp;배울&amp;nbsp;때&amp;nbsp;도움과&amp;nbsp;안내를&amp;nbsp;제공할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;다른&amp;nbsp;Python&amp;nbsp;개발자를&amp;nbsp;만날&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;설명서&amp;nbsp;읽기:&amp;nbsp;공식&amp;nbsp;Python&amp;nbsp;설명서는&amp;nbsp;자습서,&amp;nbsp;참조&amp;nbsp;가이드&amp;nbsp;및&amp;nbsp;예제를&amp;nbsp;포함한&amp;nbsp;풍부한&amp;nbsp;정보입니다.&amp;nbsp;언어&amp;nbsp;및&amp;nbsp;특정&amp;nbsp;모듈에&amp;nbsp;대한&amp;nbsp;이해를&amp;nbsp;심화하는&amp;nbsp;데&amp;nbsp;사용하십시오.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;프로젝트&amp;nbsp;구축:&amp;nbsp;경험이&amp;nbsp;쌓이면&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;프로젝트&amp;nbsp;작업을&amp;nbsp;시작하여&amp;nbsp;배운&amp;nbsp;내용을&amp;nbsp;적용하십시오.&amp;nbsp;이것은&amp;nbsp;당신에게&amp;nbsp;실질적인&amp;nbsp;경험을&amp;nbsp;제공하고&amp;nbsp;당신의&amp;nbsp;기술을&amp;nbsp;보여줄&amp;nbsp;작업&amp;nbsp;포트폴리오를&amp;nbsp;구축하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;계속&amp;nbsp;학습하세요:&amp;nbsp;Python은&amp;nbsp;새로운&amp;nbsp;기능과&amp;nbsp;업데이트가&amp;nbsp;정기적으로&amp;nbsp;릴리스되는&amp;nbsp;지속적으로&amp;nbsp;진화하는&amp;nbsp;언어입니다.&amp;nbsp;블로그,&amp;nbsp;책을&amp;nbsp;읽고&amp;nbsp;컨퍼런스&amp;nbsp;및&amp;nbsp;워크샵에&amp;nbsp;참석하여&amp;nbsp;최신&amp;nbsp;개발&amp;nbsp;정보를&amp;nbsp;확인하십시오.&lt;br /&gt;&lt;br /&gt;코딩을&amp;nbsp;배우려면&amp;nbsp;시간과&amp;nbsp;헌신이&amp;nbsp;필요합니다.&amp;nbsp;그것을&amp;nbsp;고수하고&amp;nbsp;계속&amp;nbsp;연습하면&amp;nbsp;곧&amp;nbsp;능숙한&amp;nbsp;Python&amp;nbsp;프로그래머가&amp;nbsp;될&amp;nbsp;것입니다!&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발자 이해하기</category>
      <category>파이썬 공부하는 방법 시작하기</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/379</guid>
      <comments>https://pinelover.tistory.com/379#entry379comment</comments>
      <pubDate>Fri, 3 Feb 2023 03:50:47 +0900</pubDate>
    </item>
    <item>
      <title>django - OneToMany realation - foreignKey</title>
      <link>https://pinelover.tistory.com/377</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673789220268&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;Django&quot; data-og-description=&quot;The web framework for perfectionists with deadlines.&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&quot; data-og-url=&quot;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP5eX5/hyRhLjGBWL/eKejllY1vQngfKOmneK440/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP5eX5/hyRhLjGBWL/eKejllY1vQngfKOmneK440/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546');&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;Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The web framework for perfectionists with deadlines.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;/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;결국 모델간에 1:N 대응을 만드는 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1673789728475&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return &quot;%s %s&quot; % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

    class Meta:
        ordering = ['headline']&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;p data-ke-size=&quot;size16&quot;&gt;한명의 기자는 여러개의 기사를 가질 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 한명의 기자는 기사를 0개 가질수도 있고, 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;아래 예시를 보면 Article이 N개에 해당할때 &lt;b&gt;Article안에 ForeignKey로 Reporter를 써준다&lt;/b&gt;. (개인적으로는 이 부분이 가장 햇갈렸다, ForeignKey를 어디에 써줄지, 결국 장고에서 &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;도식화.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UgKwI/btrWlmySAqp/FFs4Ks1OeHdUyus9ctzOYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UgKwI/btrWlmySAqp/FFs4Ks1OeHdUyus9ctzOYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UgKwI/btrWlmySAqp/FFs4Ks1OeHdUyus9ctzOYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgKwI%2FbtrWlmySAqp%2FFFs4Ks1OeHdUyus9ctzOYk%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;883&quot; height=&quot;419&quot; data-filename=&quot;도식화.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 결국 디비 테이블에 로우를 채우는 것이였다.&lt;/p&gt;</description>
      <category>백엔드</category>
      <category>Django</category>
      <category>ForeignKey</category>
      <category>OneToMany</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/377</guid>
      <comments>https://pinelover.tistory.com/377#entry377comment</comments>
      <pubDate>Sun, 15 Jan 2023 22:36:07 +0900</pubDate>
    </item>
    <item>
      <title>swift - 상속 또는 참조(reference)의 사용없이 polymorphism(다형성)을 지향 방법</title>
      <link>https://pinelover.tistory.com/375</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 글에서 class의 사용을 지양하자 했는데, 그렇다면 swift는 struct의 사용을 지향합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 struct에서는 상속이 없어 다형성을 구현 못하는데, 어떻게 해야될까요?&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&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/dMurNL/btrT80GlqN5/HkIMCFuEQxt1wI1KNcWHWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMurNL/btrT80GlqN5/HkIMCFuEQxt1wI1KNcWHWK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;822&quot; data-filename=&quot;스크린샷 2022-12-20 오후 11.33.41.png&quot; style=&quot;width: 50.4196%; margin-right: 10px;&quot; data-widthpercent=&quot;51.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMurNL/btrT80GlqN5/HkIMCFuEQxt1wI1KNcWHWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMurNL%2FbtrT80GlqN5%2FHkIMCFuEQxt1wI1KNcWHWK%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;1468&quot; height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyVlE4/btrT7EKfvf0/eDpXZAjHeiMkr5jT8mo2u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyVlE4/btrT7EKfvf0/eDpXZAjHeiMkr5jT8mo2u1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;828&quot; data-filename=&quot;스크린샷 2022-12-20 오후 11.37.30.png&quot; style=&quot;width: 48.4176%;&quot; data-widthpercent=&quot;48.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyVlE4/btrT7EKfvf0/eDpXZAjHeiMkr5jT8mo2u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyVlE4%2FbtrT7EKfvf0%2FeDpXZAjHeiMkr5jT8mo2u1%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;1420&quot; height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/div&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;영상에서 이제 질문을 한개 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.draw()를 여러번 호출하면서 무슨 draw가 Line의 Point 중 누구의 것인지 어떻게 알 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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/9vZW8/btrT9XPRQU6/7paFqnXxDT93tWNYUdXMKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9vZW8/btrT9XPRQU6/7paFqnXxDT93tWNYUdXMKk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;816&quot; data-filename=&quot;스크린샷 2022-12-20 오후 11.38.51.png&quot; style=&quot;width: 29.7173%; margin-right: 10px;&quot; data-widthpercent=&quot;30.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9vZW8/btrT9XPRQU6/7paFqnXxDT93tWNYUdXMKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9vZW8%2FbtrT9XPRQU6%2F7paFqnXxDT93tWNYUdXMKk%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;1182&quot; height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LV1fr/btrUaqcZBEt/NI3PhKKB632XxxcKqrubS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LV1fr/btrUaqcZBEt/NI3PhKKB632XxxcKqrubS1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;844&quot; data-filename=&quot;스크린샷 2022-12-20 오후 11.39.28.png&quot; style=&quot;width: 37.8711%; margin-right: 10px;&quot; data-widthpercent=&quot;38.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LV1fr/btrUaqcZBEt/NI3PhKKB632XxxcKqrubS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLV1fr%2FbtrUaqcZBEt%2FNI3PhKKB632XxxcKqrubS1%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;1558&quot; height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXL1o/btrT7FoSxfk/gL5HPvz41lo17tIbPEYzrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXL1o/btrT7FoSxfk/gL5HPvz41lo17tIbPEYzrK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;806&quot; data-filename=&quot;스크린샷 2022-12-20 오후 11.40.23.png&quot; style=&quot;width: 30.086%;&quot; data-widthpercent=&quot;30.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXL1o/btrT7FoSxfk/gL5HPvz41lo17tIbPEYzrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXL1o%2FbtrT7FoSxfk%2FgL5HPvz41lo17tIbPEYzrK%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;1182&quot; height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은, protocol witness table을 사용하라 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Drawable protocol에 순응하는 Point와 Line에 대한 테이블을 각각 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 테이블의 draw는 실제 draw의 구현을 참조하게 됩니다.&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;즉 정리하면, struct를 통해서도 다형성을 갖게 할 수 있습니다. 바로 프로토콜을 사용해서.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 프로토콜을 따르는 변수가 어떻게 메모리 상에 존재하고, 그것의 메소드를 dispatch하는지 알아보겠습니다.&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;참조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2016/416/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/videos/play/wwdc2016/416/&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>Advanced Swift</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/375</guid>
      <comments>https://pinelover.tistory.com/375#entry375comment</comments>
      <pubDate>Tue, 20 Dec 2022 23:43:36 +0900</pubDate>
    </item>
    <item>
      <title>swift - method dispatch : 메소드 디스패치</title>
      <link>https://pinelover.tistory.com/374</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 스위프트에는 static dispatch와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamic dispatch가 있다.&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;static dispatch&lt;/b&gt;&lt;/p&gt;
&lt;p&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/bBrUsK/btrT42wuTkW/RtfZ1hGqU1ZpsJQPF5hcj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBrUsK/btrT42wuTkW/RtfZ1hGqU1ZpsJQPF5hcj1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;756&quot; data-filename=&quot;스크린샷 2022-12-20 오전 5.01.35.png&quot; style=&quot;width: 51.1775%; margin-right: 10px;&quot; data-widthpercent=&quot;51.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBrUsK/btrT42wuTkW/RtfZ1hGqU1ZpsJQPF5hcj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBrUsK%2FbtrT42wuTkW%2FRtfZ1hGqU1ZpsJQPF5hcj1%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;1460&quot; height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IkcfC/btrT4QQuDyr/a9omaSefrj47GP7GPD0bt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IkcfC/btrT4QQuDyr/a9omaSefrj47GP7GPD0bt1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;784&quot; data-filename=&quot;스크린샷 2022-12-20 오전 4.59.08.png&quot; data-widthpercent=&quot;48.22&quot; style=&quot;width: 47.6597%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IkcfC/btrT4QQuDyr/a9omaSefrj47GP7GPD0bt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIkcfC%2FbtrT4QQuDyr%2Fa9omaSefrj47GP7GPD0bt1%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;1410&quot; height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;static dispatch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 drawAPoint 메소드가 Point안의 struct의 draw 메소드인 경우, 호출 타이밍이 너무 명확한 경우 컴파일러는 static하게 디스패치 해버린다. 이 경우 drawPoint 호출시 이중으로 스택에 불필요하게 세팅되었을 오버헤드가 사라진다.&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;dynamic dispatch&lt;/b&gt;&lt;/p&gt;
&lt;p&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/bnYr8d/btrT4HzkQPZ/XPBFiuUMkmTfoWGZ5ZikK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnYr8d/btrT4HzkQPZ/XPBFiuUMkmTfoWGZ5ZikK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;838&quot; data-filename=&quot;스크린샷 2022-12-20 오전 5.03.23.png&quot; style=&quot;width: 50.1417%; margin-right: 10px;&quot; data-widthpercent=&quot;50.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnYr8d/btrT4HzkQPZ/XPBFiuUMkmTfoWGZ5ZikK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnYr8d%2FbtrT4HzkQPZ%2FXPBFiuUMkmTfoWGZ5ZikK1%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;1508&quot; height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6jBnq/btrT6dRQZ19/8lTIJZzMYQ0K1kKdsVvFU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6jBnq/btrT6dRQZ19/8lTIJZzMYQ0K1kKdsVvFU1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;840&quot; data-filename=&quot;스크린샷 2022-12-20 오전 5.03.49.png&quot; style=&quot;width: 48.6955%;&quot; data-widthpercent=&quot;49.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6jBnq/btrT6dRQZ19/8lTIJZzMYQ0K1kKdsVvFU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6jBnq%2FbtrT6dRQZ19%2F8lTIJZzMYQ0K1kKdsVvFU1%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;1468&quot; height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;dynamic&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 data-ke-size=&quot;size16&quot;&gt;어쨌든, 위 경우를 보면 drawables가 다형성에 의한 배열이라 d.draw가 Point의 draw인지 Line의 draw인지 명확하게 알 수 가 없다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 오전 5.06.34.png&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tp0nA/btrTYDLEOg8/fkdfMqkZI4tiCuM1x07MSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tp0nA/btrTYDLEOg8/fkdfMqkZI4tiCuM1x07MSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tp0nA/btrTYDLEOg8/fkdfMqkZI4tiCuM1x07MSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftp0nA%2FbtrTYDLEOg8%2FfkdfMqkZI4tiCuM1x07MSk%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;1438&quot; height=&quot;830&quot; data-filename=&quot;스크린샷 2022-12-20 오전 5.06.34.png&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 호출로 가면 위 처럼 힙에 있는 데이터의 type이 참조되어 그 타입이 가리키는 draw를 다시 참조하게 된다.&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;style3&quot; /&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://developer.apple.com/videos/play/wwdc2016/416/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/videos/play/wwdc2016/416/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sihyungyou.github.io/iOS-method-dispatch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sihyungyou.github.io/iOS-method-dispatch/&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>Advanced Swift</category>
      <category>Dynamic Dispatch</category>
      <category>method dispatch</category>
      <category>Static Dispatch</category>
      <category>SWIFT</category>
      <category>다이나믹 디스패치</category>
      <category>스태틱 디스패치</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/374</guid>
      <comments>https://pinelover.tistory.com/374#entry374comment</comments>
      <pubDate>Tue, 20 Dec 2022 05:07:46 +0900</pubDate>
    </item>
    <item>
      <title>swift enum의 장점은? enum이란 무엇인가.</title>
      <link>https://pinelover.tistory.com/373</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;enum을 지금까지는 그냥 정해진 제한 범위내의 값을 사용하기 쉽게 모아놓은 타입이라 생각했는데, 메모리 공간을 공부하다 보니 stack에 저장되는지 heap에 저장되는지 매우 중요했다. reference count 때문인데, 이것이 적을수록 좋기 때문에, 가급적 string보다 enum 사용이 좋은 경우가 있더라.&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;그래서 enum의 특징을 찾았는데, 해석해보면.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;f319&quot; data-selectable-paragraph=&quot;&quot;&gt;They are stored in stack&lt;/li&gt;
&lt;li id=&quot;1f05&quot; data-selectable-paragraph=&quot;&quot;&gt;They have no inheritance&lt;/li&gt;
&lt;li id=&quot;2be0&quot; data-selectable-paragraph=&quot;&quot;&gt;They don&amp;rsquo;t require explicit initializer&lt;/li&gt;
&lt;li id=&quot;44e4&quot; data-selectable-paragraph=&quot;&quot;&gt;They can conform to protocols&lt;/li&gt;
&lt;li id=&quot;6ddf&quot; data-selectable-paragraph=&quot;&quot;&gt;It can have extensions&lt;/li&gt;
&lt;li id=&quot;12be&quot; data-selectable-paragraph=&quot;&quot;&gt;It even can have methods and&lt;span&gt;&amp;nbsp;&lt;/span&gt;computed&lt;span&gt;&amp;nbsp;&lt;/span&gt;properties(not stored!)&lt;/li&gt;
&lt;li id=&quot;2576&quot; data-selectable-paragraph=&quot;&quot;&gt;And it can be used with generic types&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;enum은 struct와 같이 value-type입니다.&lt;/b&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;b&gt;스택에 저장된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;상속이 없다.&lt;/li&gt;
&lt;li&gt;명시적인 이니셜라이저가 필요 없다.&lt;/li&gt;
&lt;li&gt;protocol을 따를수 있다!&lt;/li&gt;
&lt;li&gt;extension을 가질수 있다!&lt;/li&gt;
&lt;li&gt;methods와 computed properties를 가질 수 있다!&lt;/li&gt;
&lt;li&gt;generic type과 함께 쓰일 수 있다?&lt;/li&gt;
&lt;/ol&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgYTji/btrT40ZGski/5pAcbnCozTmkv1URTvAnUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgYTji/btrT40ZGski/5pAcbnCozTmkv1URTvAnUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgYTji/btrT40ZGski/5pAcbnCozTmkv1URTvAnUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgYTji%2FbtrT40ZGski%2F5pAcbnCozTmkv1URTvAnUk%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;668&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;668&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;여기까지가 기본적인 enum에 대한 정보들이다.&lt;/p&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;이제는 약간 심화 내용인데, enum이 value-type이다 보니, enum안에 recursion은 사용하면 안된다함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stack에 저장되려면 정확한 사이즈를 알아야되는데, 리컬젼은 모르니까...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsLq3s/btrT6YGQUFE/uiyQruF5qs6ccNSp48K2Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsLq3s/btrT6YGQUFE/uiyQruF5qs6ccNSp48K2Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsLq3s/btrT6YGQUFE/uiyQruF5qs6ccNSp48K2Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsLq3s%2FbtrT6YGQUFE%2FuiyQruF5qs6ccNSp48K2Ck%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;228&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 indirect case는 힙 메모리를 포인트 하도록 하여 위처럼 사용이 가능하다함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;indirect enum 또는 indirect case를 통해 heap에 enum의 데이터가 저장되도록 하고, point하여 값을 참조하는 방식을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671468828550&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;indirect enum LinkedListItem&amp;lt;T&amp;gt; {
    case endPoint(value: T)
    case linkNode(value: T, next: LinkedListItem)
}

let third = LinkedListItem.endPoint(value: &quot;Third&quot;)
let second = LinkedListItem.linkNode(value: &quot;Second&quot;, next: third)
let first = LinkedListItem.linkNode(value: &quot;First&quot;, next: second)

var currentNode = first

listLoop: while true {
    switch currentNode {
    case .endPoint(let value):
        print(value)
        break listLoop
    case .linkNode(let value, let next):
        print(value)
        currentNode = next
    }
}&lt;/code&gt;&lt;/pre&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;style3&quot; /&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;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/swlh/three-ways-to-use-enums-in-swift-21c51517162e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/swlh/three-ways-to-use-enums-in-swift-21c51517162e&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.hackingwithswift.com/example-code/language/what-are-indirect-enums&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.hackingwithswift.com/example-code/language/what-are-indirect-enums&lt;/a&gt;&lt;/p&gt;</description>
      <category>Advanced Swift</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/373</guid>
      <comments>https://pinelover.tistory.com/373#entry373comment</comments>
      <pubDate>Tue, 20 Dec 2022 01:53:52 +0900</pubDate>
    </item>
    <item>
      <title>swift struct내에 class property가 있으면 안좋다 - reference counting과 스위프트 성능의 관계</title>
      <link>https://pinelover.tistory.com/372</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;struct를 사용하다 보면 내부에 property는 어떻게 메모리 상에서 존재하는지 궁금했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.17.05.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIKyrA/btrT5VwWE1a/qeHb28u1KKUxwSyJk9Ynjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIKyrA/btrT5VwWE1a/qeHb28u1KKUxwSyJk9Ynjk/img.png&quot; data-alt=&quot;struct내에 2개의 프로퍼티들 모두 heap에 존재하게 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIKyrA/btrT5VwWE1a/qeHb28u1KKUxwSyJk9Ynjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIKyrA%2FbtrT5VwWE1a%2FqeHb28u1KKUxwSyJk9Ynjk%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;498&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.17.05.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;struct내에 2개의 프로퍼티들 모두 heap에 존재하게 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text, font 모두 referenceType으로 힙에 저장됩니다. 이런 경우 오른쪽 이미지 처럼, 스택에 레퍼런스하는 지점만 있고 모두 힙에 존재하는 데이터를 포인팅하게 되는데요. Label은 즉 두번의 레퍼런스 카운팅을 하게되어 비효율적이라 합니다.&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;reference counting은 자주 일어나지 않는게 좋습니다. 즉 &lt;b&gt;아무리 struct라도 reference를 소유하는 경우는 꽤나 비효율적으로 동작한다는 얘기&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;struct는 1개 이상의(2개 이상인거 같은데...) reference를 갖는 경우, 레퍼런스 카운팅이 소유하는 레퍼런스 갯수만큼 발생하므로, class에 비해 비효율적이라 할 수 있습니다. struct를 효율적으로 사용하려면 reference를 갖지 않는 쪽으로 합시다.&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;즉 struct의 경우 string을 갖는거보다, enum을 소유하는게 효율적입니다.&lt;/p&gt;
&lt;p&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/1d37I/btrT3p60Lp2/mcGSrKURim2k33TwfyPPaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1d37I/btrT3p60Lp2/mcGSrKURim2k33TwfyPPaK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;762&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.25.01.png&quot; style=&quot;width: 50.6411%; margin-right: 10px;&quot; data-widthpercent=&quot;51.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1d37I/btrT3p60Lp2/mcGSrKURim2k33TwfyPPaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1d37I%2FbtrT3p60Lp2%2FmcGSrKURim2k33TwfyPPaK%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;762&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcYfwS/btrT1HmApNS/5NvimFhOMWm5C3B8cLCSRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcYfwS/btrT1HmApNS/5NvimFhOMWm5C3B8cLCSRK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;740&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.24.30.png&quot; style=&quot;width: 48.1961%;&quot; data-widthpercent=&quot;48.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcYfwS/btrT1HmApNS/5NvimFhOMWm5C3B8cLCSRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcYfwS%2FbtrT1HmApNS%2F5NvimFhOMWm5C3B8cLCSRK%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;1342&quot; height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽 경우는 mimeType이 레퍼런스, 오른쪽은 enum을 사용하여 struct 내부의 레퍼런스가 2개에서 1개로 된 모습.&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;좌측 경우 보다, 우측이 type-safe함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 위에서 주장하는 장점이 레퍼런스가 2개에서 1개로 줄은건데, 그렇다면 enum은 heap에 저장되는게 아니라, stack에 아래처럼 저장되는거 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.30.57.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcqmH/btrT6vEMYpK/6EdK3spugOJLdt05czlgQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcqmH/btrT6vEMYpK/6EdK3spugOJLdt05czlgQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcqmH/btrT6vEMYpK/6EdK3spugOJLdt05czlgQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtcqmH%2FbtrT6vEMYpK%2F6EdK3spugOJLdt05czlgQ1%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;1468&quot; height=&quot;764&quot; data-filename=&quot;스크린샷 2022-12-20 오전 12.30.57.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;764&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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://developer.apple.com/videos/play/wwdc2016/416/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/videos/play/wwdc2016/416/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>class</category>
      <category>property</category>
      <category>reference counting</category>
      <category>struct</category>
      <category>SWIFT</category>
      <category>레퍼런스카운트</category>
      <category>스위프트</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/372</guid>
      <comments>https://pinelover.tistory.com/372#entry372comment</comments>
      <pubDate>Tue, 20 Dec 2022 00:21:58 +0900</pubDate>
    </item>
    <item>
      <title>swift string은 Stack, Heap 둘중 어디에 저장될까?</title>
      <link>https://pinelover.tistory.com/371</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정답은 heap이다...&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;그런데 string은 value 타입임.&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;즉 swift에서 저장 공간과 value, reference 타입은 관계가 없다. 즉 value 타입이라고 항상 스택에 저장되는게 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만 string은 짧은 문자열은 스택에 저장되기도 한다 함(16바이트 이하)...?&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;string이 heap에 저장되는 이유에 대해 알아보자.&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;array, dictionay, set, string(collection of char)과 같이 가변 길이의 Collection들은 내부 데이터를 힙에 저장한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 스택에 저장되는 경우는 변수의 생명주기가 static한 경우고, value type의 사이즈가 컴파일 타임에 저장되어 스택의 영역을 얼마만큼 차지할지 미리 알게되면, 스택으로 저장한다. 반대로 말하면 스택은 dynamic한 생명주기랑 관련 없고 (scope에 관련없는 생명주기), 사이즈가 런타임에 변하는 경우는 스택과 상관없다.&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;일단 큰 원리는 이런데, swift가 힙에 저장되도 스택 옵티마이제이션을 한다해서, 정확히 어떻게 되는건지는 아직 잘 파악이 안된다...&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;스크린샷 2022-12-19 오후 11.07.16.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SwGMy/btrT2RbvsoW/QRe8hJlmtrj1pHBUJP3bd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SwGMy/btrT2RbvsoW/QRe8hJlmtrj1pHBUJP3bd1/img.png&quot; data-alt=&quot;스위프트 메모리 구조 - memory architecture (https://swiftrocks.com/memory-management-and-performance-of-value-types)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SwGMy/btrT2RbvsoW/QRe8hJlmtrj1pHBUJP3bd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSwGMy%2FbtrT2RbvsoW%2FQRe8hJlmtrj1pHBUJP3bd1%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;1200&quot; height=&quot;610&quot; data-filename=&quot;스크린샷 2022-12-19 오후 11.07.16.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스위프트 메모리 구조 - memory architecture (https://swiftrocks.com/memory-management-and-performance-of-value-types)&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 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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;참조1&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2016/416/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/videos/play/wwdc2016/416/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sujinnaljin.medium.com/ios-swift%EC%9D%98-type%EA%B3%BC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%80%EC%9E%A5-%EA%B3%B5%EA%B0%84-25555c69ccff&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sujinnaljin.medium.com/ios-swift%EC%9D%98-type%EA%B3%BC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%80%EC%9E%A5-%EA%B3%B5%EA%B0%84-25555c69ccff&lt;/a&gt;&lt;/p&gt;</description>
      <category>Advanced Swift</category>
      <category>Heap</category>
      <category>memory architecture</category>
      <category>stack</category>
      <category>SWIFT</category>
      <category>메모리구조</category>
      <category>스위프트</category>
      <category>스택</category>
      <category>힙</category>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/371</guid>
      <comments>https://pinelover.tistory.com/371#entry371comment</comments>
      <pubDate>Mon, 19 Dec 2022 23:44:22 +0900</pubDate>
    </item>
    <item>
      <title>보이저 엑스 iOS 채용</title>
      <link>https://pinelover.tistory.com/368</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668682905702&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;개발자 채용&quot; data-og-description=&quot;보이저엑스는 더욱 즐겁고 편리한 삶을 돕는 인공지능 소프트웨어를 개발하는 스타트업 입니다.&quot; data-og-host=&quot;v6xcareer.notion.site&quot; data-og-source-url=&quot;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&quot; data-og-url=&quot;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWx6p/hyQB0AE4Th/Zl14EwUMvu70VqKTCknzV0/img.jpg?width=1500&amp;amp;height=972&amp;amp;face=0_0_1500_972,https://scrap.kakaocdn.net/dn/miuXQ/hyQBQSkOJQ/lc4dwhYfIAzWLKSAA8utcK/img.jpg?width=1500&amp;amp;height=972&amp;amp;face=0_0_1500_972&quot;&gt;&lt;a href=&quot;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://v6xcareer.notion.site/2f61a1b40c81495eaf564cde9efc6089&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWx6p/hyQB0AE4Th/Zl14EwUMvu70VqKTCknzV0/img.jpg?width=1500&amp;amp;height=972&amp;amp;face=0_0_1500_972,https://scrap.kakaocdn.net/dn/miuXQ/hyQBQSkOJQ/lc4dwhYfIAzWLKSAA8utcK/img.jpg?width=1500&amp;amp;height=972&amp;amp;face=0_0_1500_972');&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;개발자 채용&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;v6xcareer.notion.site&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;사용하는 어플이 잘만들어서 어디서 만들었나 궁금해서 회사를 찾아보니까, 보이저 엑스라는 곳이였습니다. 맥 어플 사용성이 좋아서 ios 팀이 어떤곳인가 사이트에서 보다보니, 채용 공고도 있어서 한번 쭉 봤는데요.&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;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;h3 data-ke-size=&quot;size23&quot;&gt;보이저엑스 개발자 연봉&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;보이저엑스의 (2022년 현재) 개발자 연봉 (삼각형을 클릭하세요)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인턴: 3,840만원 (모두 동일)&lt;/li&gt;
&lt;li&gt;신입: 4,800만원 &lt;b&gt;이상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;2년 이상 경력: 5,200만원 &lt;b&gt;이상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;5년 이상 경력: 6,500만원 &lt;b&gt;이상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;10년 이상 경력: 8,500만원 &lt;b&gt;이상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;참고) 정직원 개발자의 20% 정도는 연봉 1억원 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지원 전 자가점검 목록&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;b&gt;정직원&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;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;iOS 개발자 기술 질문: 9개 중 5개 이상 잘 대답할 수 있어야 함 &lt;/span&gt;&lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;1&quot; data-reactroot=&quot;&quot;&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;&lt;b&gt;[ ] Q1. Auto Layout의 장단점은?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문은 제가 회사에서 일하면서 한번 생각 해본적 있는 주제긴 합니다. 오토레이아웃을 사용하는 방법과 일일이 frame을 계산해서 뷰를 위치 시키는 방법이 있다고 생각했습니다.&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;a href=&quot;https://velog.io/@wonhee010/Auto-Layout-vs-Frame-Based-Layout&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@wonhee010/Auto-Layout-vs-Frame-Based-Layout&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;/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;추가로 autoresizing-mask 방법도 있다는데, 이건 음 딱히 뭔가 내가 조절해서 의도적으로 사용한적은 없는거 같다.&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;&lt;a href=&quot;https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.htm&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플 공식 문서인데, auto layout에 대한, 오토레이아웃은 관계로 레이아웃을 정의하는거고, 프레임 계산법은 레이아웃 변형 자유도가 높은 방법!&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[ ] Q2. MVC 패턴이란?&lt;/b&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음 이제 이걸 제가 0부터 설명한다 해보면, 아이폰 앱에서는 흔히 데이터가 있고 데이터를 이용해 뷰를 그리고, 데이터를 어떻게 뷰에 그려줄지 조절하는 컨트롤러가 있다고 생각하고 있습니다.&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;컨트롤러는 여기서 뷰에 대한 노출 여부 조절과, 데이터를 뷰에 넣어주는 역할을 한다 생각합니다.&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;&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;&lt;b&gt;[ ] Q3. KVC와 KVO란?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://velog.io/@sainkr/iOS-KVC-KVO&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@sainkr/iOS-KVC-KVO&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668686200189&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;[iOS] KVC, KVO&quot; data-og-description=&quot;Key-Value Coding 객체의 값을 직접 가져오지 않고, Key 또는 KeyPath를 이용해서 간접적으로 데이터를 가져오거나 수정하는 방법\\BaseType.ProperyName으로 만들어준다.KeyPath : Read onlyWritableKeyPath : v&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@sainkr/iOS-KVC-KVO&quot; data-og-url=&quot;https://velog.io/@sainkr/iOS-KVC-KVO&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/I2Dtj/hyQBYJDDK1/xy3wQNQ18qdefE9LgCtLk0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/g3IbE/hyQB2ebIQD/yzYdB6sIqR3KeOXy8fDZy0/img.png?width=421&amp;amp;height=421&amp;amp;face=120_180_344_360&quot;&gt;&lt;a href=&quot;https://velog.io/@sainkr/iOS-KVC-KVO&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@sainkr/iOS-KVC-KVO&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/I2Dtj/hyQBYJDDK1/xy3wQNQ18qdefE9LgCtLk0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/g3IbE/hyQB2ebIQD/yzYdB6sIqR3KeOXy8fDZy0/img.png?width=421&amp;amp;height=421&amp;amp;face=120_180_344_360');&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;[iOS] KVC, KVO&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Key-Value Coding 객체의 값을 직접 가져오지 않고, Key 또는 KeyPath를 이용해서 간접적으로 데이터를 가져오거나 수정하는 방법\\BaseType.ProperyName으로 만들어준다.KeyPath : Read onlyWritableKeyPath : v&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.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;kvc는 지나가다 본적은 있는데 키 또는 키패스를 사용해서 간접적으로 값을 가져오거나 지정하는 문법을 사용한는 것을 본적이 있었습니다. key value coding&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; kvo는 노티피케이션 패턴?이라 해서 논리적으로 떨어진 부분간에 연결을 할때 주로 사용하다고 알고 있었습니다.&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;일단 제가 사용했던 적은 음, 딱 기억나진 않는데, 객체 a에 observer를 추가해서 변화를 감지해야 될때가 있습니다. 사실 combine이 나오기 전에 swift에서는 객체의 변화에 대한 감지를 rxswift나 kvo를 이용해서 해왔다 생각하는데, 저 방식들을 사용하지 않고서는 객체에 대한 변화를 감지하는게 종종 어려웠습니다. 몇초마다 확인하는것이 아니라면?&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;kvo가 어떻게 구현되어있었는지 항상 궁금하긴했는데, 어쨌든 변화에 대한 감지를 위한 수단중에 한개라고 생각하고 사용해왔습니다.&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;&lt;b&gt;[ ] Q4. Swift의 특징은?&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 swift에서 struct가 value type으로 사용된다는게 큰 특징이라 생각합니다. 이로 인해 struct 타입들은 레퍼런스로 값을 확인하는게 아니라 값을 복사해서 다룬다는 점이 특징인거 같습니다. Int등 많은 타입도 struct 타입이라 하는데요 그래서 우리가 새로운 값들을 대입하는 것은 그것의 레퍼런스를 연결해주는 것인 경우보다는, 복사해서 사용하는 경우들이 많습니다. 함수도 마찬가지구요. 그래서 swift에서는 고차원 함수의 사용이 자연스러운거 같다고 생각한 적이 있는데 이후로 고차원 함수에 대한 막연한 부담감이 덜어진거 같습니다.&amp;nbsp;&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;&lt;b&gt;[ ] Q5. Higher Order Function이란?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 뭔가 전에는 알았는데, 2년 정도 고차원 함수를 사용하면서 정의를 잊어버렸는데요.&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;a href=&quot;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668687758673&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;Higher-Order Function 이란 무엇인가&quot; data-og-description=&quot;Higher-Order Function. 한국어로 고차함수라 부르는 이 함수는 Functional Programming을 할 때 많이 사용 한다. Higher-Order Function(이하 HOF)를 사용하면 보다 유연하고 반복을 줄일 수 있는&amp;hellip;&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&quot; data-og-url=&quot;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79&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;Higher-Order Function 이란 무엇인가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Higher-Order Function. 한국어로 고차함수라 부르는 이 함수는 Functional Programming을 할 때 많이 사용 한다. Higher-Order Function(이하 HOF)를 사용하면 보다 유연하고 반복을 줄일 수 있는&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.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;/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;음 맞아요 뭔가 어느순간부터 filter, map, reduce가 고차원 함수라고 생각했는데 주로 이것만 사용해서. 잘 생각해보면 저게 기능땜에 그런게 아니라 저걸 사용하면 쉽게 함수를 인자로 받아 처리할 수 있어서 그랬죠 ㅎㅎ;&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;&lt;b&gt;[ ] Q6. Method Swizzling이란?&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://babbab2.tistory.com/76&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668687884684&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;Swift) Method Swizzling을 알아보자&quot; data-og-description=&quot;안녕하세요 :) 소들입니다 오랜만의 포스팅이네요 엉엉   퇴사 후 하루도 못 쉬다가 처음으로 4일 간 휴식을 취하고 왔읍니다..! 영양가 없는 TMI는 집어치우고 오늘 공부할 것은 바로바로 Method &quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/76&quot; data-og-url=&quot;https://babbab2.tistory.com/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2HBzR/hyQBSvS843/kW7PpED1QKuMP3sQqVVgtk/img.png?width=636&amp;amp;height=472&amp;amp;face=0_0_636_472,https://scrap.kakaocdn.net/dn/ccy1Ce/hyQBbcLOAw/8fKRcXTKDAeuhZeWLbRtx1/img.png?width=636&amp;amp;height=472&amp;amp;face=0_0_636_472,https://scrap.kakaocdn.net/dn/cUetQt/hyQBbDRkH3/SERxwlGqD2yBpEyvlq0vNK/img.png?width=1936&amp;amp;height=312&amp;amp;face=0_0_1936_312&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2HBzR/hyQBSvS843/kW7PpED1QKuMP3sQqVVgtk/img.png?width=636&amp;amp;height=472&amp;amp;face=0_0_636_472,https://scrap.kakaocdn.net/dn/ccy1Ce/hyQBbcLOAw/8fKRcXTKDAeuhZeWLbRtx1/img.png?width=636&amp;amp;height=472&amp;amp;face=0_0_636_472,https://scrap.kakaocdn.net/dn/cUetQt/hyQBbDRkH3/SERxwlGqD2yBpEyvlq0vNK/img.png?width=1936&amp;amp;height=312&amp;amp;face=0_0_1936_312');&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;Swift) Method Swizzling을 알아보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 :) 소들입니다 오랜만의 포스팅이네요 엉엉   퇴사 후 하루도 못 쉬다가 처음으로 4일 간 휴식을 취하고 왔읍니다..! 영양가 없는 TMI는 집어치우고 오늘 공부할 것은 바로바로 Method&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[ ] Q7. HTTP/2의 특징은?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 음 사실 아예 몰랐다. http 프로토콜 버전에 따른 차이가 있던데 싱기... 그냥 썼는데 ㅠㅠ&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;&lt;b&gt;[ ] Q8. Memory Leak의 대처방법은?&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 큰 맥락에서 스위프트가 메모리를 관리하는 방식이 ARC이고, 자바 같은 언어는 가비지 컬렉션인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션은 사람이 인지할 만큼의 딱 원칙이 있지는 않다더라, ARC는 원칙이 있는데, strong reference로 연결되어 사용중인 메모리 영역에 연결된 갯수 만큼 카운트를 올리는데 0이면 메모리를 해제한다는 원리. 이게 참 사람이 이해하기 명확한 규칙이긴 한거 같다.&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;그래서 메모리 릭은 언제 발생하냐면 retain cycle 때문에 발생한다.&amp;nbsp;&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;a href=&quot;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668689611251&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;[iOS 면접질문] Retain Cycle이란?(1) - 개념&quot; data-og-description=&quot;안녕하세요 Foma 입니다!! 오늘 알아볼 건 지난 시간 ARC에 이어서 Retain Cycle 에 대해서 알아보려고 해요! 혹시 ARC를 아직 잘 모르시는 분들은 여기 를 눌러서 먼저 보고 오시면 좋을 거 같아요! 자 &quot; data-og-host=&quot;fomaios.tistory.com&quot; data-og-source-url=&quot;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&quot; data-og-url=&quot;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cMV4Sc/hyQB0goIO6/Z8ypGHoVxg4QlbA7JS56i0/img.png?width=383&amp;amp;height=495&amp;amp;face=0_0_383_495,https://scrap.kakaocdn.net/dn/dyDgxe/hyQBetO5wu/9vpdzNdQmZ0SCHj7x6JCS1/img.png?width=383&amp;amp;height=495&amp;amp;face=0_0_383_495,https://scrap.kakaocdn.net/dn/bJ50IQ/hyQBUN188q/NSwDbfDPEqohKkAMmKOsFk/img.png?width=1274&amp;amp;height=532&amp;amp;face=0_0_1274_532&quot;&gt;&lt;a href=&quot;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fomaios.tistory.com/entry/iOS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-Retain-Cycle%EC%9D%B4%EB%9E%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cMV4Sc/hyQB0goIO6/Z8ypGHoVxg4QlbA7JS56i0/img.png?width=383&amp;amp;height=495&amp;amp;face=0_0_383_495,https://scrap.kakaocdn.net/dn/dyDgxe/hyQBetO5wu/9vpdzNdQmZ0SCHj7x6JCS1/img.png?width=383&amp;amp;height=495&amp;amp;face=0_0_383_495,https://scrap.kakaocdn.net/dn/bJ50IQ/hyQBUN188q/NSwDbfDPEqohKkAMmKOsFk/img.png?width=1274&amp;amp;height=532&amp;amp;face=0_0_1274_532');&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;[iOS 면접질문] Retain Cycle이란?(1) - 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 Foma 입니다!! 오늘 알아볼 건 지난 시간 ARC에 이어서 Retain Cycle 에 대해서 알아보려고 해요! 혹시 ARC를 아직 잘 모르시는 분들은 여기 를 눌러서 먼저 보고 오시면 좋을 거 같아요! 자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fomaios.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&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/12f6H/btrRsJAlIJA/CM17KR4yKulXRLCdAfCvX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/12f6H/btrRsJAlIJA/CM17KR4yKulXRLCdAfCvX0/img.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;495&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/12f6H/btrRsJAlIJA/CM17KR4yKulXRLCdAfCvX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F12f6H%2FbtrRsJAlIJA%2FCM17KR4yKulXRLCdAfCvX0%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;383&quot; height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnb1q/btrRuwl8zrW/v3LpcwhxOdul6ztZwhm3Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnb1q/btrRuwl8zrW/v3LpcwhxOdul6ztZwhm3Ek/img.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;495&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnb1q/btrRuwl8zrW/v3LpcwhxOdul6ztZwhm3Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnnb1q%2FbtrRuwl8zrW%2Fv3LpcwhxOdul6ztZwhm3Ek%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;383&quot; height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사진이 딱 적절한 예시 같다. 일단 이걸 이해하기 위해서 class에 대한 저장 공간은 힙 영역이고, 이에 대한 객체가 생성되면 레퍼런스를 클래스로 잡는데, 클래스의 프로퍼티는 남아 있게 되는 상황이 문젠거...&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;그리고 사전 지식으로 ARC도 알아야 되는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4?category=988866&quot;&gt;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4?category=988866&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1668691047648&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;[iOS 면접질문] ARC(Auto Reference Counting)란?&quot; data-og-description=&quot;안녕하세요 Foma 입니다!! 이번 시간에 알아볼건 바로 &amp;quot;ARC(Auto Reference Couting)&amp;quot; 라는 것인데요. Memory 이 ARC기법은 바로 iOS에서 메모리 관리를 해주는 핵심입니다. &amp;quot;왜 메모리 관리를 해주어야 되는데&quot; data-og-host=&quot;fomaios.tistory.com&quot; data-og-source-url=&quot;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4?category=988866&quot; data-og-url=&quot;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OgA3X/hyQB1TVwBR/a0fQIsGq6LM2LzsTUkdW90/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_240,https://scrap.kakaocdn.net/dn/UAO81/hyQBVGddks/rCkFLng6smH6oiosk0uWQ1/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_240,https://scrap.kakaocdn.net/dn/bnq1Zo/hyQB10GJ3O/p0ps7zPK9GfLhczeoGtlsK/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_240&quot;&gt;&lt;a href=&quot;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4?category=988866&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4?category=988866&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OgA3X/hyQB1TVwBR/a0fQIsGq6LM2LzsTUkdW90/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_240,https://scrap.kakaocdn.net/dn/UAO81/hyQBVGddks/rCkFLng6smH6oiosk0uWQ1/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_240,https://scrap.kakaocdn.net/dn/bnq1Zo/hyQB10GJ3O/p0ps7zPK9GfLhczeoGtlsK/img.png?width=507&amp;amp;height=240&amp;amp;face=0_0_507_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;[iOS 면접질문] ARC(Auto Reference Counting)란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 Foma 입니다!! 이번 시간에 알아볼건 바로 &quot;ARC(Auto Reference Couting)&quot; 라는 것인데요. Memory 이 ARC기법은 바로 iOS에서 메모리 관리를 해주는 핵심입니다. &quot;왜 메모리 관리를 해주어야 되는데&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fomaios.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;p data-ke-size=&quot;size16&quot;&gt;다시 공부할때 보니까, 내가 놓친 부분이 컴파일 타임때 메모리에 대한 retain, release 타임을 정하게 된다는거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;retain이 release되지 않게 잡고 있으면 메모리 릭이 생기게 되는듯. 아직도 막 100% 모든 상황을 이해한거 같진 않다. 위에 경우는 너무 명확한데 서로 잡고 있는게&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://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668692025307&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;iOS 메모리 뜯어보기, 메모리 이슈 디버깅하기, 메모리 릭 찾기&quot; data-og-description=&quot;좋은 사용자 경험을 제공하기 위해서 메모리 관리는 아주 중요합니다. iOS의 메모리는 한정된 자원이며, 여러 프로세스가 공유하는 공유 자원입니다. 만약 메모리 누수가 계속 일어나서 현재 앱&quot; data-og-host=&quot;seizze.github.io&quot; data-og-source-url=&quot;https://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&quot; data-og-url=&quot;https://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjUgbm/hyQBhc1iOk/Mqf6Kxt4lB686vkN790Vj0/img.png?width=3333&amp;amp;height=3373&amp;amp;face=0_0_3333_3373,https://scrap.kakaocdn.net/dn/dEnEql/hyQBQrlKXF/9jCUjSp2KhaSnOBwvAeTiK/img.png?width=1986&amp;amp;height=1142&amp;amp;face=0_0_1986_1142,https://scrap.kakaocdn.net/dn/L2gWz/hyQB0tXABz/vB3npVKARdKfxbnCQ9tEJ1/img.png?width=1654&amp;amp;height=816&amp;amp;face=0_0_1654_816&quot;&gt;&lt;a href=&quot;https://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://seizze.github.io/2019/12/20/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B4%EC%8A%88-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0,-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A6%AD-%EC%B0%BE%EA%B8%B0.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjUgbm/hyQBhc1iOk/Mqf6Kxt4lB686vkN790Vj0/img.png?width=3333&amp;amp;height=3373&amp;amp;face=0_0_3333_3373,https://scrap.kakaocdn.net/dn/dEnEql/hyQBQrlKXF/9jCUjSp2KhaSnOBwvAeTiK/img.png?width=1986&amp;amp;height=1142&amp;amp;face=0_0_1986_1142,https://scrap.kakaocdn.net/dn/L2gWz/hyQB0tXABz/vB3npVKARdKfxbnCQ9tEJ1/img.png?width=1654&amp;amp;height=816&amp;amp;face=0_0_1654_816');&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;iOS 메모리 뜯어보기, 메모리 이슈 디버깅하기, 메모리 릭 찾기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;좋은 사용자 경험을 제공하기 위해서 메모리 관리는 아주 중요합니다. iOS의 메모리는 한정된 자원이며, 여러 프로세스가 공유하는 공유 자원입니다. 만약 메모리 누수가 계속 일어나서 현재 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;seizze.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 나오는 케이스는 뷰컨트롤러 인스턴스가 delegatingView랑 delegate가 뷰컨트롤러 인스턴스를 레퍼런스해서, 뷰컨트롤러 카운트가 2라 dismiss되도 인스턴스의 메모리가 release되지 않는게 문제인가 싶다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[ ] Q9. 이미지 리스트의 성능 향상법은?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이미지 관련된건 기본적으로 캐싱이 요즘 필수로 들어가니까 캐싱 한다고 할거 같다. 그러면 사실 뭐라 물어보실지 모르겠는데, 나는 맨첨에 코코아에 라이브러리 있는줄 모르고 캐싱도 일일이 딕셔너리 형태로 로컬 이미지에 저장하게 구현했었다. 나중에 sd web image 라이브러리인가? 봤는데, 나는 이미지 유효기간은 빼먹고 개발했었는데, 역시 라이브러리가 좋더라 ㅎㅎ&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;일단 이미지는 그럴거 같고? 리스트의 성능 향상이라 하면 음, 딱히 생각해보진 않았었다. 나는 그냥 tableView 셀 로드 될때 이미지도 로드되게 했었는데, 지금 생각해보면 하얀 공간 보일바에 좀 미리 빨리 가져올 수 있는 방법이 있을 수도 있겠다 싶긴한데, 이걸 요구하는 건지는 모르겠음... ㅎㅎ;&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>
      <author>studying develop</author>
      <guid isPermaLink="true">https://pinelover.tistory.com/368</guid>
      <comments>https://pinelover.tistory.com/368#entry368comment</comments>
      <pubDate>Thu, 17 Nov 2022 22:34:57 +0900</pubDate>
    </item>
  </channel>
</rss>