<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>(블로그 이사중... ^^*~~~)비둘기의 iOS ⏱️⏩</title>
    <link>https://hortenssiaa.tistory.com/</link>
    <description>Arise!! ⛰️ ✨ </description>
    <language>ko</language>
    <pubDate>Fri, 17 Jul 2026 11:09:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>쿰!쿰쿰쿰!</managingEditor>
    <image>
      <title>(블로그 이사중... ^^*~~~)비둘기의 iOS ⏱️⏩</title>
      <url>https://tistory1.daumcdn.net/tistory/5839337/attach/2b44be52d95d4974a4e34dda35ca487e</url>
      <link>https://hortenssiaa.tistory.com</link>
    </image>
    <item>
      <title>[TIL w3d4] Swift 심화문법 CLI 프로젝트 (Feat.  &amp;zwj; 트러블 슈팅)</title>
      <link>https://hortenssiaa.tistory.com/88</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[0] About Swift&amp;nbsp;Grammar&amp;nbsp;Master&amp;nbsp;CLI&lt;/b&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;학습 기간: 3주차 (3월 17일 ~ 3월 20일)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742520627402&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;SpartaCamp-iOS/[Week2] SwiftGrammerMaster_CLI at main &amp;middot; amazingDove367/SpartaCamp-iOS&quot; data-og-description=&quot;deep dive ❤️&amp;zwj;  into iOS. Contribute to amazingDove367/SpartaCamp-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&quot; data-og-url=&quot;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xAwRE/hyYvj0azUS/pEbBYbocbZiOCgp7cCHymk/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ceifO4/hyYvn9maKE/PfPLnkkNkpfbMKBcKqIK6K/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239&quot;&gt;&lt;a href=&quot;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/amazingDove367/SpartaCamp-iOS/tree/main/%5BWeek2%5D%20SwiftGrammerMaster_CLI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xAwRE/hyYvj0azUS/pEbBYbocbZiOCgp7cCHymk/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ceifO4/hyYvn9maKE/PfPLnkkNkpfbMKBcKqIK6K/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239');&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;SpartaCamp-iOS/[Week2] SwiftGrammerMaster_CLI at main &amp;middot; amazingDove367/SpartaCamp-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;deep dive ❤️&amp;zwj;  into iOS. Contribute to amazingDove367/SpartaCamp-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[1] 프로젝트 개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 주제&lt;/b&gt; : Swift&amp;nbsp;심화&amp;nbsp;문법&amp;nbsp;학습&amp;nbsp;및&amp;nbsp;CLI&amp;nbsp;기반&amp;nbsp;실습&amp;nbsp;프로젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 학습 개념&lt;/b&gt; : 객체지향&amp;nbsp;프로그래밍(OOP),&amp;nbsp;프로토콜,&amp;nbsp;에러&amp;nbsp;처리,&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[2] 회고 &amp;nbsp; (회고가 벌써부터 나와있는 이유는.. 회고하는걸 좋아해서.. ✍️)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일배움캠프가 시작하기 전에는 iOS 강의를 들어오면서, 앱을 개발하는데 필요한 필수적인 Swift 문법만 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 뭔가 더 심화 문법 (옵셔널 체이닝, 고차함수) 이 이미 효율적이게 내장되어있는데도 제대로 사용하지 못하고 비효율적인 방법으로 직접 구현하고있었다. &lt;b&gt;&lt;u&gt;기본기에 구멍이 슝슝 뚤려서, 뭔가 어려운것을 계속 쌓아도 계속 빠져나가는 느낌이었다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금껏 계속 Swift 문법을 온라인 강의로 들어왔지만, 학습하느라 바빠서, 간단한 예제만 작성하고 지나갔는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내배캠 3주차 과제로 심화문법 실습 덕분에, 지금껏 학습하고 아 나중에 써봐야지- 했던 &lt;u&gt;&lt;b&gt;제네릭, 고차함수, 클로저 자유자재 사용, 예외처리 (do-try-catch, throws-try?-try!) 능력을 실제적으로 기르고 훈련할 수 있는!!&lt;/b&gt;&lt;/u&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[3] 학습 내용 &lt;/b&gt;&lt;/h2&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;&amp;nbsp; &amp;nbsp; ➖ 클로저 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ 반환값으로 전달되는 클로저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;&lt;b&gt;✔️ 고차함수 자유자제 사용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ map, compactMap, filter, allSatify&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ 고차함수 체이닝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : .enumurate() 함수를 통한, 고차함수 체이닝 속 $0.offset / $0.element 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; ➖&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; offset : index 와 같은 맥락,&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; ➖&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; element&lt;/span&gt;&lt;/span&gt;&amp;nbsp;: index 와 같은 맥락,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ 필요한 고차함수 직접 만들기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✔️ 제네릭 사용 컨벤션 재숙지,&amp;nbsp; &amp;nbsp; is&amp;nbsp; /&amp;nbsp; type(of:) 의 차이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ 제네릭의 선언과 사용 컨벤션 재숙지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ 제네릭 제한 (Numeric 프로토콜 준수)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ➖ is / type(of: ) 의 차이와 사용 재숙지&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[4]  &amp;zwj;  트러블 슈팅&lt;/b&gt;&lt;b&gt; ️&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 제네릭의 잘못된 사용  &amp;zwj;♀️ &amp;rarr; 사용 컨벤션&amp;nbsp; 재숙지후 리팩토링  &amp;zwj;♀️&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. type(of: ), is&lt;span&gt;&amp;nbsp; 잘못된 사용  &amp;zwj;♀️ &amp;rarr; 개념 재숙지후 리팩토링  &amp;zwj;♀️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 제네릭의 잘못된 사용  &amp;zwj;♀️ &amp;rarr; 사용 컨벤션&amp;nbsp; 재숙지후 리팩토링  &amp;zwj;♀️&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;제네릭 함수의 선언과 사용방법에 대해, 다시 숙지하고 코드를 리팩토링했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[원인]&lt;/b&gt;&lt;/h4&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[컨셉 1] 제네릭 함수를 사용할때, 컴파일러가 타입을 추론할 수 있게 명시적인 매개변수를 입력해야한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러나, 제네릭타입의 매개변수(배열)을 readLine() 으로 문자열로 받았다.&lt;/li&gt;
&lt;li&gt;예) &quot;[1,2,3,4]&quot; , &quot;[&quot;가&quot;, &quot;나&quot;, &quot;다&quot;, &quot;라&quot;, &quot;마&quot;]&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[컨셉 2] 제네릭을 사용한 함수를 작성할 때, 함수의 매개변수 타입을 제네릭으로 사용하는 것이 일반적이다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러나, 코드에서는 함수의 매개변수 타입이 제네릭이&amp;nbsp; 아닌, String 으로 받았다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매개변수가 제네릭 타입의 배열일때, Any 로 명시하지 않으면 타입을 혼합하여 매개변수로 줄 수 없다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;rarr; 컴파일 오류&lt;/li&gt;
&lt;li&gt;문제에서는 테스트 입력을 '넣고' 확인라고 했으니, Any 타입까지 가지 않아도 된다.&amp;nbsp;&lt;br /&gt;그러나, 내가 학습을 위한 시도로 문자열로 받았을 때, 타입이 혼합된 배열 일 경우의 처리에는 사용 불가능하지는 않은 듯하다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;그러나, Any 타입으로 주는 것 자체가, 제네릭 사용특성상 아주 잘 맞는다고 생각하지 못했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;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;b&gt;컴파일러가 타입을 추론할 수 있게 프롬프트 입력을 받지 않고, 명시적인 매개변수를 넣어줬다.&lt;/b&gt;&amp;nbsp;
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;let&lt;/span&gt; intArray = [&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;3&lt;/span&gt;, &lt;span&gt;4&lt;/span&gt;, &lt;span&gt;5&lt;/span&gt;]&lt;br /&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;&quot;&lt;/span&gt;\(intArray)&lt;span&gt; -&amp;gt; &lt;/span&gt;\(&lt;span&gt;d&lt;/span&gt;(intArray))&lt;span&gt;&quot;&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;함수의 매개변수를 String 타입 &amp;rarr; 제네릭 타입으로 변경했다.&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c(_&amp;nbsp;arrayString:&amp;nbsp;String)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변경 후&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c&amp;lt;T: Numeric&amp;gt;(_ array: [T])&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&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;pre id=&quot;code_1742526009540&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//   잘못된 사용 부분 : 제네릭 타입 함수 매개변수 
// (_ arrayString: String)
func c&amp;lt;T&amp;gt;(_ arrayString: String) throws -&amp;gt; [T] where T : LosslessStringConvertible {
    
    // String to [T]
    let array = arrayString.filter { $0.isNumber || $0.isLetter || $0 == &quot;,&quot; }
        .split(separator: &quot;,&quot;)
        .compactMap { T(String($0)) }
    
    let evenArray = array.enumerated()
        .filter { $0.offset.isMultiple(of: 2) }
        .compactMap { T(String($0.element)) }
    
    return evenArray
}

func runC() {
   
    // 제네릭 T 를 사용하여, 사용자 입력을 받을시 타입추론이 불가하여, 직접 입력값을 넣어주는 것으로 c() 를 사용하였습니다.
    do {
        let intInput = &quot;[1, 2, 3, 4, 5]&quot;
        let intArray: [Int] = try c(intInput)
        print(&quot;\(intInput) -&amp;gt; \(intArray)&quot;)
        
        let strInput = &quot;[\&quot;가\&quot;, \&quot;나\&quot;, \&quot;다\&quot;, \&quot;라\&quot;, \&quot;마\&quot;]&quot;
        let strArray: [String] = try c(strInput)
        print(&quot;\(strInput) -&amp;gt; \(strArray)&quot;)
        
    } catch {
        print(&quot;Error: runC()&quot;)
    }
}&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;pre id=&quot;code_1742526042462&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//   리팩토링 부분 : 제네릭 타입 함수 매개변수
// (_ array: [T])
func c&amp;lt;T&amp;gt;(_ array: [T]) -&amp;gt; [T] {
    
    let evenArray = array.enumerated()
        .filter { $0.offset.isMultiple(of: 2) }
        .map { $0.element }
    
    return evenArray
}

func runC() {
    let intArray = [1, 2, 3, 4, 5]
    print(&quot;\(intArray) -&amp;gt; \(c(intArray))&quot;)
    
    let strArray = [&quot;가&quot;, &quot;나&quot;, &quot;다&quot;, &quot;라&quot;, &quot;마&quot;]
    print(&quot;\(strArray) -&amp;gt; \(c(strArray))&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;
&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;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&lt;/b&gt;&amp;nbsp;&lt;b&gt;type(of: ), is&lt;/b&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp; 잘못된 사용  &amp;zwj;♀️ &amp;rarr; 개념 재숙지후 리팩토링  &amp;zwj;♀️&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;1번의 기본 제네릭 파라미터를 가진 함수에서, 제네릭 파라미터가 'Numeric 프로토콜'을 준수하는 타입의 배열로 변경하는 문제에서,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;요구사항 외,명시적 매개변수 배열을 입력받고, 해당 배열의 제네릭 타입이 Numeric 프로토콜을 준수하는지 체크하고 싶었다.&lt;br /&gt;type(of: )와 is의 정확한 사용목적을 알지 못해, 에러로 약간의 트러블이 있었다. 사용목적과 방법에 대해, 재숙지 후 리팩토링을 진행했다.&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[원인]&lt;/b&gt;&lt;/h4&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;type(of: ) 와 is 의 쓰임과 사용방법을 정확히 알지 못함&lt;/b&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개념을 바꿔서 사용하고 있었다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;type(of: )&lt;/b&gt; 는, of: 다음에 들어가는 값에 대한 '타입 확인' 이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;is&lt;/b&gt; 는, 프로토콜을 준수하는지 확인하는 키워드다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;처음 작성할때, &lt;u&gt;&lt;b&gt;if type(of: 배열자체) is any Numeric.Type&lt;/b&gt; &lt;/u&gt;이렇게 작성했다. 작성 방법이 잘못 됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[해결]&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;is 키워드만 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.allSatisfy( 입력받은배열 is (any Numeric) )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;.allSatisfy() 고차함수를 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력받은 배열에 대해, 배열 내부의 모든 값의 타입 (제네릭 T)이 Numeric 프로토콜을 준수하는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ ]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;근데 생각해보니 제네릭 타입 T 가 Any 로 사용하지 않는 이상, Int / Double / Float 과 같이 한 가지 타입으로만 가능하니&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;배열 내의 모든 값을 체크하지 않고, 하나만 Numeric 프로토콜을 준수하는지 확인해도 괜찮을 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[리팩토링 전 코드 : 잘못된 &lt;/b&gt;&lt;b&gt;type(of: ) 사용&lt;/b&gt;&lt;b&gt;]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742528330242&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func d&amp;lt;T: Numeric&amp;gt;(_ array: [T]) -&amp;gt; [T] {
    let evenArray = array.enumerated()
        .filter { $0.offset.isMultiple(of: 2) }
        .map { $0.element }

    if evenArray.allSatisfy({ $0 is (any Numeric) }) {
        print(&quot;\(evenArray) conforms to Numeric&quot;)
    } else {
        print(&quot;\(evenArray) not conforms to Numeric&quot;)
    }

    //   잘못된 사용 부분
    if type(of: evenArray) is any Numeric.Type {
        print(&quot;\($0) conforms to Numeric&quot;)
    } else {
        print(&quot;\($0) not conforms to Numeric&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[리팩토링 후 코드 :&amp;nbsp; &lt;b&gt;is 사용으로 변경&lt;/b&gt;]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742526791648&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func d&amp;lt;T: Numeric&amp;gt;(_ array: [T]) -&amp;gt; [T] {
    let evenArray = array.enumerated()
        .filter { $0.offset.isMultiple(of: 2) }
        .map { $0.element }

    if evenArray.allSatisfy({ $0 is (any Numeric) }) {
        print(&quot;\(evenArray) conforms to Numeric&quot;)
    } else {
        print(&quot;\(evenArray) not conforms to Numeric&quot;)
    }

    //   리팩토링 한 부분
    evenArray.forEach {
        if $0 is (any Numeric) { if type(of: evenArray) is any Numeric.Type
            print(&quot;\($0) conforms to Numeric&quot;)
        } else {
            print(&quot;\($0) not conforms to Numeric&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 </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/88</guid>
      <comments>https://hortenssiaa.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 20 Mar 2025 23:27:13 +0900</pubDate>
    </item>
    <item>
      <title>(프로그래머스 #43165) 타겟 넘버 [DFS]</title>
      <link>https://hortenssiaa.tistory.com/85</link>
      <description>&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/uDiwv/btsMMnV5v53/JHDHdgfzNu2XdkAB5MtLaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDiwv/btsMMnV5v53/JHDHdgfzNu2XdkAB5MtLaK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -64.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDiwv/btsMMnV5v53/JHDHdgfzNu2XdkAB5MtLaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDiwv%2FbtsMMnV5v53%2FJHDHdgfzNu2XdkAB5MtLaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpSev9/btsMMmCSAxf/oQnPAqKL5l5XoTJOsYWnkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpSev9/btsMMmCSAxf/oQnPAqKL5l5XoTJOsYWnkk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -65.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpSev9/btsMMmCSAxf/oQnPAqKL5l5XoTJOsYWnkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpSev9%2FbtsMMmCSAxf%2FoQnPAqKL5l5XoTJOsYWnkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcI8V/btsMN9oFiSI/F32KQxjEOX28hjc6ihozAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcI8V/btsMN9oFiSI/F32KQxjEOX28hjc6ihozAK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -66.jpg&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BcI8V/btsMN9oFiSI/F32KQxjEOX28hjc6ihozAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcI8V%2FbtsMN9oFiSI%2FF32KQxjEOX28hjc6ihozAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;프로그래머스 Lv2&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이 기술하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 배열을 문자열로 입력받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 문자열을 Int 배열로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. '순서있는 배열'이니, 방향노드로 adj 인접 배열을 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 배열의 0번째 index 를 시작점으로 잡는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. visit 배열, Int 배열의 length에 맞게 생성&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;최단거리때는 visited이면 방문하면 안됐지만, 여기서는 배열 마지막까지 방문해야하니, 배열의 내용물이 아니라 index로 접근해야할 것 같다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 시작점을 (아마 index로 [0]으로?) stack 배열에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. stack 을 pop 한다. 그러면 시작점이 나온다. 이렇게 시작점으로 시작이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. pop한 값의 인접 노드를 stack 배열에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;stack 을 pop 한다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. pop한 값의 인접 노드를 stack 배열 에 넣는다&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;이렇게 8~10 을 DFS 로 전부 탐색할때까지 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1742256103553&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;start()

func start() {
    var start = 0 , end = 0
    var pointer = start
    var numbers: [Int] = []
    
    let input = readLine()
    if let input = input {
        numbers = input.filter { $0.isNumber || $0 == &quot;,&quot; }
            .split(separator: &quot;,&quot;)
            .compactMap { Int($0) }
        
    }
    
    var adj: [[Int]] = Array(repeating: [], count: numbers.count)
    
    for (idx, value) in numbers.enumerated() {
        adj[idx].append(value)
    }
}&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;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;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43165&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/43165&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742256796388&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;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43165&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IsoL1/hyYrOttU5A/ukfuq9UhqAQXuYbSGc1Uo1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/2fNGe/hyYupsuwlV/P9D5mZxYWUIx1yGKIXiw2k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43165&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43165&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IsoL1/hyYrOttU5A/ukfuq9UhqAQXuYbSGc1Uo1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/2fNGe/hyYupsuwlV/P9D5mZxYWUIx1yGKIXiw2k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>breakthrough-algorithms /TIL⛰️</category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/85</guid>
      <comments>https://hortenssiaa.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 18 Mar 2025 09:00:26 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w3d1] Swift 복습 (Optional, 중첩타입, 접근제어자, Protocol)</title>
      <link>https://hortenssiaa.tistory.com/84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;Optional, Optional unwrapping, 중첩타입, 접근제어자, 프로토콜을&lt;/b&gt; iOS 개발에 실제 활용할 수 있도록 학습!&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;문법의 특징을 잘 파악해보자!&lt;/p&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;Optional &lt;u&gt;Type&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;선언 가능 타입&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;기본 타입 (Int, String, Float &amp;hellip; )&lt;/li&gt;
&lt;li&gt;Collection Type (Array, Dictionary, Set &amp;hellip; )&lt;/li&gt;
&lt;li&gt;Custom Type (Class, Struct, Enum)&lt;/li&gt;
&lt;li&gt;클로저&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Optional Chaining: 체이닝으로 optional 벗기기!&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1742209171915&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;person?.animal?.name&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;⭐️ 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Optional Binding:&amp;nbsp; if-let /&amp;nbsp; guard-let&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[1] if-let&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1742209474226&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var intValue: Int? = 10

if let intValue = intValue { 
    print(intValue) // 10
}

print(intValue) // Optional(10)&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[2] guard-let&lt;/b&gt;&lt;br /&gt;&lt;b&gt;: [2.1] 조건문 [2.2] 옵셔널 unwrapping&lt;/b&gt;&lt;/h2&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.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;guard 는 조건이 true일 경우 코드를 계속 진행하고, false일 경우 else 코드 블록에서 탈출&lt;/li&gt;
&lt;li&gt;else 블록은 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742209725110&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;guard 조건 else { 
	// 조건이 false 일 때 실행되는 코드블록  
	// return, break, continue, throw등 코드블록을 종료하는 구문이 필요
	return 
}&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;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.2] 옵셔널 binding으로 unwrapping&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;옵셔널 바인딩 결과가 nil일 경우, else 문을 실행&lt;/li&gt;
&lt;li&gt;클로저 / 메소드 내부에서 주로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;옵셔널 묵시적 언래핑 (Implicitly Unwrapped Optional)&lt;/span&gt;&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;옵셔널 타입을 선언할 때 !를 사용&lt;/li&gt;
&lt;li&gt;값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용 가능&lt;/li&gt;
&lt;li&gt;  값이 있다고 확신이 들 때 사용!!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값이 nil 일 때 접근하면 런타임 오류가 발생&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;옵셔널 바인딩 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210044914&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var name: String! = &quot;Dive&quot; 

print(name) // Optional(&quot;Dive&quot;)
print(name.count) // 5 

if let name = name {
    print(name) // Dive
}&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;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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;중첩된 타입&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;: 구조적 복잡한 Class / Struct 를 더 조직적 관리!&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;사용 : class, struct, enum 등&lt;/li&gt;
&lt;li&gt;코드 가독성을 높이고, 타입 간의 연관성을 명확해짐!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210202327&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Car {
    struct Company {
        var name: String
        var phoneNumber: String
        
        func contact() {
            print(&quot;\(name) 회사의 A/S 센터 번호는 \(phoneNumber)입니다.&quot;)
        }
    }

    enum Model {
        case sedan
        case hatchback
        case suv
    }

    var model: Model
    var company: Company
    var name: String
    var color: String
}

let myCar = Car(model: .sedan, company: Car.Company(name: &quot;sparta&quot;, phoneNumber: &quot;010-0000-0000&quot;), name: &quot;붕붕이&quot;, color: &quot;Black&quot;)

myCar.company.contact() // sparta 회사의 A/S 센터 번호는 010-0000-0000입니다.
print(myCar.model) // sedan&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;접근제어자&lt;/b&gt;&lt;br /&gt;&lt;b&gt;: open, public, internal, fileprivate, private&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;open&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 외부 모듈에서 접근할 수 있는 접근제어자&lt;/li&gt;
&lt;li&gt;가장 개방적인 접근 수준&lt;/li&gt;
&lt;li&gt;유일하게 class 에서만 사용 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속이 가능하고 재정의 가능하기 때문에!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;public&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 외부 모듈에서 접근할 수 있는 접근제어자&lt;/li&gt;
&lt;li&gt;가장 개방적인 접근 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;internal&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본값 접근제어자로 설정하지 않았다면 internal&lt;/li&gt;
&lt;li&gt;동일한 모듈에서 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;fileprivate&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 파일 내부에서만 접근할 수 있는 접근 제어자&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;private&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 제한적인 접근 제어자&lt;/li&gt;
&lt;li&gt;해당 요소를 선언한 스코프(예를 들어 class, struct, enum의 코드블록)에서만 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;struct&lt;/u&gt;&lt;/b&gt; 에서 &lt;b&gt;&lt;u&gt;private 프로퍼티&lt;/u&gt;&lt;/b&gt;가 있다면 &lt;u&gt;memberwise init을 사용할 수 없어서&lt;/u&gt; &lt;b&gt;&lt;u&gt;직접 init을 작성&lt;/u&gt;&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210358326&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {
    var name: String
    public var age: Int
    private var havingMoney: Int //   private property
    
    
    init(name: String, age: Int, havingMoney: Int) { //   init 직접 작성
        self.name = name
        self.age = age
        self.havingMoney = havingMoney
    }
    
    private func printMoney() {
        print(&quot;나는 \(havingMoney) 원 있다!&quot;)
    }

    func test() {
        printMoney()
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로토콜&lt;br /&gt;: { get } / { set get } 에 따른 구현&lt;/b&gt;&lt;b&gt;&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;&lt;b&gt;  protocol에 선언된 property를 구현할 경우, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;[저장 프로퍼티] / [연산 프로퍼티] 로 구현하든 상관 X&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;연산&amp;nbsp;프로퍼티는,&amp;nbsp;원래&amp;nbsp;var&amp;nbsp;선언&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[1] { get } 프로퍼티&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[저장 프로퍼티]&lt;/b&gt; : let/var 상관 X ('get'으로 수정안되니)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[연산&amp;nbsp;프로퍼티]&lt;/b&gt;&amp;nbsp;:&amp;nbsp;protocol&amp;nbsp;이&amp;nbsp;get&amp;nbsp;임에도,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;get&amp;nbsp;{}&amp;nbsp;구현&lt;/b&gt;&lt;/u&gt;&amp;nbsp;(O)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;get&amp;nbsp;{}&amp;nbsp;set&amp;nbsp;{}&amp;nbsp;구현&lt;/u&gt;&lt;/b&gt;&amp;nbsp;(O)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210719686&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol P1 {
    var property: String { get }
}&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;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;[2] { get set } 프로퍼티&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[저장 프로퍼티]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 반드시&amp;nbsp;var&amp;nbsp;선언&amp;nbsp;(set&amp;nbsp;으로&amp;nbsp;수정&amp;nbsp;가능하니)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[연산&amp;nbsp;프로퍼티]&lt;/b&gt;&amp;nbsp;:&amp;nbsp;protocol&amp;nbsp;이&amp;nbsp;get&amp;nbsp;임에도,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;get&amp;nbsp;{}&amp;nbsp;만&amp;nbsp;구현&amp;nbsp;(X)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;get&amp;nbsp;{}&amp;nbsp;set&amp;nbsp;{}&amp;nbsp;모두&amp;nbsp;필수!!!&amp;nbsp;구현&amp;nbsp;(O)&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210735078&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol P2 {
    var property: String { get set }
}&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클래스 전용 프로토콜&lt;br /&gt;: 정의 시, AnyObject를 채택!&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;struct, enum에서 사용될 수 X&lt;/li&gt;
&lt;li&gt;프로토콜 정의 시, AnyObject를 채택하면 클래스 전용 프로토콜로 만들어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742210982162&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol OnlyClassProtocol: AnyObject {

}&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/84</guid>
      <comments>https://hortenssiaa.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 17 Mar 2025 20:29:49 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w2d5] Swift 복습 (Enum, Property  )</title>
      <link>https://hortenssiaa.tistory.com/83</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Enum, Property를 iOS 개발에 실제 활용할 수 있도록 학습!&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문법의 특징을 잘 파악해보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Enum  &lt;br /&gt;: 다양한 상황(주제/종류) 그룹화 &amp;amp; 효율적 처리&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;특정 주제나 종류에 따라 묶을 수 있는 값들을 그룹화하여, 데이터 타입으로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;타입 안정성을 보장,&lt;/span&gt; &lt;u&gt;의도를 명확하게 파악 가능!&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;저장 프로퍼티 사용 X&lt;/li&gt;
&lt;/ul&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] Enum Associated Value&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742192427586&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum DeliverySataus {
    case ordered
    case shipping(trakingNumber: String) // associated value
    case deliverCompleted(date: String) // associated value
}

let status = DeliverySataus.shipping(trakingNumber: &quot;8001-12234&quot;)

switch status {
case .ordered:
    print(&quot;주문완료!&quot;)
case .shipping(let trackingNumber):
    print(&quot;배송중! 송장번호: \(trackingNumber)&quot;)
case .deliverCompleted(let date):
    print(&quot;배송완료! 배송일: \(date)&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;
&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] Enum Raw Value&lt;br /&gt;&lt;/b&gt;&lt;b&gt;[2.1] String&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742192477638&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Season: String {
    case spring = &quot;봄 입니다&quot;
    case summer // raw value: &quot;summer&quot;
    case autum
    case winter
}

let season: Season = .spring
print(season) // spring
print(season.rawValue) // 봄 입니다

let season2 = Season.summer
print(season2.rawValue) // summer

var newSeason = Season(rawValue: &quot;autum&quot;) // rawValue에는, Season enum 에 실제 존재하는 case의 rawValue을 넣어야 한다.
print(newSeason) // tional(Page_Contents.Season.autum)

newSeason = Season(rawValue: &quot;autuuum&quot;) // enum Season에 autuuum 이라는 case X
print(newSeason) // nil&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;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] Enum Raw Value&lt;br /&gt;&lt;/b&gt;&lt;b&gt;[2.2]&lt;span&gt;&amp;nbsp;숫자형&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742192557148&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// rawValue 를 하나만 정해줄 경우, 아래로 순서에 따라 +1만큼 rawValue값이 올라간다.
enum Month: Int {
    case january = 1 // 1을 주지 않았다면, 자동 0으로 할당됨
    case februray
    case march
    case april = 10
    case may // 11
    case june // 12
    case july // 13
    case august // 14
    case september // 15
    case october // ...
    case november
    case december
}

print(Month.februray.rawValue) // 2
print(Month.june.rawValue) // 12

print(Month(rawValue: 15)) // Optional(Page_Contents.Month.september)&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;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;[3] Enum Function&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742192643819&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum SeasonFunction: String {
    case spring
    case summer
    case autum
    case winter
    
    func weather() -&amp;gt; String {
        switch self {
        case .spring:
            return &quot;따뜻해요&quot;
        case .summer:
            return &quot;더워요&quot;
        case .autum:
            return &quot;쌀쌀해요&quot;
        case .winter:
            return &quot;추워요&quot;
        }
    }
}

//   사용  
let seasonFunc = SeasonFunction.spring
print(seasonFunc.weather()) // 따뜻해요&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Class deinit&lt;/b&gt;&lt;br /&gt;&lt;b&gt;: 자동 호출됨 (O) , 직접 호출 불가! (X)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deinit : 종료된 instance가 메모리에서 해제될때 자동호출됨! 직접 호출 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Property  &lt;/b&gt;&lt;br /&gt;&lt;b&gt;: 저장 (+ lazy) / 연산 / 타입 Property , Property Observer&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[1] 저장 프로퍼티&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enum에서 저장프로퍼티 사용 불가&lt;/p&gt;
&lt;pre id=&quot;code_1742194466815&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
}&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;&lt;b&gt;[2] 지연 저장 프로퍼티 (lazy)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;➡️ 사용 전까지 메모리 효율 높일 수 있음!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;lazy var 프로퍼티이름&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;var 만&lt;/u&gt;&lt;/b&gt; 사용 가능!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저장 프로퍼티 사용할 수 있는 class, struct 등 에서 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742194519405&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
    var name: String = &quot;A&quot;
    var age: Int = 15
    lazy var height = 175.7
}

let person = Person() //   Person의 height값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태
print(person.height) // height값을 사용하기 때문에   이제 메모리에 할당하여 사용함.&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;&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;값 저장 X, 계산된 값을 제공&lt;/li&gt;
&lt;li&gt;사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;class, struct, enum&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;var 만&lt;/u&gt;&lt;/b&gt; 사용 가능!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;get, set 키워드로 getter, setter 구현&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getter 필수!&lt;/li&gt;
&lt;li&gt;setter 생략 가능! ➡️ get 키워드 생략 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[3.1] Getter와 Setter 모두 있는 연산 프로퍼티&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742195588821&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// [1] Getter와 Setter 모두 있는 연산 프로퍼티
struct Person {
    var name: String
    var age: Int
    
    var isAdult: Boole {
        get {
            return age &amp;gt;= 20
        }
        
        set {
            if newValue == true {
                age = 20
            } else {
                age = 19
            }
        }
    }
}

var person = Person(name: &quot;Dove&quot;, age: 100)

print(person.isAdult) // true

person.isAdult = false
print(person.age) // 19&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[3.2] Setter&amp;nbsp;가&amp;nbsp;구현하지&amp;nbsp;않은&amp;nbsp;연산프로퍼티&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742195694123&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// [2] Setter 가 구현하지 않은 연산프로퍼티
struct Person {
    var name: String
    var age: Int = 0 
    
    var isAdult: Bool {
        get {
            return age &amp;gt;= 20
        }
    }
}

var person = Person(name: &quot;Dove&quot;, age: 100)
print(person.isAdult) // true

person.isAdult = false // compile error !! (no setter)&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[3.3] Setter가 구현되지 않았을 때는 get 키워드를 생략&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742195782881&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// [3] Setter가 구현되지 않았을 때는 get 키워드를 생략
struct Person {
    var name: String
    var age: Int = 0 
    
    var isAdult: Bool {
        return age &amp;gt;= 20
    }
}&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;&lt;b&gt;[4] 타입 프로퍼티&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;모든 instance 가 공유하는 프로퍼티
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;➡️ instance 만들지 않고, 타입 자체에서 접근!&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;static 키워드 사용 : class, struct, enum&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[4.1] struct 에서 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742195987362&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {
    static var structName = &quot;Person&quot; 
                                  
    func logStructName() {
        print(Person.structName) //   내부에서는 Self로 사용 가능
    }
}

var person = Person()

person.logStructName() // Person

Person.structName = &quot;Changed!&quot; 

person.logStructName() // Changed
print(Person.structName) // Changed&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;b&gt;&lt;br /&gt;[4.2] enum 에서 사용  &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742196090007&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Season: String {
    case spring
    case summer
    case autumn
    case winter
    
    static var enumName = &quot;Season&quot;
}

Season.enumName // &quot;Season&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;
&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;[5] 프로퍼티 Observer&amp;nbsp;&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;저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가, willSet / didSet 코드블록을 실행&lt;/li&gt;
&lt;li&gt;사용 : 저장 프로퍼티가 사용 가능한, struct / class&lt;/li&gt;
&lt;li&gt;willSet
&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;willSet { }&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경될 값은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;u&gt;newValue&lt;/u&gt;&lt;/b&gt;&lt;/span&gt; 키워드를 통해 접근 가능!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;willSet(&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;) { }&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;매개변수 이름으로 접근&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;didSet
&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;didSet { }&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경되기 전의 값은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;u&gt;oldValue&lt;/u&gt;&lt;/b&gt;&lt;/span&gt; 키워드를 통해 접근 가능!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;didSet(&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;) { }
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매개변수 이름으로 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[5.1] 기본 사용 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742196884107&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {
    var name: String {
        willSet {
            print(&quot;Person의 name이 변경될 예정입니다. 변경될 값은 \&quot;\(newValue)\&quot; 입니다.&quot;)
        }
        didSet {
            print(&quot;Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.&quot;)
            print(&quot;\(oldValue) -&amp;gt; \(name)&quot;)
        }
    }
    var age: Int
}

var person = Person(name: &quot;Dove&quot;, age: 10)

person.name = &quot;Dove2&quot; 
// Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.
// Dove -&amp;gt; Dove2&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;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;[5.2] newValue, oldValue 다른 이름으로 변경해서 사용  &lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742196949804&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {
    var name: String {
        willSet(changeNewName) { //  
            print(&quot;Person의 name이 변경될 예정입니다. 변경될 값은 \&quot;\(changeNewName)\&quot; 입니다.&quot;)
        }
        
        didSet(beforeName) { //  
            print(&quot;Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.&quot;)
            print(&quot;\(name) -&amp;gt; \(beforeName)&quot;)
        }
    }
    var age: Int
}&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;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 </category>
      <category>newValue</category>
      <category>OldValue</category>
      <category>Property</category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/83</guid>
      <comments>https://hortenssiaa.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 17 Mar 2025 16:36:47 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w2d4] Swift CLI 숫자 야구게임 (Feat.  ️트러블 슈팅)</title>
      <link>https://hortenssiaa.tistory.com/82</link>
      <description>&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;nbsp;[0] About CLI 숫자 야구게임&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발 기간: &lt;b&gt;3주차 (3월 10일 ~ 3월 13일)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741922760922&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;SpartaCamp-iOS/BaseBallGame_CLI/README.md at main &amp;middot; hortenssiaa/SpartaCamp-iOS&quot; data-og-description=&quot;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&quot; data-og-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGD8mW/hyYrXQLHtB/8eZcsJ3WzGDkbaNtl9Lzt1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ctNprX/hyYqUmJMJt/hAnYqeYsmRIR0WJxBJnv50/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/BaseBallGame_CLI/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGD8mW/hyYrXQLHtB/8eZcsJ3WzGDkbaNtl9Lzt1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ctNprX/hyYqUmJMJt/hAnYqeYsmRIR0WJxBJnv50/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239');&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;SpartaCamp-iOS/BaseBallGame_CLI/README.md at main &amp;middot; hortenssiaa/SpartaCamp-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[1] 디자인 패턴:고민 &amp;amp; 선택하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴? 프로젝트 성격에 따라 개발하는 설계원칙!&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[MVC 패턴을 사용해볼까?]&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC : 컨트롤러가 일 젤 많이 하는 구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;M :&amp;nbsp;데이터 상태 유지,조작 / Class, Struct&amp;nbsp;&lt;/li&gt;
&lt;li&gt;V:&amp;nbsp;데이터 표시 /&amp;nbsp;사용자의 입력 -&amp;gt; C /&amp;nbsp;사용자 입력에 대한 출력&amp;nbsp; &amp;nbsp;&amp;lt;- C&lt;/li&gt;
&lt;li&gt;C :&amp;nbsp;모델 &amp;amp; 뷰 간의 상호작용 / 뷰에게 받은 데이터, 모델에 전달 / 업데이트&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;➡️ 프로젝트 규모가 커질수록, 서로 독립성이 없고, 테스트 어렵고 재사용성이 떨어진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC 의 단점을 보완하기 위한, 모델만은 독립성을 가진 CocoaMVC가 나왔다고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[고민]&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처리 되어야 하는 로직은 제한 되어있고, 요청에 따라 해당 로직을 사용하는 작은 규모의 프로젝트이기 때문에,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MVC 패턴을&amp;nbsp;사용해도 될 것 같다고 생각했다. 그러나, 더 독립적인 코드 작성과, 컨트롤러의 부담을 조금이라도 줄여주기 위해,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MVVM 을 선택하게 되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVVM
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Model: 데이터 update / 주기&lt;/li&gt;
&lt;li&gt;View/ViewController : 입출력만 / 데이터 표시&lt;/li&gt;
&lt;li&gt;ViewModel : 실제 구현 / 데이터 변환 처리&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[2] MVVM + 커맨드 패턴&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ (행위패턴) 커맨드 패턴 ]&lt;br /&gt;&lt;/b&gt;Invoker&amp;nbsp; ➡️&amp;nbsp; &amp;lt;protocol&amp;gt; Commanding&amp;nbsp; ⬅️&amp;nbsp; Command&amp;nbsp; ➡️&amp;nbsp; Receiver&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 3가지의 명령 (1, 2, 3) 이 있지만, 후에 추가될 기능을 위한 유지보수성을 고려하여 커맨드 패턴을 사용하게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;커맨드 패턴의 핵심은 undo 기능인데, 그렇게 맞게 기능을 구현하지 않는다면, 커맨드 패턴은 사용할 필요성은 없어보인다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나, 기능이 늘어날수록, 기능만 모듈로 추가 / 수정 / 삭제 할 수 있다는 장점 때문에 사용하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;뷰컨트롤러와 뷰 모델 사이의 의존성을 느슨하게 하기 위해.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[3] 트러블 슈팅&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Thread 1: EXC_BAD_ACCESS&lt;/b&gt; 오류 발생 (미해결)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;error detail; A bad access to memory terminated the process.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의심되는 원인: (&lt;b&gt;GameInvoker&lt;/b&gt;에서 &lt;b&gt;GameViewModel&lt;/b&gt;을 선언할 때 순환 참조가 발생하는 것 같음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 접근이 잘못되었을 때 발생하는 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상태: 미해결되어, Command Pattern 을 제외한 상태임&lt;/li&gt;
&lt;li&gt;시도한 해결 방법:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;GameViewModel&lt;/b&gt;의 &lt;b&gt;GameInvoker&lt;/b&gt;를 &lt;b&gt;unowned var&lt;/b&gt;로 선언&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;추가 조사 필요:&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-start=&quot;532&quot; data-end=&quot;682&quot;&gt;&lt;b&gt;GameInvoker와 GameViewModel 간의 참조 구조 개선&lt;/b&gt;: unowned 참조로 변경한 상태로, GameViewModel에서 GameInvoker를 참조하는 방식도 개선해볼 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강한 순환 참조 문제 해결 : &lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;GameViewModel과 GameInvoker가 서로를 강한 참조하여 순환 참조가 발생할 것을 대비하여,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;gameVM을 &lt;u&gt;weak 으로도 선언해볼 것&lt;br /&gt;&lt;br /&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cannot use instance member 'gameInvoker' within property initializer&lt;/b&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;nbsp;&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;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의심되는 원인:&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로퍼티 초기화 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;self&lt;/b&gt;가 아직 생성되지 않았기 때문&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;상태: 미해결되어, Command Pattern 을 제외한 상태임&lt;/span&gt;&lt;/li&gt;
&lt;li&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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 style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;lazy var&lt;/b&gt;를 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;self&lt;/b&gt;가 완전히 초기화된 후 접근하도록 수정&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;b&gt;랜덤 값이 제대로 생성되지 않는 경우&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RandomAnswerGenerator&lt;/b&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;nbsp;&lt;/span&gt;&lt;b&gt;makeAnswer&lt;/b&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;nbsp;&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;/li&gt;
&lt;li&gt;추후에 입력받는 자릿수의 숫자가 달라질 것을 대비하여, 자리수에 따라 10의 제곱근으로 랜덤 값을 생성했다.&lt;/li&gt;
&lt;li&gt;swift 에서 사용할 수 없는&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;^ 연산자&lt;/b&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;/li&gt;
&lt;li&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;nbsp;&lt;/span&gt;&lt;b&gt;^ 연산자&lt;/b&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;nbsp;&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;b&gt;&amp;nbsp;pow()&lt;/b&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;nbsp;&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;/li&gt;
&lt;li&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;nbsp;&lt;/span&gt;&lt;b&gt;print()&lt;/b&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Command Pattern의 Invoker, Receiver 주체 설정&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 공부하고 적용해보는 패턴이라서, Command Pattern의 Invoker, Receiver 주체를 설정하는 것 부터가 어려웠다.&lt;/li&gt;
&lt;li&gt;결국에는, 사용하고자 했던 목적이 3가지 메뉴 (기능) 에 기능이 추가될 것을 생각하여 사용한 패턴이기 때문에, 메뉴에 보여지는 기능들이 Receiver, 그것을 명령하는 주체는 Game 자체 (사용자에 의한) 로 설정하게 되었다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Invoker, Receiver 주체와 사용방법 등 명확하지 않아 튜터님의 피드백을 기다리고 있다...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;869&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;869&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[4] 받은 코드리뷰: 적용 완료&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;s&gt;클래스 / 파일 분리&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Set 으로 중복 제거&lt;/span&gt;&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;enumerated() 사용!&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;random -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;.shuffled() 으로 사용해보기&lt;/span&gt;&lt;/s&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[5] 참조&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/jeonyeohun/Design-Patterns-In-Swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/jeonyeohun/Design-Patterns-In-Swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923342981&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jeonyeohun/Design-Patterns-In-Swift: 스위프트로 이해하는 디자인 패턴  &amp;zwj; &quot; data-og-description=&quot;스위프트로 이해하는 디자인 패턴  &amp;zwj; . Contribute to jeonyeohun/Design-Patterns-In-Swift development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jeonyeohun/Design-Patterns-In-Swift&quot; data-og-url=&quot;https://github.com/jeonyeohun/Design-Patterns-In-Swift&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7mKi9/hyYqOz4ccr/0hLtAaggH1MtwFiv1J0akk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/IPpdq/hyYrOsKzTb/lmYaSdpuLKOGkUWt5H6UAK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jeonyeohun/Design-Patterns-In-Swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jeonyeohun/Design-Patterns-In-Swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7mKi9/hyYqOz4ccr/0hLtAaggH1MtwFiv1J0akk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/IPpdq/hyYrOsKzTb/lmYaSdpuLKOGkUWt5H6UAK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jeonyeohun/Design-Patterns-In-Swift: 스위프트로 이해하는 디자인 패턴  &amp;zwj; &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스위프트로 이해하는 디자인 패턴  &amp;zwj; . Contribute to jeonyeohun/Design-Patterns-In-Swift development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jeonyeohun.tistory.com/389&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jeonyeohun.tistory.com/389&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923328646&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;[스위프트 디자인패턴] 커맨드 패턴(Command Pattern)&quot; data-og-description=&quot;커맨드 패턴(Command Pattern) The command pattern encapsulate a request as an object, thereby letting you parameterize other objects different requests queue or log request and support undoable operation 커맨드 패턴은 어떤 객체로 보내는 &quot; data-og-host=&quot;jeonyeohun.tistory.com&quot; data-og-source-url=&quot;https://jeonyeohun.tistory.com/389&quot; data-og-url=&quot;https://jeonyeohun.tistory.com/389&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oNv0C/hyYqXKyYUI/nVNKHBbTGveiRoQWLZUmk1/img.png?width=800&amp;amp;height=771&amp;amp;face=0_0_800_771,https://scrap.kakaocdn.net/dn/hx5NO/hyYr3wElL6/LnOT6oAxKLxzaqsQ8ot90K/img.png?width=800&amp;amp;height=771&amp;amp;face=0_0_800_771,https://scrap.kakaocdn.net/dn/b0udHv/hyYqUtxkNF/6505yFd9oiRZBb4QZXkKy1/img.png?width=840&amp;amp;height=810&amp;amp;face=0_0_840_810&quot;&gt;&lt;a href=&quot;https://jeonyeohun.tistory.com/389&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jeonyeohun.tistory.com/389&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oNv0C/hyYqXKyYUI/nVNKHBbTGveiRoQWLZUmk1/img.png?width=800&amp;amp;height=771&amp;amp;face=0_0_800_771,https://scrap.kakaocdn.net/dn/hx5NO/hyYr3wElL6/LnOT6oAxKLxzaqsQ8ot90K/img.png?width=800&amp;amp;height=771&amp;amp;face=0_0_800_771,https://scrap.kakaocdn.net/dn/b0udHv/hyYqUtxkNF/6505yFd9oiRZBb4QZXkKy1/img.png?width=840&amp;amp;height=810&amp;amp;face=0_0_840_810');&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;[스위프트 디자인패턴] 커맨드 패턴(Command Pattern)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;커맨드 패턴(Command Pattern) The command pattern encapsulate a request as an object, thereby letting you parameterize other objects different requests queue or log request and support undoable operation 커맨드 패턴은 어떤 객체로 보내는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jeonyeohun.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;&lt;a href=&quot;https://icksw.tistory.com/251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://icksw.tistory.com/251&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923354482&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 디자인 패턴] Command Pattern (커맨드) - 디자인 패턴 공부 15&quot; data-og-description=&quot;안녕하세요 Pingu입니다.  지난 글에서는 행동 패턴 중 하나인 Chain of Responsibility Pattern(책임 연쇄 패턴)에 대해 알아봤었는데요, 이번 글에서는 또 다른 행동 패턴인 Command Pattern(커맨드)에 대해 &quot; data-og-host=&quot;icksw.tistory.com&quot; data-og-source-url=&quot;https://icksw.tistory.com/251&quot; data-og-url=&quot;https://icksw.tistory.com/251&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/foVQo/hyYqLwtMpb/8xT6tJNWy0ITbluAGV8xmK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qChmS/hyYr0zWu1a/ovuSufkuszYHzArOe0TlWk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rUUEg/hyYr0zWuX6/ZZ6WcARBWdkkXZ0LILc6uK/img.jpg?width=1259&amp;amp;height=740&amp;amp;face=0_0_1259_740&quot;&gt;&lt;a href=&quot;https://icksw.tistory.com/251&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://icksw.tistory.com/251&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/foVQo/hyYqLwtMpb/8xT6tJNWy0ITbluAGV8xmK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qChmS/hyYr0zWu1a/ovuSufkuszYHzArOe0TlWk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rUUEg/hyYr0zWuX6/ZZ6WcARBWdkkXZ0LILc6uK/img.jpg?width=1259&amp;amp;height=740&amp;amp;face=0_0_1259_740');&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 디자인 패턴] Command Pattern (커맨드) - 디자인 패턴 공부 15&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 Pingu입니다.  지난 글에서는 행동 패턴 중 하나인 Chain of Responsibility Pattern(책임 연쇄 패턴)에 대해 알아봤었는데요, 이번 글에서는 또 다른 행동 패턴인 Command Pattern(커맨드)에 대해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;icksw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/82</guid>
      <comments>https://hortenssiaa.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 14 Mar 2025 11:31:20 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w2d3] 알고리즘 Swift로 다시시작 /  Swift 복습 (Struct)</title>
      <link>https://hortenssiaa.tistory.com/81</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;알고리즘 풀면서, Swift 내장함수 사용 마스터 되기!!&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 시작한 알고리즘 코어반!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 시작부터 DFS 문제였다 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 파이썬으로 문제를 풀었다가, 그 방식으로 Swift 로 풀려고 하니..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;이건.. 문제를 풀다가 오히려 다시 Swift 공부를 다시 하고있다.&amp;nbsp;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift로 문제를 풀어보니, Collection 타입 내장 함수 사용에 훨씬 도움이 된다.&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;이번 기회에 기본 Collection 타입 내장 함수를 많이 활용하여, &lt;u&gt;&lt;b&gt;데이터를 자유자재로 사용할 수 있게 훈련&lt;/b&gt; 해보아야 겠다.&lt;/u&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Swift Basic Collection Type : 데이터 자유자재 사용하기!&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Array &amp;amp; String Short Cut !&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/bIRaPA/btsMIwMfSFx/RXtPridxpl0bHC75JqmnXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIRaPA/btsMIwMfSFx/RXtPridxpl0bHC75JqmnXk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2244&quot; data-origin-height=&quot;2904&quot; data-filename=&quot;Coding-152.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIRaPA/btsMIwMfSFx/RXtPridxpl0bHC75JqmnXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIRaPA%2FbtsMIwMfSFx%2FRXtPridxpl0bHC75JqmnXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2244&quot; height=&quot;2904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf8G7l/btsMJjZMuYv/jVcGxteQErF47AFUBlM18K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf8G7l/btsMJjZMuYv/jVcGxteQErF47AFUBlM18K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2244&quot; data-origin-height=&quot;2904&quot; data-filename=&quot;Coding-153.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf8G7l/btsMJjZMuYv/jVcGxteQErF47AFUBlM18K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf8G7l%2FbtsMJjZMuYv%2FjVcGxteQErF47AFUBlM18K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2244&quot; height=&quot;2904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzZBl/btsMKu61Z2E/h9pQTpixHkhGH0qa1RtFU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzZBl/btsMKu61Z2E/h9pQTpixHkhGH0qa1RtFU0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2244&quot; data-origin-height=&quot;2904&quot; data-filename=&quot;Coding-154.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzZBl/btsMKu61Z2E/h9pQTpixHkhGH0qa1RtFU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzZBl%2FbtsMKu61Z2E%2Fh9pQTpixHkhGH0qa1RtFU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2244&quot; height=&quot;2904&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Swift Basic Collection Type : 데이터 자유자재 사용하기!&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;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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;드디어 &lt;/b&gt;.gitignore 을 추가!&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 Repository에 .gitignore 을 추가했다.&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;a href=&quot;https://velog.io/@mangozoo20/.DSStore-%ED%8C%8C%EC%9D%BC-gitignore-Repository%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@mangozoo20/.DSStore-%ED%8C%8C%EC%9D%BC-gitignore-Repository%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741761235657&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;.DS_Store 파일 gitignore (Repository에 포함시키지 않기)&quot; data-og-description=&quot;Mac에서 개발할 때 workspace 에 .DS_Store 파일이 생성되곤 합니다. 과연 이 쓰레기는 뭐길래 자꾸 내 Git Repository에 커밋되는걸까요? 내 저장소에서 없애버리고 커밋시키지 않는 방법을 알아봅시다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@mangozoo20/.DSStore-%ED%8C%8C%EC%9D%BC-gitignore-Repository%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@mangozoo20/.DSStore-파일-gitignore-Repository에-포함시키지-않기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mt36z/hyYqWYD5Tv/M3PvMNUNIqZKjUSwNqMGNK/img.gif?width=294&amp;amp;height=328&amp;amp;face=0_0_294_328,https://scrap.kakaocdn.net/dn/bbFDmi/hyYr2c30zT/0nvuCTq3S09xN21A3SwO3K/img.gif?width=294&amp;amp;height=328&amp;amp;face=0_0_294_328,https://scrap.kakaocdn.net/dn/cXhzBG/hyYr4hC5A8/tMKMtO6e9aNkx02QTlui61/img.png?width=780&amp;amp;height=540&amp;amp;face=0_0_780_540&quot;&gt;&lt;a href=&quot;https://velog.io/@mangozoo20/.DSStore-%ED%8C%8C%EC%9D%BC-gitignore-Repository%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@mangozoo20/.DSStore-%ED%8C%8C%EC%9D%BC-gitignore-Repository%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mt36z/hyYqWYD5Tv/M3PvMNUNIqZKjUSwNqMGNK/img.gif?width=294&amp;amp;height=328&amp;amp;face=0_0_294_328,https://scrap.kakaocdn.net/dn/bbFDmi/hyYr2c30zT/0nvuCTq3S09xN21A3SwO3K/img.gif?width=294&amp;amp;height=328&amp;amp;face=0_0_294_328,https://scrap.kakaocdn.net/dn/cXhzBG/hyYr4hC5A8/tMKMtO6e9aNkx02QTlui61/img.png?width=780&amp;amp;height=540&amp;amp;face=0_0_780_540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;.DS_Store 파일 gitignore (Repository에 포함시키지 않기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mac에서 개발할 때 workspace 에 .DS_Store 파일이 생성되곤 합니다. 과연 이 쓰레기는 뭐길래 자꾸 내 Git Repository에 커밋되는걸까요? 내 저장소에서 없애버리고 커밋시키지 않는 방법을 알아봅시다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Swif 복습 2: Struct&amp;nbsp;&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;&lt;b&gt;mutating 키워드&lt;/b&gt; :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Struct, Enum 은 value type&lt;/li&gt;
&lt;li&gt;따라서, instance 메소드에서 프로퍼티를 직접 변경 X&amp;nbsp; ➡️ 수정시 mutating 키워드 사용해야 함수 안 프로퍼티 값 변경 가능&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;let 인스턴스&lt;/b&gt; : let으로 만든 struct 인스턴스의 내부 프로퍼티를 수정시; &lt;u&gt;&lt;b&gt;오류가 발생&lt;/b&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;harr;️ 클래스에서는 가능  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Memberwise Initializer 제공&lt;/b&gt; (&amp;harr;️ 클래스와 다른점)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 init 을 정의하지 않아도 모든 프로퍼티의 초기화를 자동으로 생성해주는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/81</guid>
      <comments>https://hortenssiaa.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 13 Mar 2025 15:40:12 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w2d2] 알고리즘 특강 / 야구 게임 만들기 (Lv. 1~3 / 6)</title>
      <link>https://hortenssiaa.tistory.com/80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[오운완] 7am 운동으로 시작!&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12시간 이상을 앉아있는 요즘은 더욱.. 운동이 필수인 듯하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내배캠 기간에 특별한 밤샘 작업이 없다면, 주 3일은 필수로 정해놨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 2년간 매일&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;새벽기상 &amp;amp; 운동을 해오다보니,&amp;nbsp;평생을 수면시간에 집착했던 나는 &lt;span&gt;시간에도 자유하게 됐고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오히려 내배캠 시작하고 운동할 시간이 없어서 더 일찍 일어나고 있다. (우리아이가 바꼈어요 wow~)&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;내배캠 직전까지 오전 알바 + 운동 + 공부 루틴으로 에너지를 2배로 썼는데, &lt;/span&gt;&lt;span&gt;계속 앉아 있다보니 아직 2주차인데 얼굴이 통통해지고 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;|0.0| ➡️ (ㅇ.ㅇ)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SNS에 내 사진 업로드 잘 안하지만.. &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;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;&lt;span&gt;그래서 운동하는게 재밌고 일찍 일어나도 안피곤하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;개인적으로는 스트레칭을 좋아한다. (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마디마디 시원하게 찢어주세요~)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 근력운동은, 허리 &amp;amp; 고관절이 아파서 길게 앉지도 못했던 나를 12시간 앉아도 끄떡 없게 만들어 줬다.  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오늘은 사진 올리는 첫 날이니 좀 길게썼다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그럼 오늘도 가보즈아~&lt;/span&gt;&lt;/span&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/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; style=&quot;width: 35.9986%; margin-right: 10px;&quot; data-widthpercent=&quot;36.86&quot; data-filename=&quot;Screenshot 2025-03-10 at 9.17.00 pm.png&quot; data-origin-height=&quot;84&quot; data-origin-width=&quot;85&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF5rUA%2FbtsMHQQqliu%2Fgk2MmyQ6UKwkfAsy49BXw1%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;85&quot; height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;85&quot; data-origin-height=&quot;84&quot; data-filename=&quot;Screenshot 2025-03-10 at 9.17.00 pm.png&quot; style=&quot;width: 35.9986%;&quot; data-widthpercent=&quot;36.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF5rUA/btsMHQQqliu/gk2MmyQ6UKwkfAsy49BXw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF5rUA%2FbtsMHQQqliu%2Fgk2MmyQ6UKwkfAsy49BXw1%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;85&quot; height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오운완!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[알고리즘 코어반 시작] 9am 오늘은 OT!&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Code KATA]&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;KATA 란, 특정 무술을 실전에서 사용하기 전에 일련의 동작을 훈련하는 카라테의 용어이다.&lt;/li&gt;
&lt;li&gt;프로그래밍 언어를 사용해 문제 해결 능력을 기르는 반복 훈련&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Swift 로 문제를 풀자! - &lt;/b&gt;&lt;b&gt;전략]&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시간싸움 해야하는, 공채  
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Collection 사용하는게, 시간 안에 가능할까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따로 링크가 와서, 풀어주세요!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통 몇 문제 없고, 시간이 충분하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자료구조를 Custom 해서 구현하면 인터뷰에서 할 말이 많다.&lt;/li&gt;
&lt;li&gt;어필할 수 있는 포인트가 많을 수록 더 좋지!&lt;/li&gt;
&lt;/ul&gt;
&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[CLI 야구 게임 만들기] 11am Lv 1, 2, 3 구현&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741693056975&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;SpartaCamp-iOS/BaseBallGame_CLI at main &amp;middot; hortenssiaa/SpartaCamp-iOS&quot; data-og-description=&quot;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&quot; data-og-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzXCqf/hyYqPZml9J/c3mMltlXuzQheG2eAfd780/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ci8TBI/hyYrSnQAZ9/XgykbZLBJ85EwGP4BLddL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/BaseBallGame_CLI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzXCqf/hyYqPZml9J/c3mMltlXuzQheG2eAfd780/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/ci8TBI/hyYrSnQAZ9/XgykbZLBJ85EwGP4BLddL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239');&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;SpartaCamp-iOS/BaseBallGame_CLI at main &amp;middot; hortenssiaa/SpartaCamp-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[✅ 개발 시 CTA와 ETA 확인 ✅]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발은 요구사항과 데드라인을 지키는 것이 굉장히 중요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;과제의 요구사항이 무엇인지 파악하고, 요구사항별로 상세 기능을 생각해 봅니다.&lt;/li&gt;
&lt;li&gt;레벨별로 ETA를 정해 데드라인을 지켜봅니다.&lt;/li&gt;
&lt;li&gt;필수 구현기능을 충분히 고민해서 구현해보고, 시간이 남을 경우 Lv6까지 확장하여 진행해 봅니다.&lt;/li&gt;
&lt;li&gt;사용하면서 발생할 수 있는 예외사항을 고려해 봅니다.&lt;/li&gt;
&lt;/ol&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;[Lv1. 요구사항 정리]&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임이다.&lt;/li&gt;
&lt;li&gt;정답은 랜덤으로 만듭니다.(1에서 9까지의 서로 다른 임의의 수 3자리)&lt;/li&gt;
&lt;/ol&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;[Lv2. 요구사항 정리]&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;정답을 맞추기 위해 3자리수를 입력하고 힌트를 받습니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(input) : 3자리수&lt;/li&gt;
&lt;li&gt;(output) : 힌트
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;같은 자리에 같은 숫자가 있는 경우 스트라이크, 다른 자리에 숫자가 있는 경우 볼입니다&lt;/li&gt;
&lt;li&gt;만약 올바르지 않은 입력값에 대해서는 오류 문구를 보여주세요&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;input 값 체크
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;세 자리 모두 숫자여야함&lt;/li&gt;
&lt;li&gt;세 자리 모두 다른 숫자여야함&lt;/li&gt;
&lt;li&gt;0 포함 x, 1...9 까지의 숫자여야함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Lv2. 학습내용]&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;String 배열의 index 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741694508713&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Srike &amp;amp; Ball Checker
for i in 0...(answer.count - 1) {
    for j in 0...(input.count - 1) {
        let answerIdx = answer.index(answer.startIndex, offsetBy: i)
        let inputIdx = input.index(input.startIndex, offsetBy: j)
                    
        if i == j {
            if answer[answerIdx] == input[inputIdx] {
                strike += 1
            }
        } else {
            if answer[answerIdx] == input[inputIdx] {
                ball += 1
            }
        }
    }
}&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;&lt;b&gt;[Lv3. 요구사항 정리]&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;랜덤 정답을 생성 시, 첫 자리를 제외한 모든 자리수의 범위를 0...9까지로 확장&lt;/li&gt;
&lt;/ol&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;[받은 코드리뷰 &amp;amp; 개선해볼 점]&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일 구조 - 디자인 패턴 고민하여 refactoring&lt;/li&gt;
&lt;li&gt;Set 사용하여 중복 제거하도록 수정&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[알고리즘 특강]&amp;nbsp; 7pm   궁극적 목표는, 자료구조를 고안해 내는 힘을 기르는 거예요!&lt;/b&gt;&lt;/h2&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;span&gt;[궁극적 목표]&lt;br /&gt;1️⃣ 자료구조를 고안해 내는 힘!&lt;br /&gt;2️⃣ 프로그래밍적 사고를 기르는 힘!&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문제 해결을  기술  하고&lt;/li&gt;
&lt;li&gt;적합한 방법이 있으면, 생각하여 선택 &amp;amp; 적용 -&amp;gt; 프로그래밍적 사고&amp;nbsp;&lt;/li&gt;
&lt;/ol&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;알고리즘 문제를 풀기 위해, 자료구조가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack, Queue 등은 &lt;b&gt;&lt;u&gt;구현할 수 있어야 한다&lt;/u&gt;&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 안에 Set, Dictionary, Array 등 사용하여.&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;[새로 배운 것]&lt;br /&gt;&lt;/b&gt;&lt;b&gt;circular queue&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;용량이 꽉 차면, 앞에 있는 것을 지운다.&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;손으로 직접 그리고 쓰면서 하면 효과가 더 뛰어나다는 사실!&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[숙제] &lt;br /&gt;링크드 리스트 구현해보기&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[회고  ]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 온보딩 주차 피드백을 받았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피드백 받는게 너무 좋다. 특히 더 발전시키거나 고쳐야 할 점을 피드백 받는게 너무 좋다.&lt;/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>iOS </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/80</guid>
      <comments>https://hortenssiaa.tistory.com/80#entry80comment</comments>
      <pubDate>Tue, 11 Mar 2025 21:04:35 +0900</pubDate>
    </item>
    <item>
      <title>[TIL w2d1] Swift 복습 (Tuple, Collection Type, Closure)</title>
      <link>https://hortenssiaa.tistory.com/79</link>
      <description>&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[Today's Word]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘의 할 일을 내일로 미루지 말자.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[강의내용]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;1. 오늘 배운 것&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수, 상수&lt;/li&gt;
&lt;li&gt;주석&lt;/li&gt;
&lt;li&gt;기본 데이터 타입 (Int, Float, Double, String, Character, Boolean, Tuple)&lt;/li&gt;
&lt;li&gt;Swift Convention Guid No. 1, 2, 3&lt;/li&gt;
&lt;li&gt;연산자 (대입, 산술, 비교, 논리, 범위, 삼항)&lt;/li&gt;
&lt;li&gt;조건문 (if, guard, switch)&lt;/li&gt;
&lt;li&gt;반복문 (for, while, break, continue)&lt;/li&gt;
&lt;li&gt;함수&lt;/li&gt;
&lt;li&gt;Collection Type (Array, Set, Dictionary)&lt;/li&gt;
&lt;li&gt;Closure&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;2. 개념 정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오늘 배운 것 중, 기존 알고 있던 개념에 +@ 된 내용 만 정리하였다.&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Swift Convention Guid&lt;/li&gt;
&lt;li&gt;기본 데이터 타입
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Int&lt;/li&gt;
&lt;li&gt;Float : 소수점 아래 6자리까지&lt;/li&gt;
&lt;li&gt;Double : 소수점 아래 15자리까지&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Tuple : (하나의 타입처럼 사용 가능)&lt;/li&gt;
&lt;li&gt;Switch : &lt;b&gt;fallthrough&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Array : .append(&lt;b&gt;contentsOf&lt;/b&gt;:&amp;nbsp;[])&lt;/li&gt;
&lt;li&gt;Set : 집합&lt;/li&gt;
&lt;li&gt;Dictionary&lt;/li&gt;
&lt;li&gt;Closure : &lt;b&gt;Optional Closure&lt;/b&gt;, &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Trailing Closure&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Swift Convention Guid&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컨벤션이란, 코드를 작성할 때 지키면 좋은 통일된 규칙을 의미한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;통일 된 규칙이 있으면 다른 사람이 작성한 코드를 빠르게 이해할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741608090776&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 이름 짓는 방법 : Camel Case 
2. 변수와 상수 이름 짓기 : 변수의 이름은 소문자로 시작
3. :  컨밴션 : 타입을 정하는 :  앞에는 공백이 없고 뒤에는 공백이 있게 코드를 작성
4. 연산자 코드 컨밴션 : 논리연산자 NOT을 제외한 
					AND, OR, 대입 연산자 , 산술 연산자, 비교 연산자 양옆으로 공백
5. 함수의 코드 스타일 : 함수 / 매개변수 이름은 Camel Case&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 기본 데이터 타입 (Int, Float, Double)&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;Int (정수형)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범위 : -2,147,483,648 ~ 2,147,483,647&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Float&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;32 bit 메모리 공간 차지, &lt;b&gt;&lt;u&gt;소수점 아래 6자리&lt;/u&gt;&lt;/b&gt;까지 표현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Doublt
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;64 bit 메모리 공간 차지, &lt;b&gt;&lt;u&gt;소수점 아래 15자리&lt;/u&gt;&lt;/b&gt;까지 표현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;3. Tuple&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 타입의 값들을 그룹화하여 -&amp;gt; 하나의 타입처럼 사용 가능&lt;/li&gt;
&lt;li&gt;고유 인덱스 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741607905761&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let hakyung: (name: String, age: Int, major: String) = (&quot;hakyung&quot;, 30, &quot;iOS&quot;)
let student: [(name: String, age: Int, major: String)] = [
    (&quot;haykung&quot;, 20, &quot;iOS&quot;),
    (&quot;sam&quot;, 21, &quot;Web&quot;),
    (&quot;Mei&quot;, 19, &quot;Server&quot;)
]

print(student[1])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Switch&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;b&gt;fallthrough&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 에서 조건이 맞아서 실행된 후, 아래의 조건도 확인하고 싶을때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Array&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;.append(&lt;b&gt;contentsOf&lt;/b&gt;:&amp;nbsp;[])
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열 안에 배열 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608251636&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [0, 1, 2, 3]
array.append(contentsOf: [10, 20, 30])

print(array) // [0, 1, 2, 3, 10, 20, 30]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Set (집합)&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;순서 x&lt;/li&gt;
&lt;li&gt;중복 x&lt;/li&gt;
&lt;li&gt;타입&amp;nbsp;명시!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608318651&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var stringSet: Set&amp;lt;String&amp;gt; = []
var intSet: Set&amp;lt;Int&amp;gt; = Set()

print(stringSet.contains(&quot;a&quot;))

intSet.insert(1)
print(intSet)


// 2. Set 실습하기 : 아래를 코드로 만들어주세요.
var setSet: Set = [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]
setSet.insert(&quot;3&quot;)

print(setSet)

let isFourContain = setSet.contains(&quot;4&quot;)
print(isFourContain)

setSet.remove(&quot;1&quot;)
print(setSet)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. Dictionary&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;순서 x&lt;/li&gt;
&lt;li&gt;형태 : key: value&lt;/li&gt;
&lt;li&gt;key 중복 x&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608356008&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var dictionary = [String: String]()
//var dictionary: [String: String] = [:]

dictionary[&quot;A&quot;] = &quot;Apple&quot;
dictionary[&quot;B&quot;] = &quot;Banana&quot;
print(dictionary[&quot;A&quot;])

dictionary[&quot;A&quot;] = &quot;Avocado&quot;
print(dictionary[&quot;A&quot;])

print(dictionary.count)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8. Closure&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;b&gt;파라미터: 튜플타입 (Int, String), 반환타입은 없음!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608417640&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let closure: (Int, String) -&amp;gt; Void = { intValue, stringValue in
    print(intValue)
    print(stringValue)
}
closure(40, &quot;이거 읽어봐&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;파라미터의 이름을 생략하 구현부에서 $0로 사용할 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608466635&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let closure2: (Int) -&amp;gt; Void = {
    print($0)
}
closure2(1004)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741608476137&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let closure5: (String, Int) -&amp;gt; Int = {
    return $0.count + $1
}
print(closure5(&quot;200&quot;, 3))&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파라미터&amp;nbsp;없는&amp;nbsp;클로저&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608491252&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let closure3: () -&amp;gt; Void = {
    print(&quot;Hello!&quot;)
}
closure3()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;파라미터&amp;nbsp;Int,&amp;nbsp;output&amp;nbsp;Int&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608518156&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let closure4: (Int) -&amp;gt; Int = { value in
    return value * 2
}
print(closure4(10))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;&lt;b&gt;Optional&amp;nbsp;Closure&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608535569&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let optionalClosure: ((Int) -&amp;gt; Int)? = { value in
    return value * 2
}
print(optionalClosure!(40))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;파라미터가 없을 때는 in을 사용하면 안됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608565957&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let emptyParameterClosure: () -&amp;gt; Void = {
    print(&quot;Hello Im Emmpty&quot;)
}
emptyParameterClosure()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;8.1. Trailing Closure  &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: 경량화 방법 중 하나&lt;/p&gt;
&lt;pre id=&quot;code_1741608626870&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func trailingCloure(key: String, closure: () -&amp;gt; Void) {
    print(key)
    closure() // ⭐️
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;클로저가&amp;nbsp;마지막&amp;nbsp;파라미터일때,&amp;nbsp;이어서&amp;nbsp;작성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608654862&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trailingCloure(key: &quot;trailing Closure Test1&quot;, closure: {
    print(&quot;The Closure in 'trailing Closure Test1'&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;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클로저&amp;nbsp;구현이&amp;nbsp;길어지는&amp;nbsp;경우,&amp;nbsp;클로저함수호출&amp;nbsp;외부에&amp;nbsp;작성하여,&amp;nbsp;가독성&amp;nbsp;높이기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741608677314&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trailingCloure(key: &quot;trailing Closure Test2&quot;) {
    print(&quot;Second trailing Closure&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[깃헙 코드]&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741605352922&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;SpartaCamp-iOS/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift at main &amp;middot; hortenssiaa/SpartaCamp-iOS&quot; data-og-description=&quot;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&quot; data-og-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x6cOH/hyYp9p3K95/kE7kH69Cj1qWHhQVHEb0H1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/MhSMD/hyYrWp7TCh/2Ps2LHjXJKnI4SL0ZT1Ci1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/blob/main/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x6cOH/hyYp9p3K95/kE7kH69Cj1qWHhQVHEb0H1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239,https://scrap.kakaocdn.net/dn/MhSMD/hyYrWp7TCh/2Ps2LHjXJKnI4SL0ZT1Ci1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239');&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;SpartaCamp-iOS/Nbc-Swift-Grammer/Swift-Grammer-week-1.swift at main &amp;middot; hortenssiaa/SpartaCamp-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;deep dive ❤️&amp;zwj;  into iOS. Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS </category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/79</guid>
      <comments>https://hortenssiaa.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 10 Mar 2025 21:17:12 +0900</pubDate>
    </item>
    <item>
      <title>[Project TIL 14...17일차]   Git Branch와의 사투  &amp;zwj;♀️❤️&amp;zwj; </title>
      <link>https://hortenssiaa.tistory.com/75</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;#merge&lt;/b&gt;&lt;/b&gt;(--ff, --no-ff, --squash)&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;#pull&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(--ff-only, --rebase)&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;#Rebase&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;#fast-forward&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;#non-fast-forward&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;#HEAD&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;#cherry-pick&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;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;학습 핵심: git의 참조(포인터) 개념&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;지금껏 pull, add, commit, push 만 해왔던 나는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;git의 참조개념을 이제야 알게되었다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;그래서 대체 HEAD의 참조와 커밋의 위치를 이해할 수 없었던 것이었다....&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;wow.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;회고: 팩트직면&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;내가 git 사용할 때의 핵심 문제는, git을 제대로 이해하지 않고 명령어만 냅다 두들긴 것이었다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;콘솔에서 친절히 설명해주는데도, 해석을 못하니,,, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;문제가 생기면 그냥 화면은 검정색이고 글은 흰색인.. 그냥 일시적 문제해결만 냅다 찾아서 명령어 두들기고 있던 것이었다. (팩트직면)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;문제가 생기면 잘 보고. 잘 읽고. 하란대로 해결하면 되는거다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;근데 그걸 하고싶지 않아서 문제가 생기는거다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;오늘, 읽어도 제대로 몰랐던 브랜치에 대해 공부해보자.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;제대로 보고. 제대로 읽고. 제대로 대응하자. ❤️&amp;zwj; &lt;/b&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;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;(참조) HEAD&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;Git에서 HEAD는 현재 활성화된 브랜치의 &lt;u&gt;마지막 커밋을 가리키는&lt;/u&gt; &lt;u&gt;&lt;b&gt;참조 &lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;HEAD는 항상 작업트리의 가장 최근 커밋을 가리키며, 작업트리에 변화를 주는 명령어들은 대부분 HEAD를 변경하는 것으로 시작&lt;/li&gt;
&lt;/ul&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;내배캠 ️ -22 2.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FFRot/btsMtQD2R8U/jb7PhlVuxgNk7P8KKuUDH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FFRot/btsMtQD2R8U/jb7PhlVuxgNk7P8KKuUDH0/img.jpg&quot; data-alt=&quot;HEAD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FFRot/btsMtQD2R8U/jb7PhlVuxgNk7P8KKuUDH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFFRot%2FbtsMtQD2R8U%2Fjb7PhlVuxgNk7P8KKuUDH0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;647&quot; data-filename=&quot;내배캠 ️ -22 2.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HEAD&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;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;HEAD 포인터 이동&lt;/b&gt;&lt;br /&gt;&lt;b&gt;: reset&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;reset 의미 : reset the index and work-tree to match HEAD&lt;/li&gt;
&lt;li&gt;사용 예
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ git reset --hard v2.0.0&lt;/li&gt;
&lt;li&gt;$ git reset --hard HEAD^^^&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471656435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;( current )
            v2.0.0
              /
-- a -- b 
              \
                c -- d -- e
                                 \
                                 HEAD, main, develop


$ git reset --hard v2.0.0
  2.0.0    HEAD, main
          \   /
-- a -- b 
              \
                c -- d -- e
                                 \
                                develop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가장 위험한 옵션&amp;nbsp; --hard&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;reset&quot; href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740395117266&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;Git - Reset 명확히 알고 가기&quot; data-og-description=&quot;지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; data-og-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brrJLR/hyYjrdB2NP/7OaOfI2E3UENkqe01e4SrK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/bvWpNT/hyYfMDkGxb/UHXTDkDAIyGlGJKBqVjYhK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/gTfuA/hyYjAauR2M/hl9iAaTqjQ5YtHsSxsTNgk/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702&quot;&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brrJLR/hyYjrdB2NP/7OaOfI2E3UENkqe01e4SrK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/bvWpNT/hyYfMDkGxb/UHXTDkDAIyGlGJKBqVjYhK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/gTfuA/hyYjAauR2M/hl9iAaTqjQ5YtHsSxsTNgk/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702');&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;Git - Reset 명확히 알고 가기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.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;&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(참조) FETCH_HEAD&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;Git FETCH_HEAD 참조는, &lt;b&gt;Remote 저장소에서 가져온 branch의 HEAD 를 의미&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git fetch 명령 실행시,  &lt;b&gt;&lt;u&gt;임시로 FETCH_HEAD&lt;/u&gt;&lt;/b&gt; 라는 &lt;u&gt;&lt;/u&gt;&lt;b&gt;&lt;u&gt;branch가 생성됨 &lt;/u&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FETCH_HEAD 파일
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위치: &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;.git/FETCH_HEAD&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;git fetch 명령 실행될 때마다 업데이트 됨&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;명령 실행시 마다, remote 에서 가져온 모든 branch의 HEAD가 이 파일에 저장됨&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FETCH_HEAD branch 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;$ git checkout FETCH_HEAD&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;$ git merge FETCH_HEAD&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;FETCH_HEAD file 에 fetch해온 내용을, 현재 branch에 병합 (= 씌운다)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(branch) origin/main vs. main&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;&lt;b&gt;origin/main&lt;/b&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;remote 의 main branch 를 로컬에서 트래킹하는 브랜치!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git fetch [remote]&lt;/b&gt; (= remote 에서 생성된 커밋 내용을, 로컬 branch에 update 하는 역할)&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예)&lt;b&gt; git fetch origin/main 실행시,&amp;nbsp;&lt;/b&gt;&lt;br /&gt;origin/main 브랜치(로컬) 가, remote의 main 브랜치와 동기화&amp;amp;update 됨!  &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;origin main&lt;/b&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;origin main 은, git merge / git pull 의 명령 인자로 사용되는 경우가 많음!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;origin/HEAD &lt;/b&gt;: remote 의 현재 작업 위치를 가리키는 포인터&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;main &lt;/b&gt;: local 의 main branch&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HEAD &lt;/b&gt;: local 의 현재 작업 위치를 가리키는 포인터&lt;/li&gt;
&lt;/ul&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(command) Pull&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;git pull (= normally, fetch+merge) 은, git merge FETCH_HEAD 와 같이 동작
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;즉,&lt;span style=&quot;color: #ef5369;&quot;&gt; git pull 수행 ➡️ git merge FETCH_HEAD ➡️ merge commit 도 생성&lt;/span&gt;!!&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pull option
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;git pull (default)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git pull --ff-only&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git pull --rebase&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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/dtD3TF/btsMw48JQvD/XGrrBR6Kw8IqLNkl4D3J2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtD3TF/btsMw48JQvD/XGrrBR6Kw8IqLNkl4D3J2k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -27.jpg&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/dtD3TF/btsMw48JQvD/XGrrBR6Kw8IqLNkl4D3J2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtD3TF%2FbtsMw48JQvD%2FXGrrBR6Kw8IqLNkl4D3J2k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBQppA/btsMxJb4rYt/VlE3Ua9jAk8xMzxWgVvHQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBQppA/btsMxJb4rYt/VlE3Ua9jAk8xMzxWgVvHQ0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -28.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBQppA/btsMxJb4rYt/VlE3Ua9jAk8xMzxWgVvHQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBQppA%2FbtsMxJb4rYt%2FVlE3Ua9jAk8xMzxWgVvHQ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;git pull + options&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(option) --ff-only&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1740471677956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git pull --ff-only [remote이름] [branch이름]&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #006dd7;&quot;&gt;downloading  &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;git pull --ff-only origin main&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;(= &lt;u&gt;git fetch origin main&lt;/u&gt; + &lt;u&gt;git merge --ff origin/main&lt;/u&gt;)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;git fetch origin main&lt;/b&gt; &lt;br /&gt;: 리모트(origin)의 main브랜치를 가져와! ➡️ 로컬에서는, origin main의 트래킹 브랜치인,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;u&gt;origin/main 로컬 브랜치를 업데이트&lt;/u&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(option) --rebase&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1740471684358&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git pull --rebase [remote이름] [branch이름]&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #006dd7;&quot;&gt;committing&lt;/span&gt;  &lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;git pull --rebase origin main&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;(= &lt;u&gt;git fetch origin main&lt;/u&gt; + &lt;u&gt;git &lt;b&gt;rebase&lt;/b&gt; origin/main&lt;/u&gt;)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;git fetch origin main&lt;/b&gt;&lt;br /&gt;: 리모트(origin)의 main브랜치를 가져와! ➡️ 로컬에서는, origin main의 트래킹 브랜치인,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;u&gt;origin/main 로컬 브랜치를 업데이트&lt;/u&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(command) Merge&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;내배캠 ️ -24.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; data-alt=&quot;Merge vs. Rebase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTVqE3%2FbtsMr8xeS7r%2FZNomcHI3Vg1XTep4GuINn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;647&quot; data-filename=&quot;내배캠 ️ -24.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Merge vs. Rebase&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Merge&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Merge option
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;git merge &lt;u&gt;&lt;b&gt;--ff&lt;/b&gt;&lt;/u&gt; [브랜치명]&lt;span&gt;&amp;nbsp;&lt;/span&gt;: fast-forward 관계에 있으면 commit을 생성하지 않고 현재 브랜치의 참조 값 만 변경(default)&lt;/li&gt;
&lt;li&gt;git merge &lt;b&gt;&lt;u&gt;--no-ff&lt;/u&gt;&lt;/b&gt; [브랜치명]&lt;span&gt;&amp;nbsp;&lt;/span&gt;: fast-forward 관계에 있어도 merged commit 생성&lt;/li&gt;
&lt;li&gt;git merge &lt;b&gt;&lt;u&gt;--squash&lt;/u&gt;&lt;/b&gt; [브랜치명]&lt;span&gt;&amp;nbsp;&lt;/span&gt;: fast-forward 관계에 있어도 merged commit 생성, merging 브랜치 정보 생략&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&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/dwtieU/btsMvdluYNg/MvPkfZVVbUleHABs3NLXV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwtieU/btsMvdluYNg/MvPkfZVVbUleHABs3NLXV0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -28.jpg&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/dwtieU/btsMvdluYNg/MvPkfZVVbUleHABs3NLXV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwtieU%2FbtsMvdluYNg%2FMvPkfZVVbUleHABs3NLXV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccyLCC/btsMxrJoyaG/Ji61NCOyX1s6l1dQTdYOdk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccyLCC/btsMxrJoyaG/Ji61NCOyX1s6l1dQTdYOdk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -29.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccyLCC/btsMxrJoyaG/Ji61NCOyX1s6l1dQTdYOdk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccyLCC%2FbtsMxrJoyaG%2FJi61NCOyX1s6l1dQTdYOdk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Merge option 그림&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;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(command) Rebase&lt;/b&gt;&lt;b&gt;&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;초보자가 거리를 둬야 하는 마법같은 Git 주문&lt;/li&gt;
&lt;li&gt;Rebase 는, 프&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;로젝트 history를 더 명확히 얻을 있다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;내배캠 ️ -24.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; data-alt=&quot;Merge vs. Rebase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTVqE3/btsMr8xeS7r/ZNomcHI3Vg1XTep4GuINn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTVqE3%2FbtsMr8xeS7r%2FZNomcHI3Vg1XTep4GuINn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;647&quot; data-filename=&quot;내배캠 ️ -24.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Merge vs. Rebase&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;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; &amp;nbsp; &lt;b&gt;Rebase &lt;/b&gt;주의 할 점 !!!&amp;nbsp; &lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;(aka. The Golden Rule of Rebasing)&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&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;u&gt;&lt;b&gt;팀과 상의하지 않고 사용 금지!&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;&amp;amp; 그렇지 않으면 &amp;gt;&amp;gt;&amp;gt; &lt;b&gt;&lt;/b&gt;&lt;u&gt;&lt;b&gt;개인 프로젝트 / 개인만 사용하는 branch일 경우만 사용할 것!!&lt;/b&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 사용자는 main branch 로 작업중!! &amp;gt; 매우 혼란스럽게 됨!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUCdP/btsMrYn7dBb/K3Bf8wsNVVBPXq01TPb76K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUCdP/btsMrYn7dBb/K3Bf8wsNVVBPXq01TPb76K/img.jpg&quot; data-alt=&quot;The golden rule of rebasing&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUCdP/btsMrYn7dBb/K3Bf8wsNVVBPXq01TPb76K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUCdP%2FbtsMrYn7dBb%2FK3Bf8wsNVVBPXq01TPb76K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;267&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;The golden rule of rebasing&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;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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;u&gt;git rebase&lt;/u&gt; [branch]&amp;nbsp; &amp;nbsp;vs.&amp;nbsp; &lt;u&gt;git pull --rebase&lt;/u&gt; [remote] [branch]&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;차이점: fetch 실행의 유/무&lt;/h4&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;u&gt;&lt;b&gt;[1] git rebase 사용 순서&lt;/b&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;git fetch origin main (실행x)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리모트(origin)의 main브랜치를 가져와! ➡️ 로컬에서는, origin main의 트래킹 브랜치인, &lt;b&gt;&lt;u&gt;origin/main 로컬 브랜치를 업데이트&lt;/u&gt;&lt;/b&gt; 한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;git rebase origin/main (실행o)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 로컬 브랜치를, &lt;b&gt;&lt;u&gt;origin/main의 최신 커밋 &lt;span style=&quot;color: #ef5369;&quot;&gt;위로&lt;/span&gt; rebase&lt;/u&gt;  &lt;/b&gt; 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;u&gt;&lt;b&gt;[2] git pull --rebase origin main&lt;/b&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리모트(origin)의 main브랜치를 가져와, 로컬의 현재 브랜치를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;u&gt;그 위에 rebase&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;=&amp;nbsp; &lt;u&gt;git &lt;span style=&quot;color: #ee2323;&quot;&gt;fetch&lt;/span&gt; origin main &lt;b&gt;(실행o)&amp;nbsp; &lt;/b&gt;+&amp;nbsp; git rebase origin/main &lt;b&gt;(실행o)&lt;/b&gt;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;내배캠 ️ -34.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvTlDI/btsMvao8eXD/0vSyLmGXcrpyoV9LIwov3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvTlDI/btsMvao8eXD/0vSyLmGXcrpyoV9LIwov3K/img.jpg&quot; data-alt=&quot;git rebase&amp;amp;nbsp; &amp;amp;nbsp;vs.&amp;amp;nbsp;&amp;amp;nbsp;git pull --rebase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvTlDI/btsMvao8eXD/0vSyLmGXcrpyoV9LIwov3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvTlDI%2FbtsMvao8eXD%2F0vSyLmGXcrpyoV9LIwov3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;647&quot; data-filename=&quot;내배캠 ️ -34.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git rebase&amp;nbsp; &amp;nbsp;vs.&amp;nbsp;&amp;nbsp;git pull --rebase&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;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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(command)&amp;nbsp;&lt;/span&gt;   &lt;/span&gt;Cherry Pick &lt;span style=&quot;color: #777777; text-align: center;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;&lt;/span&gt;&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;commit 된 것을, 실행 취소 할 수 있음&lt;/li&gt;
&lt;li&gt;예) 실수로 잘못된 브랜치에 커밋 한 경우; &lt;b&gt;&lt;u&gt;올바른 브랜치로 checkout 하고, 원하는 커밋을 cherry-pick 할 수 있음&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Cherry-pick 단어 뜻&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기 실족만 차리다, 자신에게 필요한 것을 선별적으로 택하다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-21 at 4.57.19 pm.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1nUl2/btsMqBghsxI/O3UH9pqPaa0b4ziJJ9Ko00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1nUl2/btsMqBghsxI/O3UH9pqPaa0b4ziJJ9Ko00/img.png&quot; data-alt=&quot;cherry-pick&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1nUl2/btsMqBghsxI/O3UH9pqPaa0b4ziJJ9Ko00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1nUl2%2FbtsMqBghsxI%2FO3UH9pqPaa0b4ziJJ9Ko00%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;436&quot; height=&quot;350&quot; data-filename=&quot;Screenshot 2025-02-21 at 4.57.19 pm.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cherry-pick&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;git cherry-pick 사용해보기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 아래와 같은 branch 상황이고, Main branch 에 f 가 필요한 상황&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ef5369;&quot;&gt;a&lt;/span&gt; - &lt;span style=&quot;color: #ef5369;&quot;&gt;b&lt;/span&gt; - c - d&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ef5369;&quot;&gt;Main&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;e - &lt;span style=&quot;color: #0593d3;&quot;&gt;f&lt;/span&gt; - g&amp;nbsp; &amp;nbsp; &amp;nbsp;Feature&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 명령 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740471751781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout main
git cherry-pick f(실제로는 해쉬값)&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;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;3. branch 결과&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;a&lt;/span&gt; - &lt;span style=&quot;color: #ef5369;&quot;&gt;b&lt;/span&gt; - c - d - &lt;span style=&quot;color: #0593d3;&quot;&gt;f&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ef5369;&quot;&gt;Main&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;e -&lt;span style=&quot;color: #0593d3;&quot;&gt; f&lt;/span&gt; - g&amp;nbsp; &amp;nbsp; &amp;nbsp; Feature&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;style1&quot; /&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;X 포함 Y 까지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471796500&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예) git cherry-pick X A B C Y
git cherry-pick ab84361 c5d1baf 2d7fccd&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740471828437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예) git cherry-pick X^..Y
git cherry-pick ab84361^..2d7fccd&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;X 포함x, Y 까지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471837933&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예) git cherry-pick X..Y
git cherry-pick ab84361..2d7fccd&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;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;git cherry-pick 옵션 사용&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;--abort
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cherry-pick 충돌하는 경우, 중단하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471845267&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git cherry-pick --abort&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--continue
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cherry-pick 충돌 해결하고 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471867870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git cherry-pick --continue&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-edit&lt;br /&gt;: cherry-pick 적용 전, 커밋 메세지 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471879818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git cherry-pick f -edit&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--no-commit / -n&lt;br /&gt;: cherry-pick 을 실행하지만, 새 커밋을 만들지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740471896611&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git cherry-pick f -n&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;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;&lt;b&gt;주의 할 점&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;중복 commit 유발 할 수 있음&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀 혐업 / bug hotfix / 변경사항(commit) 실행 취소 및 손실된 commit 복원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[실전] 프로젝트 git conflict 해결하기&lt;/b&gt;&lt;/h2&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/5WEmP/btsMxkw6iMe/eRQkFQYl8dqjoXq1pGtwKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WEmP/btsMxkw6iMe/eRQkFQYl8dqjoXq1pGtwKk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -35.jpg&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/5WEmP/btsMxkw6iMe/eRQkFQYl8dqjoXq1pGtwKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WEmP%2FbtsMxkw6iMe%2FeRQkFQYl8dqjoXq1pGtwKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4Wp3/btsMwfpDfvp/BEimHpENIabR0iPvYFMNLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4Wp3/btsMwfpDfvp/BEimHpENIabR0iPvYFMNLk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot; data-filename=&quot;내배캠 ️ -36.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4Wp3/btsMwfpDfvp/BEimHpENIabR0iPvYFMNLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4Wp3%2FbtsMwfpDfvp%2FBEimHpENIabR0iPvYFMNLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&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;&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;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;[error]&amp;nbsp; &quot;HEAD detached from &lt;/span&gt;&lt;span&gt;FETCH_HEAD&quot; ❤️&amp;zwj; &lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;위의 [실전] 프로젝트 git conflict 해결하기 &lt;/b&gt;했더니 나온 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.09.27 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1B5zL/btsMxntNARC/u0Qu5uk1UA80IO9xBozZq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1B5zL/btsMxntNARC/u0Qu5uk1UA80IO9xBozZq0/img.png&quot; data-alt=&quot;HEAD detached from&amp;amp;nbsp;FETCH_HEAD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1B5zL/btsMxntNARC/u0Qu5uk1UA80IO9xBozZq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1B5zL%2FbtsMxntNARC%2Fu0Qu5uk1UA80IO9xBozZq0%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;835&quot; height=&quot;260&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.09.27 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HEAD detached from&amp;nbsp;FETCH_HEAD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.11.23 pm.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAUbwH/btsMv5HnwRV/9JcObITe5MQnSYkNC8REFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAUbwH/btsMv5HnwRV/9JcObITe5MQnSYkNC8REFk/img.png&quot; data-alt=&quot;HEAD detached from&amp;amp;nbsp;FETCH_HEAD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAUbwH/btsMv5HnwRV/9JcObITe5MQnSYkNC8REFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAUbwH%2FbtsMv5HnwRV%2F9JcObITe5MQnSYkNC8REFk%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;791&quot; height=&quot;292&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.11.23 pm.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HEAD detached from&amp;nbsp;FETCH_HEAD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[현재 git commit 상황]&lt;br /&gt;&lt;/b&gt;main branch 를 가리켜야 할 HEAD 가, main 을 앞선 상황&lt;/h4&gt;
&lt;pre id=&quot;code_1740479328839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                          HEAD
                          /
(main)   a - b - c - d - e
                      \
                      main&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;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;&lt;b&gt;[해결]&lt;br /&gt;&lt;/b&gt;new branch 'temp' 만들고, 강제로 main branch &amp;gt; temp branch 로 옮긴다.&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1740478516908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1) git branch temp
2) git checkout temp
3) git branch -f main temp&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740479208457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                             HEAD
                              /
                            temp
                            /
(temp) ------------------  e 
                          /
(main)   a - b - c - d - e&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&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;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;pre id=&quot;code_1740478701048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;4) git checkout main&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740479160909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(temp) ------------------  e 
                          /
(main)   a - b - c - d - e
                          \
                          main
                            \
                           HEAD&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;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;pre id=&quot;code_1740478822122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5) git log --oneline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.20.34 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LuNeW/btsMwx4I1VS/J01KnOhkRYmz7UrX0b0i0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LuNeW/btsMwx4I1VS/J01KnOhkRYmz7UrX0b0i0k/img.png&quot; data-alt=&quot;HEAD -&amp;amp;gt; main 돌아온 모습! ❤️&amp;amp;zwj; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LuNeW/btsMwx4I1VS/J01KnOhkRYmz7UrX0b0i0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLuNeW%2FbtsMwx4I1VS%2FJ01KnOhkRYmz7UrX0b0i0k%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;835&quot; height=&quot;374&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.20.34 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HEAD -&amp;gt; main 돌아온 모습! ❤️&amp;zwj; &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;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;pre id=&quot;code_1740478869485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;6) git branch -d temp
7) git push&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.21.26 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwMX8e/btsMwtnMZ6m/K75CXF2VR9yFxlfNzkm8k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwMX8e/btsMwtnMZ6m/K75CXF2VR9yFxlfNzkm8k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwMX8e/btsMwtnMZ6m/K75CXF2VR9yFxlfNzkm8k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwMX8e%2FbtsMwtnMZ6m%2FK75CXF2VR9yFxlfNzkm8k0%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;835&quot; height=&quot;393&quot; data-filename=&quot;Screenshot 2025-02-25 at 7.21.26 pm.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740123632992&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;병합과 기준 재지정(rebase) 비교 | Atlassian Git Tutorial&quot; data-og-description=&quot;관련된 git merge 명령으로 git rebase를 비교하고 잠재적인 모든 기회를 식별하여 일반 Git 워크플로우로 기준 재지정을 통합합니다.&quot; data-og-host=&quot;www.atlassian.com&quot; data-og-source-url=&quot;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&quot; data-og-url=&quot;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.atlassian.com/ko/git/tutorials/merging-vs-rebasing&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;병합과 기준 재지정(rebase) 비교 | Atlassian Git Tutorial&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;관련된 git merge 명령으로 git rebase를 비교하고 잠재적인 모든 기회를 식별하여 일반 Git 워크플로우로 기준 재지정을 통합합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.atlassian.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.atlassian.com/ko/git/tutorials/cherry-pick&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.atlassian.com/ko/git/tutorials/cherry-pick&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740124965226&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;Git Cherry Pick | Atlassian Git Tutorial&quot; data-og-description=&quot;Git cherry-pick은 여러 브랜치를 합칠 때 유용한 도구이지만 항상 모범 사례인 것은 아닙니다. 언제, 어떻게, 어디서 사용하는지 알아보세요!&quot; data-og-host=&quot;www.atlassian.com&quot; data-og-source-url=&quot;https://www.atlassian.com/ko/git/tutorials/cherry-pick&quot; data-og-url=&quot;https://www.atlassian.com/ko/git/tutorials/cherry-pick&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sai09/hyYfV7TStf/lJCK5AnxbdebPtQd4k4ZL1/img.png?width=1464&amp;amp;height=977&amp;amp;face=0_0_1464_977,https://scrap.kakaocdn.net/dn/bjaSAy/hyYjlRqnFU/k5Kz7MgER9z0gqoVHJAfB0/img.png?width=1464&amp;amp;height=976&amp;amp;face=0_0_1464_976,https://scrap.kakaocdn.net/dn/MiEtT/hyYjnholdP/v2UwiwctZ7xFJKfjTrBEz0/img.png?width=1464&amp;amp;height=976&amp;amp;face=0_0_1464_976&quot;&gt;&lt;a href=&quot;https://www.atlassian.com/ko/git/tutorials/cherry-pick&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.atlassian.com/ko/git/tutorials/cherry-pick&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sai09/hyYfV7TStf/lJCK5AnxbdebPtQd4k4ZL1/img.png?width=1464&amp;amp;height=977&amp;amp;face=0_0_1464_977,https://scrap.kakaocdn.net/dn/bjaSAy/hyYjlRqnFU/k5Kz7MgER9z0gqoVHJAfB0/img.png?width=1464&amp;amp;height=976&amp;amp;face=0_0_1464_976,https://scrap.kakaocdn.net/dn/MiEtT/hyYjnholdP/v2UwiwctZ7xFJKfjTrBEz0/img.png?width=1464&amp;amp;height=976&amp;amp;face=0_0_1464_976');&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;Git Cherry Pick | Atlassian Git Tutorial&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git cherry-pick은 여러 브랜치를 합칠 때 유용한 도구이지만 항상 모범 사례인 것은 아닙니다. 언제, 어떻게, 어디서 사용하는지 알아보세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.atlassian.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://parksb.github.io/article/28.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://parksb.github.io/article/28.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740127228425&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;Git 사용 중 자주 만나는 이슈 정리: 코딩보다 어려운 버전 관리&quot; data-og-description=&quot;깃으로 버전 관리를 하다보면 각종 이슈가 자주 발목을 잡는다. 특히 복잡한 프로젝트의 경우 그 정도가 심한데&amp;hellip; 입사 이후 '지금까지 내가 한 건 깃이 아니구나&amp;rsquo;를 깨닫고 더 공부해 보기로 &quot; data-og-host=&quot;parksb.github.io&quot; data-og-source-url=&quot;https://parksb.github.io/article/28.html&quot; data-og-url=&quot;https://parksb.github.io/article/28.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eCj0p/hyYfBVQ6Lr/yG1giTLyw27XeuHydftbw1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ePU5t/hyYf1fW4Q0/aYoxhsihvL3twO0r8uNwVk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://parksb.github.io/article/28.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://parksb.github.io/article/28.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eCj0p/hyYfBVQ6Lr/yG1giTLyw27XeuHydftbw1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ePU5t/hyYf1fW4Q0/aYoxhsihvL3twO0r8uNwVk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Git 사용 중 자주 만나는 이슈 정리: 코딩보다 어려운 버전 관리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;깃으로 버전 관리를 하다보면 각종 이슈가 자주 발목을 잡는다. 특히 복잡한 프로젝트의 경우 그 정도가 심한데&amp;hellip; 입사 이후 '지금까지 내가 한 건 깃이 아니구나&amp;rsquo;를 깨닫고 더 공부해 보기로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;parksb.github.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;&lt;a href=&quot;https://blog.naver.com/PostView.nhn?blogId=parkjy76&amp;amp;logNo=220308638231&amp;amp;categoryNo=73&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/PostView.nhn?blogId=parkjy76&amp;amp;logNo=220308638231&amp;amp;categoryNo=73&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740390386407&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;도식으로 보는 git-merge의 --ff, --no-ff, --squash의 차이점&quot; data-og-description=&quot;출처 : http://blog.sz21c.com/550 git&amp;nbsp;help로부터 인용먼저 git&amp;nbsp;help를 읽어보자 git&amp;nbsp;merg...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/PostView.nhn?blogId=parkjy76&amp;amp;logNo=220308638231&amp;amp;categoryNo=73&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot; data-og-url=&quot;https://blog.naver.com/parkjy76/220308638231&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/in08u/hyYjBNZdHe/KK82S2z7kimx0Dxq7m9p70/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://blog.naver.com/PostView.nhn?blogId=parkjy76&amp;amp;logNo=220308638231&amp;amp;categoryNo=73&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/PostView.nhn?blogId=parkjy76&amp;amp;logNo=220308638231&amp;amp;categoryNo=73&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/in08u/hyYjBNZdHe/KK82S2z7kimx0Dxq7m9p70/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270');&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;도식으로 보는 git-merge의 --ff, --no-ff, --squash의 차이점&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 : http://blog.sz21c.com/550 git&amp;nbsp;help로부터 인용먼저 git&amp;nbsp;help를 읽어보자 git&amp;nbsp;merg...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sanghye.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sanghye.tistory.com/43&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740390393440&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;[GIT] Git pull 전략 (default, --ff -only, --rebase)&quot; data-og-description=&quot;git pull 을 별도 옵션 없이 하게되면 다음과 같은 warning 이 발생하는 것을 볼 수 있습니다. warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the&quot; data-og-host=&quot;sanghye.tistory.com&quot; data-og-source-url=&quot;https://sanghye.tistory.com/43&quot; data-og-url=&quot;https://sanghye.tistory.com/43&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tJgvk/hyYjEjBm7O/Xl3wio2RuEMgfRVZmCUEX1/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540,https://scrap.kakaocdn.net/dn/bNgaaR/hyYjDZjQoL/1U0VWZBQPCPT5N9CMvNK7K/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540,https://scrap.kakaocdn.net/dn/ewKvZ/hyYjyjpqwx/1YoAp0xsLMeKiVw5JGqSe1/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540&quot;&gt;&lt;a href=&quot;https://sanghye.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sanghye.tistory.com/43&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tJgvk/hyYjEjBm7O/Xl3wio2RuEMgfRVZmCUEX1/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540,https://scrap.kakaocdn.net/dn/bNgaaR/hyYjDZjQoL/1U0VWZBQPCPT5N9CMvNK7K/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540,https://scrap.kakaocdn.net/dn/ewKvZ/hyYjyjpqwx/1YoAp0xsLMeKiVw5JGqSe1/img.png?width=540&amp;amp;height=540&amp;amp;face=0_0_540_540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[GIT] Git pull 전략 (default, --ff -only, --rebase)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;git pull 을 별도 옵션 없이 하게되면 다음과 같은 warning 이 발생하는 것을 볼 수 있습니다. warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sanghye.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;&lt;a href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740393613180&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;Git - Reset 명확히 알고 가기&quot; data-og-description=&quot;지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; data-og-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brrJLR/hyYjrdB2NP/7OaOfI2E3UENkqe01e4SrK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/bvWpNT/hyYfMDkGxb/UHXTDkDAIyGlGJKBqVjYhK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/gTfuA/hyYjAauR2M/hl9iAaTqjQ5YtHsSxsTNgk/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702&quot;&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brrJLR/hyYjrdB2NP/7OaOfI2E3UENkqe01e4SrK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/bvWpNT/hyYfMDkGxb/UHXTDkDAIyGlGJKBqVjYhK/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702,https://scrap.kakaocdn.net/dn/gTfuA/hyYjAauR2M/hl9iAaTqjQ5YtHsSxsTNgk/img.png?width=800&amp;amp;height=702&amp;amp;face=0_0_800_702');&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;Git - Reset 명확히 알고 가기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/153871&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/153871&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740464315922&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;05-04 merge 옵션 : --ff, --no-ff, --squash&quot; data-og-description=&quot;&amp;gt; *앞에서 dev1 브랜치의 작업 내용을 &amp;#96;git merge&amp;#96; 하였더니 fast-forward merge가 되면서 master에 dev1의 commit이 모두 합쳐졌다. &amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/153871&quot; data-og-url=&quot;https://wikidocs.net/153871&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lTM2B/hyYjMa8ZlN/EzqN2WWzCEu5b9YBnSsu01/img.png?width=100&amp;amp;height=114&amp;amp;face=0_0_100_114,https://scrap.kakaocdn.net/dn/bjVoGd/hyYjyjD2cL/da8ZHOLfT5tkT9GZxZwPx0/img.jpg?width=1438&amp;amp;height=491&amp;amp;face=0_0_1438_491,https://scrap.kakaocdn.net/dn/IkIM5/hyYjGoq6gt/X62kFTiI2mPMvUkWdrixv1/img.jpg?width=1439&amp;amp;height=487&amp;amp;face=0_0_1439_487&quot;&gt;&lt;a href=&quot;https://wikidocs.net/153871&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/153871&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lTM2B/hyYjMa8ZlN/EzqN2WWzCEu5b9YBnSsu01/img.png?width=100&amp;amp;height=114&amp;amp;face=0_0_100_114,https://scrap.kakaocdn.net/dn/bjVoGd/hyYjyjD2cL/da8ZHOLfT5tkT9GZxZwPx0/img.jpg?width=1438&amp;amp;height=491&amp;amp;face=0_0_1438_491,https://scrap.kakaocdn.net/dn/IkIM5/hyYjGoq6gt/X62kFTiI2mPMvUkWdrixv1/img.jpg?width=1439&amp;amp;height=487&amp;amp;face=0_0_1439_487');&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;05-04 merge 옵션 : --ff, --no-ff, --squash&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt; *앞에서 dev1 브랜치의 작업 내용을 `git merge` 하였더니 fast-forward merge가 되면서 master에 dev1의 commit이 모두 합쳐졌다. &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jusths.tistory.com/410&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jusths.tistory.com/410&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740470187639&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;git rebase vs. git pull &amp;mdash;rebase&quot; data-og-description=&quot;개요git pull &amp;mdash;rebase 를 쓰자 는 포스팅을 썼음에도 git rebase origin/develop 이라고 쓰고 있다는 것을 자각했다(Pull Request를 develop 브랜치로 하고 있다). 그리고, 이 둘의 차이가 무엇인지 명확히 알지 &quot; data-og-host=&quot;jusths.tistory.com&quot; data-og-source-url=&quot;https://jusths.tistory.com/410&quot; data-og-url=&quot;https://jusths.tistory.com/410&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n2Ty3/hyYjMhUHK9/xncHXC1T9Qtvq9c8UKMny0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gdp7p/hyYjDL3Qbt/J5GfPOpYGT9npYgCrtuDj1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b32ylP/hyYjDZApQL/B6kIPMbmRE5x7qYfx4myck/img.png?width=878&amp;amp;height=867&amp;amp;face=0_0_878_867&quot;&gt;&lt;a href=&quot;https://jusths.tistory.com/410&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jusths.tistory.com/410&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n2Ty3/hyYjMhUHK9/xncHXC1T9Qtvq9c8UKMny0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gdp7p/hyYjDL3Qbt/J5GfPOpYGT9npYgCrtuDj1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b32ylP/hyYjDZApQL/B6kIPMbmRE5x7qYfx4myck/img.png?width=878&amp;amp;height=867&amp;amp;face=0_0_878_867');&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;git rebase vs. git pull &amp;mdash;rebase&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요git pull &amp;mdash;rebase 를 쓰자 는 포스팅을 썼음에도 git rebase origin/develop 이라고 쓰고 있다는 것을 자각했다(Pull Request를 develop 브랜치로 하고 있다). 그리고, 이 둘의 차이가 무엇인지 명확히 알지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jusths.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;&lt;a href=&quot;https://velog.io/@heylub/Git-detached-HEAD-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@heylub/Git-detached-HEAD-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git &amp;zwj; </category>
      <category>--ff</category>
      <category>--no-ff</category>
      <category>--rebase</category>
      <category>--squash</category>
      <category>cherry-pick</category>
      <category>fast-forward</category>
      <category>Git</category>
      <category>head</category>
      <category>non-fast-forward</category>
      <category>Rebase</category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/75</guid>
      <comments>https://hortenssiaa.tistory.com/75#entry75comment</comments>
      <pubDate>Tue, 25 Feb 2025 17:17:58 +0900</pubDate>
    </item>
    <item>
      <title>[Project TIL 12일차]   랜덤 컬러 생성 앱 (feat. Clean Code  )</title>
      <link>https://hortenssiaa.tistory.com/73</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 키워드&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클린코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UIKit 기본 컴포넌트 활용 &lt;u&gt;&lt;b&gt;(코드베이스)&lt;/b&gt;&lt;/u&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;Auto layout&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UIColor, RGB 이해&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Simulator Screen Recording - iPhone 16 Pro - 2025-02-19 at 16.32.25.gif&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5kvEP/btsMpQ4yR4B/mt55mACNqLqHiJLkxXF8Ek/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5kvEP/btsMpQ4yR4B/mt55mACNqLqHiJLkxXF8Ek/img.gif&quot; data-alt=&quot;Random Color Generator App Demonstratoin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5kvEP/btsMpQ4yR4B/mt55mACNqLqHiJLkxXF8Ek/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/5kvEP/btsMpQ4yR4B/mt55mACNqLqHiJLkxXF8Ek/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;607&quot; data-filename=&quot;Simulator Screen Recording - iPhone 16 Pro - 2025-02-19 at 16.32.25.gif&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Random Color Generator App Demonstratoin&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Clean Code&lt;/b&gt;&lt;br /&gt;&lt;b&gt;: 읽기 쉬운 코드가 클린코드다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;#단순하고 직접적&amp;nbsp; &amp;nbsp; &amp;nbsp;#하나의 역할 수행&amp;nbsp; &amp;nbsp; &amp;nbsp;#모든 팀원이 이해가능한&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;I like my code to be &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;elegant and efficient&lt;/span&gt;.&lt;/b&gt;&lt;/span&gt;&amp;nbsp;The &lt;b&gt;logic&lt;/b&gt; should be &lt;b&gt;straightforward&lt;/b&gt; and &lt;b&gt;make it hard&lt;/b&gt; for &lt;b&gt;bugs to hide&lt;/b&gt;, the &lt;b&gt;dependencies minimal&lt;/b&gt; to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as &lt;u&gt;not to tempt&lt;/u&gt; people to make the code &lt;u&gt;messy&lt;/u&gt; with &lt;b&gt;unprincipled optimizations&lt;/b&gt;.&amp;nbsp;Clean code does &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt; &lt;/span&gt;&lt;u&gt;&lt;b&gt;one thing well&lt;/b&gt;&lt;/u&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt; &lt;/span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #666666;&quot;&gt;-&amp;nbsp;Bjarne Stroustrup, inventor of&amp;nbsp; C++&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;&amp;ldquo;&lt;/span&gt;Clean code is&amp;nbsp;&lt;b&gt;simple and direct.&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;&amp;nbsp;Clean code reads like well-written prose.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;Clean code &lt;b&gt;never obscures the designers&amp;rsquo; intent&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;&amp;nbsp;but rather is &lt;b&gt;full of crisp abstractions&lt;/b&gt; and &lt;b&gt;straightforward&lt;/b&gt; lines of control.&amp;rdquo;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;-&amp;nbsp;&lt;b&gt;Grady Booch&lt;/b&gt;, author of &amp;lsquo;Object-Oriented Analysis and Design with Applications&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로젝트 소개&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤 컬러 생성 앱은 &lt;u&gt;버튼을 클릭할 때마다&lt;/u&gt; &lt;u&gt;배경색이 랜덤하게 바뀌고&lt;/u&gt;, 현&lt;u&gt;재 색상의 RGB 값을 화면에 표시&lt;/u&gt;하는 간단한 iOS 앱이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;UIKit을 활용&lt;/u&gt;하여 기본 UI 컴포넌트와 사용자 이벤트를 다루는 연습을 해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요구사항&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;UI 구성 (코드베이스)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UIView: 화면 전체를 덮는 배경 영역&lt;/li&gt;
&lt;li&gt;UILable: 중앙에 RGB 값을 표시&lt;/li&gt;
&lt;li&gt;UIButton: 화면 하단에 두 개의 버튼 배치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Change Color&quot; button : 랜덤 색상 변경&lt;/li&gt;
&lt;li&gt;&quot;Reset&quot; button : 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;구현 기능&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;랜덤 색상 생성 : 버튼 클릭 시 배경색이 랜덤하게 변경됨&lt;/li&gt;
&lt;li&gt;색상 정보 표시 : 현재 화면 배경색의 RGB 값을 화면에 표시&lt;/li&gt;
&lt;li&gt;초기화 기능 : 초기화 버튼을 누르면 배경색이 흰색으로 변경되고, RGB 값도 초기화됨&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;핵심 코드&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 data-sourcepos=&quot;25:1-25:26&quot;&gt;randomly RGB 생성 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740034160651&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let randomRed = CGFloat.random(in: 0...1)
let randomGreen = CGFloat.random(in: 0...1)
let randomBlue = CGFloat.random(in: 0...1)
let randomColor = UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1.0)&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;Converting&amp;nbsp;CGFloat&amp;nbsp;value&amp;nbsp;to&amp;nbsp;RGB&amp;nbsp;value&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740034228074&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let redValue = Int(randomRed * 255)
let greenValue = Int(randomGreen * 255)
let blueValue = Int(randomBlue * 255)&lt;/code&gt;&lt;/pre&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; &amp;nbsp;Configuration&amp;nbsp;of&amp;nbsp;class&amp;nbsp;SceneDelegate&amp;nbsp;for&amp;nbsp;Programmatically&amp;nbsp;creating&amp;nbsp;UI&amp;nbsp; 
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;delete storyboard file&amp;nbsp; &lt;br /&gt;: Main.storyboard &amp;gt; Delete (Move to Trash)&lt;/li&gt;
&lt;li&gt;delete&amp;nbsp;storyboard&amp;nbsp;file&amp;nbsp;in&amp;nbsp;info.plist&amp;nbsp;&lt;br /&gt;: RandomColorGenerator (project name) &amp;gt; TARGETS &amp;gt; RandomColorGenerator &amp;gt; Build Settings &amp;gt; search &quot;info.plist&quot; &amp;gt; Delete &quot;UIKit Main Storyboard File Base Name&quot;&lt;/li&gt;
&lt;li&gt;delete&amp;nbsp;storyboard&amp;nbsp;name&amp;nbsp;in&amp;nbsp;Info.plist&amp;nbsp;&lt;br /&gt;:&amp;nbsp;RandomColorGenerator&amp;nbsp;(project&amp;nbsp;name)&amp;nbsp;&amp;gt;&amp;nbsp;folder&amp;nbsp;&quot;RandomColorGenerator&quot;&amp;nbsp;&amp;gt;&amp;nbsp;file&amp;nbsp;&quot;Info.plist&quot;&amp;nbsp;&amp;gt;&amp;nbsp;Infomation&amp;nbsp;Property&amp;nbsp;List&amp;nbsp;&amp;gt;&amp;nbsp;...&amp;nbsp;&amp;gt;&amp;nbsp;delete&amp;nbsp;&quot;Storyboard&amp;nbsp;Name&quot;&lt;/li&gt;
&lt;li&gt;modificate&amp;nbsp;file&amp;nbsp;&quot;SceneDelegate.swift&quot;&amp;nbsp;(code&amp;nbsp;below)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740052648361&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard⭐️, the `window` property will automatically be initialized⭐️ and attached⭐️ to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        // willconnectTo() : 사용자가 앱을 처음 시작할 때, 앱의 첫 화면을 설정하는 코드

        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        let window = UIWindow(windowScene: windowScene)
        let vc = RandomColorViewController() // 첫 화면의 viewcontroller file name
        window.rootViewController = vc
        self.window = window
        window.makeKeyAndVisible()
    }

    ...
}&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; Lable Color:&amp;nbsp;&lt;b&gt;Default color&lt;/b&gt; vs. Black/White color&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default color가 &lt;u&gt;다크모드 대응&lt;/u&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;UIColor vs. RGB&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Project Code&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Gitub] Random Color Generator App&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&quot;&gt;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740035739490&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;SpartaCamp-iOS/[사전학습1] RandomColorGenerator at main &amp;middot; hortenssiaa/SpartaCamp-iOS&quot; data-og-description=&quot;Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&quot; data-og-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hortenssiaa/SpartaCamp-iOS/tree/main/%5B%EC%82%AC%EC%A0%84%ED%95%99%EC%8A%B51%5D%20RandomColorGenerator&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;SpartaCamp-iOS/[사전학습1] RandomColorGenerator at main &amp;middot; hortenssiaa/SpartaCamp-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to hortenssiaa/SpartaCamp-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.samsungsds.com/kr/insights/cleancode-0823.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.samsungsds.com/kr/insights/cleancode-0823.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739858534971&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;클린코드란 무엇인가? | 인사이트리포트 | 삼성SDS&quot; data-og-description=&quot;개발자라면 누구나 한 번쯤은 고민해 봤을 만한 클린코드 클린코드란 무엇이고, 클린코드를 작성하기 위한 원칙들은 어떤 것들이 있는지 알아보겠습니다.&quot; data-og-host=&quot;www.samsungsds.com&quot; data-og-source-url=&quot;https://www.samsungsds.com/kr/insights/cleancode-0823.html&quot; data-og-url=&quot;https://www.samsungsds.com/kr/insights/cleancode-0823.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIMh7d/hyYfDZ0Qhx/MtfTmgf8D77eI3uwKHM04k/img.png?width=900&amp;amp;height=599&amp;amp;face=0_0_900_599,https://scrap.kakaocdn.net/dn/tKr4t/hyYjtg968H/XtwNvlB7fakIrC4ZBD6tt0/img.png?width=900&amp;amp;height=599&amp;amp;face=0_0_900_599,https://scrap.kakaocdn.net/dn/jlW3J/hyYfDyWsKv/aJ2jgccAlbvXCgCeTiAx21/img.png?width=767&amp;amp;height=440&amp;amp;face=0_0_767_440&quot;&gt;&lt;a href=&quot;https://www.samsungsds.com/kr/insights/cleancode-0823.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.samsungsds.com/kr/insights/cleancode-0823.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIMh7d/hyYfDZ0Qhx/MtfTmgf8D77eI3uwKHM04k/img.png?width=900&amp;amp;height=599&amp;amp;face=0_0_900_599,https://scrap.kakaocdn.net/dn/tKr4t/hyYjtg968H/XtwNvlB7fakIrC4ZBD6tt0/img.png?width=900&amp;amp;height=599&amp;amp;face=0_0_900_599,https://scrap.kakaocdn.net/dn/jlW3J/hyYfDyWsKv/aJ2jgccAlbvXCgCeTiAx21/img.png?width=767&amp;amp;height=440&amp;amp;face=0_0_767_440');&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;클린코드란 무엇인가? | 인사이트리포트 | 삼성SDS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발자라면 누구나 한 번쯤은 고민해 봤을 만한 클린코드 클린코드란 무엇이고, 클린코드를 작성하기 위한 원칙들은 어떤 것들이 있는지 알아보겠습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.samsungsds.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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;  UIKit 코드베이스 프로젝트 세팅  &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739863461083&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] UIKit 코드베이스 프로젝트 세팅&quot; data-og-description=&quot;안녕하세요 띵지니어   입니다.이번 포스팅은 UIKit 프레임 워크에 스토리보드를 사용하지 않고코드 베이스 로 프로젝트를 진행해야 할 때초기 세팅을 어떻게 해야 하는지에 대해 알아보도록 &quot; data-og-host=&quot;thingjin.tistory.com&quot; data-og-source-url=&quot;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&quot; data-og-url=&quot;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JY7oi/hyYjsCzpIk/NK9bkMhKjYvZBFAH5bYSY0/img.png?width=640&amp;amp;height=616&amp;amp;face=0_0_640_616,https://scrap.kakaocdn.net/dn/f8rRM/hyYjnOMWrY/FNKEF0mt6r7xcRbcbPFevk/img.png?width=640&amp;amp;height=616&amp;amp;face=0_0_640_616,https://scrap.kakaocdn.net/dn/cyyqdh/hyYjgWqYPC/C7mMZ6UBwG3W1NduG0TWb1/img.png?width=1346&amp;amp;height=560&amp;amp;face=0_0_1346_560&quot;&gt;&lt;a href=&quot;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thingjin.tistory.com/entry/UIKit-%EC%BD%94%EB%93%9C%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JY7oi/hyYjsCzpIk/NK9bkMhKjYvZBFAH5bYSY0/img.png?width=640&amp;amp;height=616&amp;amp;face=0_0_640_616,https://scrap.kakaocdn.net/dn/f8rRM/hyYjnOMWrY/FNKEF0mt6r7xcRbcbPFevk/img.png?width=640&amp;amp;height=616&amp;amp;face=0_0_640_616,https://scrap.kakaocdn.net/dn/cyyqdh/hyYjgWqYPC/C7mMZ6UBwG3W1NduG0TWb1/img.png?width=1346&amp;amp;height=560&amp;amp;face=0_0_1346_560');&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] UIKit 코드베이스 프로젝트 세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 띵지니어   입니다.이번 포스팅은 UIKit 프레임 워크에 스토리보드를 사용하지 않고코드 베이스 로 프로젝트를 진행해야 할 때초기 세팅을 어떻게 해야 하는지에 대해 알아보도록&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thingjin.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;&lt;a href=&quot;http://baked-corn.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://baked-corn.tistory.com/36&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739867373876&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] Auto Layout Programmatically - 1&quot; data-og-description=&quot;Auto Layout Programmatically 처음 iOS 개발을 시작할 때 UI를 구성하는 가장 좋은 방법은 storyboard를 사용하는 것입니다. 위치를 잡기 쉽고 육안으로 확인을 할 수 있기 때문입니다. 저 역시 계속해서 story&quot; data-og-host=&quot;baked-corn.tistory.com&quot; data-og-source-url=&quot;http://baked-corn.tistory.com/36&quot; data-og-url=&quot;https://baked-corn.tistory.com/36&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MMRpT/hyYfMJso5A/oTUjCqfKXdUQhi2SCvPaB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cOkzL1/hyYf3do0Cn/pkOEscipJblGlrTObuK9OK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;http://baked-corn.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://baked-corn.tistory.com/36&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MMRpT/hyYfMJso5A/oTUjCqfKXdUQhi2SCvPaB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cOkzL1/hyYf3do0Cn/pkOEscipJblGlrTObuK9OK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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] Auto Layout Programmatically - 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Auto Layout Programmatically 처음 iOS 개발을 시작할 때 UI를 구성하는 가장 좋은 방법은 storyboard를 사용하는 것입니다. 위치를 잡기 쉽고 육안으로 확인을 할 수 있기 때문입니다. 저 역시 계속해서 story&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;baked-corn.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;NSLayoutConstraint Refactoring&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739867845819&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;Working With Auto Layout and Layout Anchors&quot; data-og-description=&quot;Creating layout constraints in code is not pretty. It is not always intuitive and it is verbose, even if you decide to use Apple's Visual Format Language.&quot; data-og-host=&quot;cocoacasts.com&quot; data-og-source-url=&quot;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&quot; data-og-url=&quot;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cocoacasts.com/working-with-auto-layout-and-layout-anchors/&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;Working With Auto Layout and Layout Anchors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Creating layout constraints in code is not pretty. It is not always intuitive and it is verbose, even if you decide to use Apple's Visual Format Language.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cocoacasts.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@eunddodi/git-pull-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-warning-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0Need-to-specify-how-to-reconcile-divergent-branches&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@eunddodi/git-pull-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-warning-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0Need-to-specify-how-to-reconcile-divergent-branches&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739954313256&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;git pull 시 발생하는 warning 해결하기(Need to specify how to reconcile divergent branches)&quot; data-og-description=&quot;각 옵션의 의미를 알아보고, 설정까지 해보자.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@eunddodi/git-pull-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-warning-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0Need-to-specify-how-to-reconcile-divergent-branches&quot; data-og-url=&quot;https://velog.io/@eunddodi/git-pull-시-발생하는-warning-해결하기Need-to-specify-how-to-reconcile-divergent-branches&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Gx7Tv/hyYfVfuDCo/Lmpo6l1OKgSzRowRvqw6b0/img.png?width=1536&amp;amp;height=804&amp;amp;face=0_0_1536_804,https://scrap.kakaocdn.net/dn/bmMh7q/hyYfVNj9ie/4Jppd2j3KgVoOCLxnv2LZ0/img.png?width=1536&amp;amp;height=804&amp;amp;face=0_0_1536_804,https://scrap.kakaocdn.net/dn/k0hYs/hyYf5oTFbH/fJzhrEzCqMVLOUvhg70VH1/img.jpg?width=1200&amp;amp;height=1176&amp;amp;face=0_0_1200_1176&quot;&gt;&lt;a href=&quot;https://velog.io/@eunddodi/git-pull-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-warning-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0Need-to-specify-how-to-reconcile-divergent-branches&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@eunddodi/git-pull-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-warning-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0Need-to-specify-how-to-reconcile-divergent-branches&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Gx7Tv/hyYfVfuDCo/Lmpo6l1OKgSzRowRvqw6b0/img.png?width=1536&amp;amp;height=804&amp;amp;face=0_0_1536_804,https://scrap.kakaocdn.net/dn/bmMh7q/hyYfVNj9ie/4Jppd2j3KgVoOCLxnv2LZ0/img.png?width=1536&amp;amp;height=804&amp;amp;face=0_0_1536_804,https://scrap.kakaocdn.net/dn/k0hYs/hyYf5oTFbH/fJzhrEzCqMVLOUvhg70VH1/img.jpg?width=1200&amp;amp;height=1176&amp;amp;face=0_0_1200_1176');&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;git pull 시 발생하는 warning 해결하기(Need to specify how to reconcile divergent branches)&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;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;</description>
      <category>iOS </category>
      <category>cleancode</category>
      <category>uikit</category>
      <category>코드베이스</category>
      <category>클린코드</category>
      <author>쿰!쿰쿰쿰!</author>
      <guid isPermaLink="true">https://hortenssiaa.tistory.com/73</guid>
      <comments>https://hortenssiaa.tistory.com/73#entry73comment</comments>
      <pubDate>Thu, 20 Feb 2025 15:57:16 +0900</pubDate>
    </item>
  </channel>
</rss>