<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>듄의 기록노트</title>
    <link>https://laladuny.tistory.com/</link>
    <description>아이스아메리카노와 함께하는 인생

초보 iOS Developer</description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 05:52:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>듀니듀니</managingEditor>
    <image>
      <title>듄의 기록노트</title>
      <url>https://tistory1.daumcdn.net/tistory/4903871/attach/89c3371362994aac8920682c9aafb3b6</url>
      <link>https://laladuny.tistory.com</link>
    </image>
    <item>
      <title>[RxSwift] Operator - Filter</title>
      <link>https://laladuny.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;안녕하세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오늘은 RxSwift의 Operator중 Filter에 대해 적어두려고 해요 :)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1MI8j/btrTPzvcT4H/VVncIvfd0gfi2brzseDUFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1MI8j/btrTPzvcT4H/VVncIvfd0gfi2brzseDUFK/img.png&quot; data-alt=&quot;출처 - https://rxmarbles.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1MI8j/btrTPzvcT4H/VVncIvfd0gfi2brzseDUFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1MI8j%2FbtrTPzvcT4H%2FVVncIvfd0gfi2brzseDUFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;574&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 - https://rxmarbles.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;테스트 조건을 만족하는 항목들만 배출&lt;/span&gt;해요. 조건식이 10보다 큰 수 였으니 6개의 정수중에 30, 22, 60만 배출되었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예시)&lt;/p&gt;
&lt;pre id=&quot;code_1671178929435&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Observable.from(numbers)
    .filter { $0.isMultiple(of: 2) }
    .subscribe { print($0) }
.disposed(by: disposeBag)

/* 실행결과

next(2)
next(4)
next(6)
next(8)
next(10)
completed

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/RxSwift</category>
      <category>filter</category>
      <category>operator</category>
      <category>RxSwift</category>
      <category>RxSwift Filter</category>
      <category>RxSwift Operator</category>
      <category>SWIFT</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/27</guid>
      <comments>https://laladuny.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 16 Dec 2022 17:24:13 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] guard와 if-let 비교해보기</title>
      <link>https://laladuny.tistory.com/25</link>
      <description>&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;오늘은 guard문과 if문의 차이를 비교정리해보겠습니다 :0&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;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. guard문&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;guard 문은 뭔가를 검사하여 그 다음에 오는 코드들을 실행할지 말지 결정, guard 문에 주어진 조건문이 거짓일 때, 여기에 달려있는 코드 블럭이 실행된다.&lt;/li&gt;
&lt;li&gt;조건식에 이 함수가 수행하는데 필요한 조건을 그대로 나타낸다는 점에서 if문에서 부정적인 조건식으로 표현하는 것보다 가독성이 높은 장점.&lt;/li&gt;
&lt;li&gt;if 문과 다르게, else를 항상 달아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1670401020409&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func guardFunc (be: String?) {
	guard be != nil else { return }
	print(be)
}

guardFunc(be: &quot;20&quot;)
guardFunc(be: nil)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵셔널 바인딩은 if-let 문법을 사용한 옵셔널 바인딩과 다르게 옵셔널 바인딩된 상수를 조건문 범위 바깥에서도 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;guard문의 경우 상수의 사용범위는 함수 나머지 영역이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1670401456624&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func guardInFunc (string: String?) {

    guard let letString = string else { return }

    print(letString!, &quot;second param&quot;, separator: &quot;&quot;)
}
guardInFunc(&quot;test&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복합 옵셔널 바인딩&lt;/li&gt;
&lt;li&gt;복합해서 사용가능, 모든 파라미터가 nil이 아닐경우 조건을 충족하고 출력문을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1670401494665&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func guardWithCompoundOptionalBinding (firstName: String?, lastName: String?, dateOfBirth: String?) {

    guard let fname = firstName, let lname = lastName, let dob = dateOfBirth else { return }

    print(&quot;\(fname) \(lname) \(dob)&quot;)

}

guardWithCompoundOptionalBinding(&quot;sun&quot;, lastName : &quot;kim&quot;, dateOfBirth: &quot;&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. if-let&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1670401593691&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var optionalName: String? = &quot;Daeyeon&quot;
var greeting = &quot;Hello!&quot;

if let name = optionalName 
{
  greeting = &quot;Hello, \(name)&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;non-optional 변수인 name&amp;rdquo;에 &amp;ldquo;Optional 변수인 optionalName&amp;rdquo; 안에 들어 있는 값을 할당할 수 있다면 {} 안의 내용을 실행하라&amp;rdquo;라는 의미. (name은 내가 만든상수, if 문 안에서만 사용가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;if 문 - 조건이 하나이거나 조건 전제가 단순할 때, 바인딩한 상수를 다른 값에 처리하는 상황&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;guard 문 - 복잡한 문장일때, 바인딩한 상수를 동일한 스코프에서 사용할 때&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;</description>
      <category>iOS/Swift</category>
      <category>guard let</category>
      <category>guard문 if문 차이</category>
      <category>if let</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>Swift guard문</category>
      <category>Swift 문법</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/25</guid>
      <comments>https://laladuny.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 7 Dec 2022 17:31:38 +0900</pubDate>
    </item>
    <item>
      <title>[RxSwift] Observable &amp;amp; Observer</title>
      <link>https://laladuny.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Observable와 Observer에 대해 정리해두려고 해요.&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;size18&quot;&gt;&lt;b&gt;Observable ------&lt;span style=&quot;color: #006dd7;&quot;&gt; Event&lt;/span&gt; ----&amp;gt; Observer(Subscriber)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Observable &amp;lt;--&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Subscribe&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;--- Observer(Subscriber)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 옵저버블에서 발생한 새로운 이벤트는 Next를 통해 방출(Emission)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Observable&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1670227792384&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// #1 원형. create로 이벤트 만들기
Observable&amp;lt;Int&amp;gt;.create { (observer) -&amp;gt; Disposable in
    observer.on(.next(0))
    observer.onNext(1)
    
    observer.onCompleted()
    return Disposables.create()
}

// #2 이미 구현되어있는 이벤트 사용

Observable.from([0,1])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Observer&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1670227860146&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let o1 = Observable&amp;lt;Int&amp;gt;.create { (observer) -&amp;gt; Disposable in
   observer.on(.next(0))
   observer.onNext(1)
   
   observer.onCompleted()
   
   return Disposables.create()
}

// #1
o1.subscribe {
    print(&quot;== Start ==&quot;)
    print($0)
    if let elem = $0.element {
        print(elem)
    }
    print(&quot;== End ==&quot;)
}
print(&quot;-----------------------&quot;)

// #2
o1.subscribe (onNext: { elem in
    print(elem)
})


Observable.from([1, 2, 3])

/* 실행 결과

== Start ==
next(0)
0
== End ==
== Start ==
next(1)
1
== End ==
== Start ==
completed
== End ==
-----------------------
0
1

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/RxSwift</category>
      <category>Observable</category>
      <category>RxSwift</category>
      <category>RxSwift Observable</category>
      <category>RxSwift Observer</category>
      <category>옵저버</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/24</guid>
      <comments>https://laladuny.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 5 Dec 2022 17:17:13 +0900</pubDate>
    </item>
    <item>
      <title>[RxSwift] Why RxSwift?</title>
      <link>https://laladuny.tistory.com/23</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;안녕하세요 . 오늘은 RxSwift의 장단점에 대해 적어두려고 해요!&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ReactiveX는 관찰 가능한 시퀀스를 사용하여 &lt;span style=&quot;color: #ee2323;&quot;&gt;비동기&lt;/span&gt;식 및 이벤트 기반 프로그램을 구성하기 위한 &lt;span style=&quot;color: #ee2323;&quot;&gt;라이브러리&lt;/span&gt; 입니다.&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 반응형 패러다임이 제공하는 명확함&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기를 동기화 된 것인양 작성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 일관성이 없는 비동기 코드를 해결&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 곳에서는 DispatchQueue, 어떤 곳에서는 OperationQueue&amp;hellip;&lt;/li&gt;
&lt;li&gt;하나의 비동기 코드로 개발이 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 확장 불가능한 아키텍처 패턴을 해결&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일관성 없는 비동기 코드를 작성하게 되어 서로 다르게 구현한 로직을 조합하거나 확장하기에 어려운 부분을 해결&lt;/li&gt;
&lt;li&gt;Rx로 일관된 코드를 작성하면서 아키텍처의 확장이 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.콜백지옥에서 탈출&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Thread 처리가 용이&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MainThread 에서 처리하기, 백그라운드 에서 처리하다 다시 메인 다시 백그라운드 .. 쉽게 처리할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 러닝커브&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습하기가 어려움. 하지만 점점 좋은 자료들이 많이 생기고 있는 추세&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Debugging이 어렵다.&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stack이 깊게 있어서 트래킹하기 어려운 느낌&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 클로저의 캡쳐리스트(closure capture list)를 조심&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클로저 사용이 많음. 캡쳐리스트를 사용하여 메모리 누수를 일으키는 강한 순환 참조(strong reference cycle)를 피할 수 있게 신경써야됨.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS/RxSwift</category>
      <category>IOS</category>
      <category>rx</category>
      <category>RxSwift</category>
      <category>RxSwift 단점</category>
      <category>RxSwift 장점</category>
      <category>SWIFT</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/23</guid>
      <comments>https://laladuny.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 5 Dec 2022 16:04:16 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 속성 감시자 (Property Observer)</title>
      <link>https://laladuny.tistory.com/22</link>
      <description>&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;속성 감시자는 저장 속성이 변하는 시점을 관찰합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 속성이 변하는 순간, 구현되어 있는 메서드가 호출됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) willSet은 값이 저장되기 직전에 호출됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) didSet은 새 값이 저장된 직후에 호출됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669366731582&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Apple {
    
    // 일반 저장 속성
    var message: String = &quot;가격이 변경 되었습니다.&quot;
    // 속성 감시자
    var price: Int {
        willSet(price) {  // 바뀔 값이 파라미터로 전달
            print(&quot;사과의 가격이 \(self.price)원에서 \(price)원으로 변경될 예정입니다.&quot;)
            print(&quot;가격 변경전&quot;)
        }
        didSet(price) {   // 바뀌기 전의 과거값이 파라미터로 전달
            print(&quot;사과의 가격이 \(price)원에서 \(self.price)원으로 이미 변경되었습니다.&quot;)
            print(&quot;가격 변경후&quot;)
        }
    }
    
    init(price: Int) {
        self.price = price
    }
    
}
let apple = Apple(price: 3000)
apple.price
apple.price = 5000

/* 실행결과 */
//사과의 가격이 3000원에서 5000원으로 변경될 예정입니다.
//가격 변경전
//사과의 가격이 3000원에서 5000원으로 이미 변경되었습니다.
//가격 변경후&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;클래스, 구조체, (열거형) 동일하게 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;어떤 속성이 변하는 시점을 알아차리도록 시점에 제약을 만드는 코드를 짜기는 어려움&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;- &lt;/span&gt;&lt;/span&gt;그래서 실제 서비스에 활용할때 좋은 수단&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;- &lt;/span&gt;&lt;/span&gt;일반적으로는 willSet 또는 didSet 중에서 한가지만 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 실&lt;/span&gt;제 프로젝트에서는 didSet을 많이 사용&lt;/b&gt;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <category>IOS</category>
      <category>property observer</category>
      <category>SWIFT</category>
      <category>Swift Property Observer</category>
      <category>Swift 속성감시자</category>
      <category>속성감시자</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/22</guid>
      <comments>https://laladuny.tistory.com/22#entry22comment</comments>
      <pubDate>Fri, 25 Nov 2022 18:08:08 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 서브스크립트 (Subscripts)</title>
      <link>https://laladuny.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;h4 data-ke-size=&quot;size20&quot;&gt;서브스크립트란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-&amp;gt; 대괄호를 이용해서 접근가능하도록 만든 문법&lt;/b&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;Ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 배열 &lt;/span&gt;array&lt;span&gt;[&lt;/span&gt;index&lt;span&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span&gt;&lt;/span&gt;딕셔너리 &lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;dictionary&lt;span&gt;[key&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669355629715&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [&quot;banana&quot;, &quot;apple&quot;, &quot;tomato&quot;]

array[0] // banana
array[1] // apple
// 내부적으로 대괄호를 사용하면 어떤 값을 리턴하도록 구현이 되어 있어서 가능한 일&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 구현해보기&lt;/p&gt;
&lt;pre id=&quot;code_1669356128179&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class SportsData {
	var datas = [&quot;soccer&quot;, &quot;baseball&quot;, &quot;basketball&quot;, &quot;tennis&quot;]
    
    subscript(index: Int) -&amp;gt; String {
    	get {
        	return datas[index]
        }
        set {
        	datas[index] = newValue
        }
    }
}

var sportsData = SportsData()
sportsData[0] // soccer
sportsData[0] = &quot;swim&quot;
sportsData[0] // swim&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;함수의 구현이 특별한 키워드인 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;subscript&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;로 명명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;메서드이기 때문에 인스턴스에 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;메모리 공간이 할당되어 있지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;메서드 접근 시&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;인스턴스 이름으로 접근 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;해야함 -&amp;gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;instance[&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;파라미터&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&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;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;블록만 선언하면 &lt;/span&gt;&lt;span&gt;읽기전용&lt;/span&gt;&lt;span&gt;(read-only) &lt;/span&gt;&lt;span&gt;계산 속성&lt;/span&gt;&lt;span&gt;이 됨 &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;필수 구현&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;블록은 선택적 구현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;블록에서 기본 파라미터 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;newValue&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;가 제공됨&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>Swift Subscripts</category>
      <category>Swift 서브스크립트</category>
      <category>서브스크립트</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/21</guid>
      <comments>https://laladuny.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 25 Nov 2022 15:08:24 +0900</pubDate>
    </item>
    <item>
      <title>객체지향 프로그래밍 (OOP)</title>
      <link>https://laladuny.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 객체지향에 특징에 대해 간단히 적어두려합니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Object Oriented Programming이란..&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 추상화 (Abstraction) - 모델링&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;추상화란 실생활에서의 구체적인 것을 &lt;/span&gt;&lt;span&gt;관찰자가 관심있는 부분만 가지고 재조합 &lt;/span&gt;&lt;span&gt;하는 것&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;실체들에서 관심있고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;공통적인 특성&lt;/span&gt;&lt;span&gt;을 뽑아내서 &lt;/span&gt;&lt;span&gt;하나의 분류&lt;/span&gt;&lt;span&gt;(class)&lt;/span&gt;&lt;span&gt;로 만든 것 &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;모델링&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;객체지향의 관점에서&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;실체들의 공통적 특성을 뽑아내서 클래스로 정의하는 것 자체가 추상화의 개념&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;예&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;도서관리 프로그램 &lt;/span&gt;&lt;span&gt;➡ &lt;/span&gt;&lt;span&gt;제목 &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;저자 &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;출판사 &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;총페이지 &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;가격 등 &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 캡슐화 (Encapsulation) - 모델링 / 정보 은닉 / 데이터 캡슐화&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;연관이 있는 &lt;/span&gt;&lt;span&gt;속성&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;상태&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;과 &lt;/span&gt;&lt;span&gt;메서드&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;기능&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;&amp;ldquo;&lt;/span&gt;&lt;span&gt;하나의 클래스&lt;/span&gt;&lt;span&gt;&amp;rdquo;&lt;/span&gt;&lt;span&gt;로 묶어서 활용한다&lt;/span&gt;&lt;span&gt;는 개념&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;묶을 때&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;객체는 자신이 맡은 역할을 수행하기 위한 &lt;/span&gt;&lt;span&gt;하나의 목적을 가진 실체&lt;/span&gt;&lt;span&gt;라는 관점에서 접근해야함 &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;추상화와 밀접하게 연결되는 개념&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #929292;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;추상화는 디자인 레벨 관점에서 바라보는 개념인데 반해&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;캡슐화는 실제 코드로 구현하는 레벨에서의 개념&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt; &lt;br /&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;은닉화&lt;/span&gt;&lt;span&gt;(Information Hiding): &lt;/span&gt;&lt;span&gt;캡슐화를 하면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;접근제어자&lt;/span&gt;&lt;span&gt;(private, public &lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;를 사용해 객체 외부에서 내부 &lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터의 접근 통제가 가능해짐 &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 상속성 (Inheritance) - 재사용 / 확장&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;부모클래스의 &lt;/span&gt;&lt;span&gt;속성과 메서드를 자식클래스에서 그대로 물려받는 개념&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;상속을 통해&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;코드가 재활용되기 때문에 생산성이 높아짐&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;클래스의 재사용과 확장을 위해 상속이 사용됨&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;객체지향의 개념에서&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;클래스가 다른 타입과 구별&lt;/span&gt;&lt;span&gt;되는 결정적인 차별점 &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 다형성 (Polymorphism) - 사용편의 / 동적바인딩&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;하나의 객체가 &lt;/span&gt;&lt;span&gt;여러가지 타입의 형태로 저장 될 수 있고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;다양한 메서드의 형태로 동작 가능함을 의미&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;하나의 객체는 부모의 타입으로도 저장이 가능하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;프로토콜 타입으로도 저장이 가능&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;하나의 객체는 &lt;/span&gt;&lt;span&gt;다양한 방식으로 동작 가능&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;동적 바인딩&lt;/span&gt;&lt;span&gt;/Method Dispatch)&lt;/span&gt;&lt;span&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;또한 오버라이딩&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;(overriding)&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;과 오버로딩&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;(overloading)&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;을 통해 하나의 메서드나 클래스를 다양한 방법으로 &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;동작시키는 것을 포함하는 개념 &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;이 부분에 대해서는 컴퓨터공학자들 사이에서 이견이 있음&lt;/span&gt;&lt;span style=&quot;color: #929292;&quot;&gt;) &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; SwiftMaster(주교재)_김도윤&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;추상화 &lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Abstraction)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;추상화 &lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Abstraction) &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <category>OOP</category>
      <category>OOP의 4대 특징</category>
      <category>객체지향</category>
      <category>객체지향 프로그래밍</category>
      <category>추상화</category>
      <category>캡슐화</category>
      <category>프로그래밍</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/20</guid>
      <comments>https://laladuny.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 22 Nov 2022 14:41:40 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 클래스와 구조체 (Class, Struct)</title>
      <link>https://laladuny.tistory.com/19</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;구조체(struct)&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;클래스(class)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;Value Type (값 형식)&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;Reference Type (참조 형식)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;값의 저장: Stack / 복사 전달 (메모리에서 자동제거)&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;Heap / 주소 전달 (ARC로 관리)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;인스턴스 상수(let)로 선언시, 저장속성이 전부 상수로 선언&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;인스턴스 상수(let)로 선언하면  &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;가르키는 인스턴스 고정 (저장 속성은 각 let/var 선언에 따름)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소멸자 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;소멸자 없음&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;소멸자 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속여부 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;상속 불가능&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;상속 가능&lt;/span&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;값 형식(struct)&lt;/span&gt; vs &lt;span style=&quot;color: #ee2323;&quot;&gt;참조 형식(class)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 -&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;Value Type &lt;/span&gt;&lt;span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Reference Type&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 상의 저장 위치 -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Stack&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Heap&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 관리 방식 -&amp;gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;값이 들어있는 스택의 스코프 종료시, 메모리에서 자동 제거&lt;/span&gt;&amp;nbsp;vs&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Reference Counting을 통해 메모리를 관리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 예시 -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;스위프트 기본 타입(Int, String ...), 구조체&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;클래스, 클로저&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>Swift Class</category>
      <category>Swift Struct</category>
      <category>구조체</category>
      <category>클래스</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/19</guid>
      <comments>https://laladuny.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 22 Nov 2022 11:42:56 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Optional</title>
      <link>https://laladuny.tistory.com/18</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Optional?&lt;/b&gt;&lt;/h4&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;nil -&amp;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 = 값이 없으면 에러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String? = 에러가 나지 않도록 임시적인 타입을 담아둠&lt;/p&gt;
&lt;pre id=&quot;code_1668650586892&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str: String = &quot;Swift&quot;
let optionalStr: String? = nil

let a: Int? = nil
let b: Int? = a //nil
b // nil&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;옵셔널 타입 추출 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 강제 추출 - nil이 아닌 값이 있다는 것을 확신하고 강제로 값을 추출 (값이 없는 경우 크래시 위험)&lt;/p&gt;
&lt;pre id=&quot;code_1668650910177&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let value: String? = &quot;val&quot;
value! // val

let value2: String?
value2! = 에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. nil 확인후, 강제 추출&lt;/p&gt;
&lt;pre id=&quot;code_1668651018620&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if value != nil {
	print(value!)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 옵셔널 바인딩 (if let, guard let) - 바인딩이 되는 경우에만 특정 작업을 실행&lt;/p&gt;
&lt;pre id=&quot;code_1668651327926&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// if let
if let number = optionalNumber {
	print(number)
}

// guard let
func callName(name: String?) {
    guard let n = name else { return }
    print(n)
}

callName(name: nil) // 아무 반응 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Nil - Coalescing - 옵셔널 표현식 뒤에 기본 값을 제시해서, 옵셔널의 가능성을 없앤다&lt;/p&gt;
&lt;pre id=&quot;code_1668651600672&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;optionalValue ?? &quot;기본값&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <category>IOS</category>
      <category>Nil - Coalescing</category>
      <category>SWIFT</category>
      <category>swift optional</category>
      <category>옵셔널</category>
      <category>옵셔널 타입추출</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/18</guid>
      <comments>https://laladuny.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 17 Nov 2022 11:21:03 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Array</title>
      <link>https://laladuny.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Array(배열)에 대해 정리해봤어요.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ordered Collection (저장된 순서대로 저장)&lt;/li&gt;
&lt;li&gt;Single Type (배열안의 자료형은 동일해야함)&lt;/li&gt;
&lt;li&gt;중복 가능, 같은 값이라 해도 개별요소로 처리&lt;/li&gt;
&lt;li&gt;0-based Index // 배열의 요소를 찾을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Array ?&lt;/h4&gt;
&lt;pre id=&quot;code_1668579532137&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[elem, elem, ....]
let nums =[1, 2, 3]

Array&amp;lt;T&amp;gt; // 정식 문법
[T]      // 단축 문법

let strArray: Array&amp;lt;String&amp;gt;
let strArray2: [String]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Array - Creating an Array&lt;/h4&gt;
&lt;pre id=&quot;code_1668579601934&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let nums = [1, 2, 3]

let emptyArray: [Int] = [] // 빈 리터럴을 사용할땐 형식 지정해줘야함

let emptyArray2 = Array&amp;lt;Int&amp;gt;()
let emptyArray3 = [Int]()

let zeroArray = [Int](repeating: 0, count: 10) // 0이 10개가 채워진 배열이 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Accessing Elements&lt;/h4&gt;
&lt;pre id=&quot;code_1668579621110&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let fruits = [&quot;Apple&quot;, &quot;Banana&quot;, &quot;Melon&quot;]
let emptyArray: [Int] = []

fruits[0] // Apple
fruits[3] // error

fruits[0...1] // Apple, Banana

fruits[fruits.startIndex] // Apple

fruits[fruits.endIndex] // Error, endIndex 전 데이터에 접근해야함

fruits[fruits.index(before: fruits.endIndex)] // Melon

fruits.first // Apple
fruits.last // Melon

emptyArray.first // nil
emptyArray.last // nil&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Adding Elements&lt;/h4&gt;
&lt;pre id=&quot;code_1668579716224&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var alphabet = [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;]
alphabet.append(&quot;E&quot;) // E 추가

alphabet.append(contentsOf: [&quot;F&quot;, &quot;G&quot;])

//insert는 오버헤드가 발생할 수 있기에 가급적 사용하지 않는다.
alphabet.insert(&quot;D&quot;, at: 3) // 3번쨰 칸에 추가

alphabet.insert(contestOf: [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;], at:0) // 0번째칸에

alphabet[0...2] = [&quot;x&quot;, &quot;y&quot;, &quot;z&quot;] // 0,1,2 번째 배열데이터를 바꿈

alphabet.replaceSubrange(0...2, with: [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]) // 위아같은 배열 바꿔치기

alphabet[0...2] = [&quot;z&quot;] // 0~2 번째 배열을 &quot;z&quot;로 바꿈 (3개 -&amp;gt; 1개가 됨)

alphabet[0..&amp;lt;1] = [] // 빈배열을 보내면 원하는 범위가 삭제됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Removing Elements&lt;/h4&gt;
&lt;pre id=&quot;code_1668579774618&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numArray = [1, 2, 3, 4, 5]
numArray.remove(at: 2) // 3 제거

//빈배열에 removeFirst 쓰면 에러
numArray.removeFirst() // 첫번째 요소 제거후 출력

numArray.removeFirst(2) // 앞 2개 제거, 출력은 x

numArray.removeAll() // 배열에 있는 모든 요소 제거, 빈 배열이 됨

numArray= [1, 2, 3, 4, 5, 6, 7]
numArray.popLast() // 7 제거

numArray.removeSubrange(0...2) // 0,1,2번째 배열 제거

numArray[0...2] = [] // 위와 같이 해당 범위 제거&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Finding Elements&lt;/h4&gt;
&lt;pre id=&quot;code_1668579883178&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let nums = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]

nums.contain(1) // true
nums.contain(8) // false

nums.contains { (n) -&amp;gt; Bool in
	return n % 2 == 0
} // true

num.first { (n) -&amp;gt; Bool in
	return n % 2 == 0
} // 2

num.firstIndex { (n) -&amp;gt; Bool in
	return n % 2 == 0
} // 1

nums.firstIndex(of: 1) // 2번째 인덱스 1

nums.lastIndex(of: 1) // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Sorting&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1668579915563&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// sort -&amp;gt; 배열을 직접 정렬
// sorted -&amp;gt; 정렬된 새로운 배열을 리턴

nums.sorted() // 오름차순으로 정렬 

nums.sorted { (a, b) -&amp;gt; bool in
	return a &amp;gt; b
} // 내림차순으로 정렬

nums.sorted().reversed()
[Int](nums.sorted().reversed())

var mutableNums = nums

mutableNums.sort() // 오름차 
mutableNums.reverse() //내림차

mutableNums.swapAt(0, 1) // 첫번째와 두번째 요소의 위치가 바뀜

mutableNums.shuffle() // 순서 무작위로 바꿈&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <category>array</category>
      <category>Array Sort</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>Swift 배열</category>
      <category>배열</category>
      <author>듀니듀니</author>
      <guid isPermaLink="true">https://laladuny.tistory.com/17</guid>
      <comments>https://laladuny.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 16 Nov 2022 15:29:52 +0900</pubDate>
    </item>
  </channel>
</rss>