<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Tobi Lee</title>
    <link>https://tobilee1011.tistory.com/</link>
    <description>tobilee1011@gmail.com
</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 10:23:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>tobilee1011</managingEditor>
    <image>
      <title>Tobi Lee</title>
      <url>https://tistory1.daumcdn.net/tistory/5488192/attach/73dba2e1ce774502974c04026fc8965a</url>
      <link>https://tobilee1011.tistory.com</link>
    </image>
    <item>
      <title>OpenCV 픽셀 접근 속도 테스트</title>
      <link>https://tobilee1011.tistory.com/36</link>
      <description>&lt;h1&gt;OpenCV 픽셀 접근 속도 테스트&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;픽셀단위에 접근하여 연산할 때 가장 어떤 방법이 가장 빠른가?&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론 :&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순차처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;atFunc : 2.0873msec.&lt;/li&gt;
&lt;li&gt;dataPtr : 1.4164msec.&lt;/li&gt;
&lt;li&gt;ptrFunc : 1.1877msec.&lt;/li&gt;
&lt;li&gt;ptr++ : 0.2126msec.&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;parallel_for dataPtr : 0.393msec.&lt;/li&gt;
&lt;li&gt;parallel_for ptr: 0.2211msec.&lt;/li&gt;
&lt;li&gt;parallel_for Optimize: 0.0557msec.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;```cpp

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &quot;opencv2/opencv.hpp&quot;
#include &amp;lt;ppl.h&amp;gt;

int main()
{
    //화면을 표시할 윈도우 설정
    std::string wndName = &quot;Color Test&quot;;
    namedWindow(wndName, cv::WINDOW_NORMAL);
    cv::setWindowTitle(wndName, &quot;Color Test&quot;);

    //mnms이미지 불러오기
    cv::Mat OriginImg = cv::imread(&quot;../images/mnms.png&quot;,cv::IMREAD_GRAYSCALE);
    cv::Mat TestImg = OriginImg;

    //원본 이미지 출력
    cv::imshow(wndName, OriginImg);
    cv::waitKey(0);
    cv::destroyWindow(wndName);

    //이미지의 모든 픽셀을 순회할 때 소요된 시간을 측정해본다.

    //시작,종료 시간을 기록하기 위한 timer
    cv::TickMeter tm;

#pragma region atFunc
    tm.reset();
    tm.start();
    for (int y = 0; y &amp;lt; TestImg.rows; ++y)
    {
        for (int x = 0; x &amp;lt; TestImg.cols; ++x)
        {
            uchar val = TestImg.at&amp;lt;uchar&amp;gt;(y, x);
            TestImg.at&amp;lt;uchar&amp;gt;(y, x) = val + 1;
        }
    }
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;atFunc : &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region dataPtr
    tm.reset();
    tm.start();

    uchar* pTestImg = TestImg.data;
    for (int y = 0; y &amp;lt; TestImg.rows; ++y)
    {
        for (int x = 0; x &amp;lt; TestImg.cols; ++x)
        {
            uchar val = pTestImg[TestImg.rows * y + x];
            pTestImg[x] = val + 1;
        }
    }
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;dataPtr : &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region ptr
    tm.reset();
    tm.start();

    for (int y = 0; y &amp;lt; TestImg.rows; ++y)
    {
        //Test이미지의 행의 시작 주소를 가져옴
        uchar* pImg = TestImg.ptr&amp;lt;uchar&amp;gt;(y);

        //행의 시작에서 하나씩 증분하여 한 행의 끝까지 데이터 탐색
        for (int x = 0; x &amp;lt; TestImg.cols; ++x)
        {
            uchar val = pImg[x];
            pImg[x] = val + 1;
        }
    }
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;ptrFunc : &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region ptr++
    tm.reset();
    tm.start();

    for (int y = 0; y &amp;lt; TestImg.rows; ++y)
    {
        //Test이미지의 행의 시작 주소를 가져옴
        uchar* pSrc = TestImg.ptr&amp;lt;uchar&amp;gt;(y);

        //Test이미지의 행의 마지막 주소를 가져옴
        uchar* pSrc_end = pSrc + TestImg.cols;

        //한행의 끝이 나올때까지 반복
        for (; pSrc &amp;lt; pSrc_end;)
        {
            uchar val = *pSrc;
            //후치 연산자로 val값 업데이트 후 포인터 위치변경
            *pSrc++ = val + 1;
        }
    }  
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;ptr++ : &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region parallel_for dataPtr
    tm.reset();
    tm.start();
    uchar* pSrc = TestImg.data;
    Concurrency::parallel_for(int(0), TestImg.rows, [&amp;amp;](int y)
    {
        for (int x = 0; x &amp;lt; TestImg.cols; ++x) {
            uchar val = pSrc[TestImg.cols * y + x];
            pSrc[TestImg.cols * y + x] = val + 1;
        }
    });
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;parallel_for dataPtr : &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region parallel_for ptr
    tm.reset();
    tm.start();
    Concurrency::parallel_for(int(0), TestImg.rows, [&amp;amp;](int y)
    {
        uchar* pSrc = TestImg.ptr&amp;lt;uchar&amp;gt;(y);
        for (int x = 0; x &amp;lt; TestImg.cols; ++x) {
            uchar val = pSrc[x];
            pSrc[x] = val + 1;
        }
    });
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;parallel_for ptr: &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

#pragma region parallel_for ptr++
    tm.reset();
    tm.start();
    concurrency::parallel_for(int(0), TestImg.rows, [&amp;amp;](int y)
    {
        uchar* pSrc = TestImg.ptr&amp;lt;uchar&amp;gt;(y);
        uchar* pSrc_end = pSrc + TestImg.cols;
        for (; pSrc &amp;lt; pSrc_end;) {
            uchar val = *pSrc;
            *pSrc++ = val + 1;
        }
    });
    tm.stop();
    std::cout &amp;lt;&amp;lt; &quot;parallel_for Optimize: &quot; &amp;lt;&amp;lt; tm.getTimeMilli() &amp;lt;&amp;lt; &quot;msec.&quot; &amp;lt;&amp;lt; std::endl;
#pragma endregion

    return 0;
}
```&lt;/code&gt;&lt;/pre&gt;</description>
      <category>OpenCV</category>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/36</guid>
      <comments>https://tobilee1011.tistory.com/36#entry36comment</comments>
      <pubDate>Sat, 11 May 2024 15:04:14 +0900</pubDate>
    </item>
    <item>
      <title>OpenCV를 Visual Studio에서 사용하기 위한 기본 Setting 과정</title>
      <link>https://tobilee1011.tistory.com/35</link>
      <description>&lt;h1&gt;OpenCV 기본 세팅 Setting&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenCV를 Visual Studio에서 사용하기 위한 기본 Setting 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※opencv 설치 경로 : C:\&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※opencv 버전 : opencv-4.8.0-windows&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;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxcdia/btsHlFgvQnw/LYtKlxpB0ScLRRSD94D9tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxcdia/btsHlFgvQnw/LYtKlxpB0ScLRRSD94D9tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxcdia/btsHlFgvQnw/LYtKlxpB0ScLRRSD94D9tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxcdia%2FbtsHlFgvQnw%2FLYtKlxpB0ScLRRSD94D9tK%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;941&quot; height=&quot;653&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아래와 같이 소스파일 폴더 아래 Main.cpp 파일을 하나 생성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyYfr3/btsHnvpXlV7/hN0wA4chns7yDoKkj86gT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyYfr3/btsHnvpXlV7/hN0wA4chns7yDoKkj86gT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyYfr3/btsHnvpXlV7/hN0wA4chns7yDoKkj86gT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyYfr3%2FbtsHnvpXlV7%2FhN0wA4chns7yDoKkj86gT1%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;405&quot; height=&quot;251&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): &lt;b&gt;모든구성&lt;/b&gt;, 플랫폼(P) : &lt;b&gt;x64&lt;/b&gt; 로 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b88YU0/btsHngs4PcS/jbptvNgzKKjHetPpJbwfC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b88YU0/btsHngs4PcS/jbptvNgzKKjHetPpJbwfC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b88YU0/btsHngs4PcS/jbptvNgzKKjHetPpJbwfC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb88YU0%2FbtsHngs4PcS%2FjbptvNgzKKjHetPpJbwfC0%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;849&quot; height=&quot;603&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;opencv가 설치된 경로를 추가한다. 공통설정&lt;img src=&quot;https://blog.kakaocdn.net/dn/cslm8E/btsHlFnj1Dc/7SC4ACueasIKWOy2S2UDNK/img.png&quot; width=&quot;100%&quot; /&gt;4-3. 디버깅항목에 환경에 DLL경로를 입력 &lt;b&gt;PATH = C:\opencv\build\x64\vc16\bin;%PATH%&lt;/b&gt;4-4. 구성-Debug 추가종속성에 &lt;b&gt;opencv_world480d.lib&lt;/b&gt; 입력&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgLaP/btsHnV9MWMr/HKSxhboDYeiv1riSa0WGek/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwwBVW/btsHl9hjOdE/3RIsvS5bHtOad8owlCfRC1/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfI0xg/btsHnHcI0P1/Mxfnml3pOIev08L9frXtP0/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;4-2. 링커의 추가 라이브러리 디렉터리에 &lt;b&gt;C:\OpenCV\build\x64\vc16\lib&lt;/b&gt; 입력 : 링커를 포함시킴&lt;/li&gt;
&lt;li&gt;4-1. C/C++의 추가 포함 디렉터리에 &lt;b&gt;C:\opencv\build\include&lt;/b&gt; 입력 : 헤더파일을 포함하는 것&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): &lt;b&gt;Debug&lt;/b&gt;, 플랫폼(P) : &lt;b&gt;x64&lt;/b&gt; 로 설정&lt;img src=&quot;https://blog.kakaocdn.net/dn/bINEip/btsHmTkTInf/Fl5K8JeiKFbfyPKeTijuj1/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;5-1. 추가 종속성 항목에 &lt;b&gt;opencv_world480d.lib&lt;/b&gt; 입력&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): &lt;b&gt;Release&lt;/b&gt;, 플랫폼(P) : &lt;b&gt;x64&lt;/b&gt; 로 설정&lt;img src=&quot;https://blog.kakaocdn.net/dn/bocEWe/btsHmwcjaOU/LO2EhcWCNvXnBjtAovKfjK/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;6-1. 추가 종속성 항목에 &lt;b&gt;opencv_world480.lib&lt;/b&gt; 입력&lt;/li&gt;
&lt;li&gt;정상적으로 세팅이 되었는지 샘플코드 입력 후 빌드/실행하여 확인한다.&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIeiio/btsHmCjsaDO/KvWW4KpjGgIyGYG25fOK9k/img.png&quot; width=&quot;100%&quot; /&gt;7-3. 샘플코드&lt;/li&gt;
&lt;li&gt;&lt;code&gt; /**
   @file videocapture_basic.cpp
   @brief A very basic sample for using VideoCapture and VideoWriter
   @author PkLab.net
   @date Aug 24, 2016
 */

 #include &amp;lt;opencv2/core.hpp&amp;gt;
 #include &amp;lt;opencv2/videoio.hpp&amp;gt;
 #include &amp;lt;opencv2/highgui.hpp&amp;gt;
 #include &amp;lt;iostream&amp;gt;
 #include &amp;lt;stdio.h&amp;gt;

 using namespace cv;
 using namespace std;

 int main(int, char**)
 {
     Mat frame;
     //--- INITIALIZE VIDEOCAPTURE
     VideoCapture cap;
     // open the default camera using default API
     // cap.open(0);
     // OR advance usage: select any API backend
     int deviceID = 0;             // 0 = open default camera
     int apiID = cv::CAP_ANY;      // 0 = autodetect default API
     // open selected camera using selected API
     cap.open(deviceID, apiID);
     // check if we succeeded
     if (!cap.isOpened()) {
         cerr &amp;lt;&amp;lt; &quot;ERROR! Unable to open camera\n&quot;;
         return -1;
     }

     //--- GRAB AND WRITE LOOP
     cout &amp;lt;&amp;lt; &quot;Start grabbing&quot; &amp;lt;&amp;lt; endl
         &amp;lt;&amp;lt; &quot;Press any key to terminate&quot; &amp;lt;&amp;lt; endl;
     for (;;)
     {
         // wait for a new frame from camera and store it into 'frame'
         cap.read(frame);
         // check if we succeeded
         if (frame.empty()) {
             cerr &amp;lt;&amp;lt; &quot;ERROR! blank frame grabbed\n&quot;;
             break;
         }
         // show live and wait for a key with timeout long enough to show images
         imshow(&quot;Live&quot;, frame);
         if (waitKey(5) &amp;gt;= 0)
             break;
     }
     // the camera will be deinitialized automatically in VideoCapture destructor
     return 0;
 }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9SxCq/btsHmv5A68v/KtopvrPMxBPOGSZV7XpzmK/img.png&quot; width=&quot;100%&quot; /&gt;&lt;/li&gt;
&lt;li&gt;7-2. 활성상태를 Release, x64로 설정 후 빌드&lt;/li&gt;
&lt;li&gt;7-1. 활성상태를 Debug, x64로 설정 후 빌드&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>OpenCV</category>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/35</guid>
      <comments>https://tobilee1011.tistory.com/35#entry35comment</comments>
      <pubDate>Sat, 11 May 2024 12:55:32 +0900</pubDate>
    </item>
    <item>
      <title>Landmarks PJT - 보기 생성 및 결합</title>
      <link>https://tobilee1011.tistory.com/33</link>
      <description>&lt;h1&gt;Landmarks PJT - 보기 생성 및 결합&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;섹션 1. 새 프로젝트 생성 및 캔버스 탐색&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SwiftUI 인터페이스와 Swift 언어를 통해 Landmarks 프로젝트를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Landmarks 프로젝트를 처음 생성하면 &lt;code&gt;**LandmarksApp.swift**&lt;/code&gt; 와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;Content
View.swift&lt;/code&gt;&lt;/b&gt; 파일이 생성되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**LandmarksApp.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;d&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

@main // 랜드마크라는 앱을 실행시키면 시작되는 프로그램의 진입점이다. 
struct LandmarksApp: App // 랜드마크앱은 App의 앱구조를 가진다.
{ 
    var body: some Scene // 몸체는 몇개의 씬으로 구성되는데 
        {
        WindowGroup // 그룹내의 뷰 코드를 실행하게 된다.
                {
            ContentView() // 컨텐츠 뷰 코드를 실행해라.
        }
    }
}&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;code&gt;**ContentView.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
        Text(&quot;Hello, world!&quot;) // 헬로우 월드를 띄워라 
            .padding() // 패딩 좌우간격을 줘라
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체 
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리보기 화면이 아래와 같이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QrRgL/btsHcqKUxpZ/5xUuRwSBUibyyJZbMbyOUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QrRgL/btsHcqKUxpZ/5xUuRwSBUibyyJZbMbyOUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QrRgL/btsHcqKUxpZ/5xUuRwSBUibyyJZbMbyOUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQrRgL%2FbtsHcqKUxpZ%2F5xUuRwSBUibyyJZbMbyOUK%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;570&quot; height=&quot;1010&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;섹션 2. 텍스트 사용자 정의&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리보기 화면에서 커맨드 키를 누르고 Helloworld를 클릭하면 아래와 같은 화면이 나오는데 Show SwiftUI Inspector를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 표시할 텍스트를 바꿀 수 있고, 폰트관련 설정, 패딩, 외곽선등을 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 창에서 설정을 수정하면 자동으로 코드에 반영된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 1.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDgaAm/btsHfY7mUJu/1Fm1fkWfWDKbt9TpCxuH61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDgaAm/btsHfY7mUJu/1Fm1fkWfWDKbt9TpCxuH61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDgaAm/btsHfY7mUJu/1Fm1fkWfWDKbt9TpCxuH61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDgaAm%2FbtsHfY7mUJu%2F1Fm1fkWfWDKbt9TpCxuH61%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;730&quot; height=&quot;1346&quot; data-filename=&quot;Untitled 1.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;1346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 2.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lj4fJ/btsHgqJbEyX/PGHqyoV0mBTho8YwbW56tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lj4fJ/btsHgqJbEyX/PGHqyoV0mBTho8YwbW56tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lj4fJ/btsHgqJbEyX/PGHqyoV0mBTho8YwbW56tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flj4fJ%2FbtsHgqJbEyX%2FPGHqyoV0mBTho8YwbW56tK%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;1052&quot; height=&quot;1306&quot; data-filename=&quot;Untitled 2.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역으로 코드상에서도 동일하게 수정하면 코드에 반영이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 3.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qK06I/btsHecZpBo9/SUbjygyd6TYFj9AyA8hcZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qK06I/btsHecZpBo9/SUbjygyd6TYFj9AyA8hcZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qK06I/btsHecZpBo9/SUbjygyd6TYFj9AyA8hcZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqK06I%2FbtsHecZpBo9%2FSUbjygyd6TYFj9AyA8hcZ0%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;930&quot; height=&quot;1034&quot; data-filename=&quot;Untitled 3.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 4.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFBAM/btsHgBjyRt8/gzGoXLUpqy3xLj9ciWLKj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFBAM/btsHgBjyRt8/gzGoXLUpqy3xLj9ciWLKj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFBAM/btsHgBjyRt8/gzGoXLUpqy3xLj9ciWLKj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFBAM%2FbtsHgBjyRt8%2FgzGoXLUpqy3xLj9ciWLKj1%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;1170&quot; height=&quot;1296&quot; data-filename=&quot;Untitled 4.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**ContentView.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
            Text(&quot;Turtle Rock&quot;) // 헬로우 월드를 띄워라
                **.font(.title)   // 폰트는 타이틀 폰트를 사용해라 
                .foregroundColor(Color.green)   // 폰트 색상은 그린
                .multilineTextAlignment(.center) // 가운데 정렬
                .padding() // 패딩 좌우간격을 줘라**
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;섹션3. 스택으로 보기 결합하기&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 묶음의 텍스트를 세로 방향으로 쌓고 싶을 때 : VStack&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**ContentView.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
            **VStack** // 텍스트를 세로방향으로 쌓는다.
            {
                Text(&quot;Turtle Rock&quot;) // 보여줄 텍스트 : 터틀락
                    .font(.title) // 타이틀 폰트를 사용한다.

                Text(&quot;Joshua Tree National Park&quot;) // 보여줄 텍스트
                    .font(.subheadline) // 폰트

                Text(&quot;California&quot;) // 보여줄 텍스트
                    .font(.subheadline) // 폰트

            }
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&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;Untitled 5.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7adaU/btsHeYmnHL8/eiGq4yZiFRE41Y8OOenaZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7adaU/btsHeYmnHL8/eiGq4yZiFRE41Y8OOenaZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7adaU/btsHeYmnHL8/eiGq4yZiFRE41Y8OOenaZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7adaU%2FbtsHeYmnHL8%2FeiGq4yZiFRE41Y8OOenaZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;1022&quot; data-filename=&quot;Untitled 5.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 묶음의 텍스트를 가로 방향으로 쌓고 싶을 때 : HStack&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**ContentView.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
            **HStack** // 텍스트를 세로방향으로 쌓는다.
            {
                Text(&quot;Turtle Rock&quot;) // 보여줄 텍스트 : 터틀락
                    .font(.title) // 타이틀 폰트를 사용한다.

                Text(&quot;Joshua Tree National Park&quot;) // 보여줄 텍스트
                    .font(.subheadline) // 폰트

                Text(&quot;California&quot;) // 보여줄 텍스트
                    .font(.subheadline) // 폰트

            }
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&lt;/code&gt;&lt;/pre&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;Untitled 6.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSVAND/btsHcqRH7Lo/gWPOFBOQdF4ZLx7Orq5A91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSVAND/btsHcqRH7Lo/gWPOFBOQdF4ZLx7Orq5A91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSVAND/btsHcqRH7Lo/gWPOFBOQdF4ZLx7Orq5A91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSVAND%2FbtsHcqRH7Lo%2FgWPOFBOQdF4ZLx7Orq5A91%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;618&quot; height=&quot;1032&quot; data-filename=&quot;Untitled 6.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VStack 과 HStack 을 모두 사용하여 이쁘게 만들어 보자.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;import SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
            VStack(alignment: .leading) // 텍스트를 세로방향으로 쌓는다.(좌로 정렬)
            {
                Text(&quot;Turtle Rock&quot;) // 보여줄 텍스트 : 터틀락
                    .font(.title) // 타이틀 폰트를 사용한다.

                HStack
                {
                    Text(&quot;Joshua Tree National Park&quot;) // 보여줄 텍스트
                        .font(.subheadline) // 폰트

                    Spacer() // 공원과 주 사이에 공간을 채워넣음

                    Text(&quot;California&quot;) // 보여줄 텍스트
                        .font(.subheadline) // 폰트
                }
            }
            .padding() // 공원과 주를 분리할 때 너무 화면 끝으로 가버려서 약간의 공간을 줌
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&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;Untitled 7.png&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2urjl/btsHgBRowT7/GZ8qKeKnRnzPz7EQOGXwZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2urjl/btsHgBRowT7/GZ8qKeKnRnzPz7EQOGXwZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2urjl/btsHgBRowT7/GZ8qKeKnRnzPz7EQOGXwZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2urjl%2FbtsHgBRowT7%2FGZ8qKeKnRnzPz7EQOGXwZ0%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;548&quot; height=&quot;1042&quot; data-filename=&quot;Untitled 7.png&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;섹션4. 사용자 정의 이미지 보기 생성&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets에 이미지를 드래그앤 드랍으로 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 8.png&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLpYUe/btsHctOo4Ie/5PduY4025vdoGafKeKHtH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLpYUe/btsHctOo4Ie/5PduY4025vdoGafKeKHtH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLpYUe/btsHctOo4Ie/5PduY4025vdoGafKeKHtH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLpYUe%2FbtsHctOo4Ie%2F5PduY4025vdoGafKeKHtH1%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;2282&quot; height=&quot;1062&quot; data-filename=&quot;Untitled 8.png&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CircleImage.swift 라는 새로운 SwiftUI를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled 9.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXgPQZ/btsHfCJ7zUP/1A92AS4lI6IKNEKUPuK1u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXgPQZ/btsHfCJ7zUP/1A92AS4lI6IKNEKUPuK1u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXgPQZ/btsHfCJ7zUP/1A92AS4lI6IKNEKUPuK1u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXgPQZ%2FbtsHfCJ7zUP%2F1A92AS4lI6IKNEKUPuK1u1%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;1536&quot; height=&quot;1084&quot; data-filename=&quot;Untitled 9.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1084&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 불러오고 원형으로 자르고 각종 이펙트를 넣는다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;import SwiftUI

struct CircleImage: View
{
    var body: some View
    {
        Image(&quot;turtlerock&quot;) // 터틀락 이미지를 불러온다.
            .clipShape(Circle()) // 이미지를 원형으로 자른다.
            .overlay // 이미지에 덮어씌운다.
            {
                Circle() // 원을 덮어씌운다.
                    .stroke(.gray, lineWidth: 4) 
                                        // 속이 빈 원을 만드는데, 선 색깔과 두께를 설정한다.

                    // 흰색 테두리를 설정하려면 아래 코드 사용
                    // .stroke(.white, lineWidth: 4)

            }
            .shadow(radius: 7)
    }
}

struct CircleImage_Previews: PreviewProvider
{
    static var previews: some View
    {
        CircleImage()
    }
}&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;Untitled 10.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btfBdK/btsHcoTMgDU/hKVkl17cc1yQd2X3KdygH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btfBdK/btsHcoTMgDU/hKVkl17cc1yQd2X3KdygH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btfBdK/btsHcoTMgDU/hKVkl17cc1yQd2X3KdygH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtfBdK%2FbtsHcoTMgDU%2FhKVkl17cc1yQd2X3KdygH1%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;576&quot; height=&quot;1004&quot; data-filename=&quot;Untitled 10.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;섹션5. 다른 프레임 워크에서 SwiftUI 보기 사용&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 만들었던 원에 지도를 배치하려면 SwiftUI로 &lt;code&gt;MapView.swift&lt;/code&gt; 파일을 생성하고 아래 코드의 주석을 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**MapView.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;import SwiftUI
import MapKit   // 맵 킷을 불러온다.

struct MapView: View
{
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 37.5030042, longitude: 127.0507571),
        span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
    )
    // **@State**는 해당 View 외부로는 사용할 수가 없고 private 형태로 내부에서만 사용
        //
    // **region**은 지도에 대한 정보를 저장하는 private 상태변수
    //
    // **MKCoordinateRegion**은 Map에서 보여줄 원하는 좌표를 담을 매개변수, 
        // struct로 특정 경도와 위도를 중심으로 둘러싼 사각형 모양의 지역범위를 표시
        //
    // **CLLocationCoordinate2D**은 지정된 위치와 관련된 위도 및 경도 데이터
        //
    // **MKCoordinateSpan**은 척도를 나타냄
        // 
    var body: some View
    {
        Map(coordinateRegion: $region)
        // 앞서 선언한 상태변수 region을 **바인딩**(참조)으로 Map에 넣는다.
    }
}

struct MapView_Previews: PreviewProvider {
    static var previews: some View {
        MapView()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;섹션6. 상세도 작성&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 작성한 컨텐츠들을 보기좋게 아래와 같이 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;566C4926-3D2D-4F77-A5A9-1305611B7DA2.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKSuk/btsHcR2u1Bf/LsZg0scSwh5CtJ14d74zcK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKSuk/btsHcR2u1Bf/LsZg0scSwh5CtJ14d74zcK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKSuk/btsHcR2u1Bf/LsZg0scSwh5CtJ14d74zcK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKSuk%2FbtsHcR2u1Bf%2FLsZg0scSwh5CtJ14d74zcK%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;828&quot; height=&quot;820&quot; data-filename=&quot;566C4926-3D2D-4F77-A5A9-1305611B7DA2.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;**Contentview.swift**&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;import SwiftUIimport SwiftUI // SwiftUI 인터페이스를 사용하겠다.

struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
    var body: some View // 컨텐츠의 몸체
        {
            VStack// 텍스트를 세로방향으로 쌓는다.(좌로 정렬)
            {
                MapView()
                    .ignoresSafeArea( edges : .top )
                    .frame(height:300)

                CircleImage()
                    .offset(y:-130)
                    .padding(.bottom,-130)

                VStack (alignment: .leading)
                {
                    Text(&quot;Turtle Rock&quot;) // 보여줄 텍스트 : 터틀락
                        .font(.title) // 타이틀 폰트를 사용한다.

                    HStack
                    {
                        Text(&quot;Joshua Tree National Park&quot;) // 보여줄 텍스트
                        Spacer() // 공원과 주 사이에 공간을 채워넣음
                        Text(&quot;California&quot;) // 보여줄 텍스트
                    }
                        .font(.subheadline) // HStack으로 묶여있는 애들을 서브라인 폰트로 설정한다.
                        .foregroundColor(.secondary) // 글자색을 옅은 회색으로 설정한다.

                    Divider() // 구분선을 추가한다.

                    Text(&quot;About Turtle Rock&quot;)
                        .font(.title2)
                    Text(&quot;Descriptive text goes here.&quot;)
                }
                    .padding() // 보기좋게 하기 위해 VStack 으로 쌓은 놈들에 패딩을 준다.

                Spacer() // 지금까지 작성한 컨텐츠를 최상단으로 끌어올린다.
            }
    }
}

struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
    static var previews: some View // 프리뷰의 몸체
        {
        ContentView() // 미리보기에 띄울 컨텐츠
    }
}&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;Untitled 11.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJWWI/btsHfA6AVs6/7NkKpQxH1DDzVktyVOnAYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJWWI/btsHfA6AVs6/7NkKpQxH1DDzVktyVOnAYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJWWI/btsHfA6AVs6/7NkKpQxH1DDzVktyVOnAYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJWWI%2FbtsHfA6AVs6%2F7NkKpQxH1DDzVktyVOnAYk%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;562&quot; height=&quot;1034&quot; data-filename=&quot;Untitled 11.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/33</guid>
      <comments>https://tobilee1011.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 7 May 2024 22:33:17 +0900</pubDate>
    </item>
    <item>
      <title># 14과. 포인터</title>
      <link>https://tobilee1011.tistory.com/32</link>
      <description>&lt;ul&gt;
&lt;li&gt;포인터 : 어느 대상을 가리키기 위한 주소를 저장하는 데이터 타입&lt;ul&gt;
&lt;li&gt;포인터가 가리키는 대상은 포인터에 *연산을 통하여 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int a = 10;
    int *p = &amp;amp;a; //int 자료형을 가리키는 포인터 = a의 주소

    printf(&amp;quot;0x%p\n&amp;quot;,&amp;amp;a); //a의 주소
    printf(&amp;quot;0x%p\n&amp;quot;,p);  //포인터가 가리키는 주소
    printf(&amp;quot;%d\n&amp;quot;,a);    //a의 값
    printf(&amp;quot;%d\n&amp;quot;,*p);   //포인터가 가리키는 대상의 값
  printf(&amp;quot;%d\n&amp;quot;, sizeof(p)); //포인터의 사이즈
  printf(&amp;quot;%d\n&amp;quot;, sizeof(*p));//포인터가 가리키는 대상의 사이즈
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;포인터는 가리키는 대상 타입에 맞게 선언되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int main (void)
{
    char a = &amp;#39;A&amp;#39;;
  char *p = &amp;amp;a;

  double f = 3.14;
  double *q = &amp;amp;f;

  printf(&amp;quot;%d\n&amp;quot;, sizeof(*p)); //포인터가 가리키는 대상의 사이즈
  printf(&amp;quot;%c\n&amp;quot;, *p); //포인터가 가리키는 대상의 값
  printf(&amp;quot;0x%p&amp;quot;, p); //포인터가 가리키는 주소
  printf(&amp;quot;0x%p&amp;quot;, p + 1); //포인터가 가리키는 주소 + 1 : char크기(1바이트)만큼 주소 이동
    printf(&amp;quot;0x%p&amp;quot;, q); //포인터가 가리키는 주소
  printf(&amp;quot;0x%p&amp;quot;, q + 1); //포인터가 가리키는 주소 + 8 : double크기(8바이트)만큼 주소 이동

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;함수에서 전달받은 변수 내용을 변경하려면 포인터로 변수의 주소를 받아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

//Call By Value
void f1 (int b)
{
    b = 100;
    printf(&amp;quot;%d\n&amp;quot;,b);
} 

//Call By Address
void f2 (int *p) //a를 가리키기 위한 포인터를 인자로 선언
{
    *p = 100; //포인터가 가리키는 대상의 값을 100으로 변경
    printf(&amp;quot;%d\n&amp;quot;,*p); //포인터가 가리키는 대상의 값을 출력
}

int main (void)
{
    int a = 10;

    f1(a); //Call By Value
    printf(&amp;quot;%d\n&amp;quot;,a);

    f2(&amp;amp;a);//Call By Address - a의 주소를 넘김
    printf(&amp;quot;%d\n&amp;quot;,a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;%s 포맷 지시자와 문자열&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int main (void)
{
    char a[] = &amp;quot;Hello&amp;quot;; //배열은 포인터임
    char *p = &amp;quot;Hello&amp;quot;; //인쇄할 문자열의 첫번째 주소 대입

    //%s는 인쇄할 문자열의 첫 글자의 주소를 받음
    printf(&amp;quot;%s\n&amp;quot;, &amp;quot;Hello&amp;quot;);
    printf(&amp;quot;%s\n&amp;quot;, &amp;amp;a[0]); //문자열의 첫번째 인자의 주소 
    printf(&amp;quot;%s\n&amp;quot;, a); //문자열
    printf(&amp;quot;%s\n&amp;quot;, p); //문자열의 주소

  printf(&amp;quot;%s\n&amp;quot;, &amp;quot;Hello&amp;quot;+1); //문자열의 주소를 이동시킴 -&amp;gt; ello 출력
    printf(&amp;quot;%s\n&amp;quot;, a + 1); //문자열 주소 이동 -&amp;gt; ello 출력
  printf(&amp;quot;%s\n&amp;quot;, p + 1); //포인터가 가리키는 주소 이동 -&amp;gt; ello 출력
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

char *func(char *q) // 반환형 : char * , 인자 : char *
{
    printf(&amp;quot;%s\n&amp;quot;, q);
    printf(&amp;quot;%c\n&amp;quot;, q[0]);
    printf(&amp;quot;%c\n&amp;quot;, q[1]);
    printf(&amp;quot;0x%p\n&amp;quot;, q);
    printf(&amp;quot;0x%p\n&amp;quot;, q+1);
    printf(&amp;quot;0x%p\n&amp;quot;, *q);
    printf(&amp;quot;0x%p\n&amp;quot;, *(q+1));

    return q + 2;
}

void main(void)
{
    char *p = &amp;quot;Hello&amp;quot;; //문자열은 char 배열이다.

    printf(&amp;quot;%s\n&amp;quot;, &amp;quot;Hello&amp;quot;); //Hello 출력
    printf(&amp;quot;0x%p\n&amp;quot;, &amp;quot;Hello&amp;quot;);//Hello의 시작 주소 출력
    printf(&amp;quot;0x%p\n&amp;quot;, &amp;quot;Hello&amp;quot; + 1);//Hello 주소 + 1Byte 주소 출력
    printf(&amp;quot;%c\n&amp;quot;, &amp;quot;Hello&amp;quot;[0]); //Hello의 문자열의 첫번째 글자 H 출력
    printf(&amp;quot;%c\n&amp;quot;, &amp;quot;hello&amp;quot;[1]); //hello의 문자열의 두번째 글자 e 출력
    printf(&amp;quot;%c\n&amp;quot;, *&amp;quot;Hello&amp;quot;); //문자열은 포인터이므로 문자열의 첫번째 대상 H를 출력
    printf(&amp;quot;%c\n&amp;quot;, *(&amp;quot;Hello&amp;quot; + 1));//문자열은 포인터이므로 포인터를 1Byte만큼 이동시킨 후 첫번째 인자 e출력
    printf(&amp;quot;%s\n&amp;quot;, func(&amp;quot;Hello&amp;quot;)); //문자열을 반환받는 func함수에 포인터(주소) 전달 후 llo 반환받음
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;*p++, *++p 의 동작&lt;ul&gt;
&lt;li&gt;++, — 연산자가 주소에 사용되면 주소가 가리키는 크기만큼 증가, 감소한다.&lt;/li&gt;
&lt;li&gt;*++p : 먼저 포인터 p를 증가시키고 그 주소의 내용을 꺼내온다.&lt;/li&gt;
&lt;li&gt;*p++ : p주소에서 먼저 내용을 꺼내고 포인터 p를 증가시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

void main(void)
{
    int cnt = 0;
    char *p = &amp;quot;Embedded&amp;quot;; //문자열의 첫번째 글자를 가리키는 포인터

    while (*p) //*p가 \0(null 포인터)이 될 때 까지 
    {
        if (*p++ == &amp;#39;d&amp;#39;) cnt++; //문자열을 가리키는 포인터의 주소를 한칸씩 이동시키며 d가 있으면 1씩 증가
    }

    printf(&amp;quot;%d\n&amp;quot;, cnt);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

void main(void)
{
    int cnt = 0, i = 0;
    char *p = &amp;quot;Embedded&amp;quot;;

    while (p[i]) //E로 시작하는 포인터가 0(NULL Pointer)을 만날때 까지 반복
    {
        if (p[i++] == &amp;#39;d&amp;#39;) cnt++; //포인터를 한칸씩 이동시키며 cnt 증가
    }

    printf(&amp;quot;%d\n&amp;quot;, cnt);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 복사 함수&lt;ul&gt;
&lt;li&gt;문자열 복사 함수의 동작분석&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

void str_copy1(char * d, char * s) //주소를 받을 수 있도록 함수인자로 포인터 선언
{
    int i;

    for (i = 0; ; i++)
    {
        d[i] = s[i];
        if (d[i] == &amp;#39;\0&amp;#39;) return; // \0(NULL PTR)을 만나면 탈출
    }
}

void str_copy2(char * d, char * s)
{
    while (*d++ = *s++); // 0이되면 탈출
}

void main(void)
{
    char a[5], b[5]; //문자열 배열 선언
    char c[5] = &amp;quot;ABCD&amp;quot;; //문자열 배열에 ABCD\0 대입

    str_copy1(a, c); //문자열 배열의 첫번째 인자의 주소 전달
    str_copy2(b, c);
    printf(&amp;quot;%s %s %s\n&amp;quot;, a, b, c);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 길이 측정 함수&lt;ul&gt;
&lt;li&gt;문자열 길이를 측정하는 함수 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

unsigned int str_length(char * d)
{
    // 코드 작성
    int cnt = 0;
    for (int i = 0; ;i++)
    {
        if(d[i] == 0) //널문자 검사 우선 수행
        {
            return cnt;
        }
        else
        {
            cnt++;
        }
    }
}

void main(void)
{
    char a[] = &amp;quot;Willtek&amp;quot;;

    printf(&amp;quot;%d\n&amp;quot;, sizeof(a)); // \0 을 포함하여 출력
    printf(&amp;quot;%d\n&amp;quot;, str_length(a)); // \0을 제외하여 출력
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 연결 함수&lt;ul&gt;
&lt;li&gt;두개의 문자열을 하나로 이어주는 함수 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

void str_add(char * d, char * s) //전달받은 a와 b를 합친다.
{
    for(int i = 0; ; i++)
    {
        if(d[i] == 0) // &amp;quot;Willtek\0&amp;quot;에서 \0을 만나면 해당 자리부터 &amp;quot; Corp.&amp;quot;을 이어씀
        {
            for (int j = 0; ; j++)
            {
                if(s[j] == 0)
                {
                    return;
                }
                else
                {
                    d[i+j] = s[j];
                }    
            }
        }
    }
}

void main(void)
{
    char a[15] = &amp;quot;Willtek&amp;quot;;
    char b[15] = &amp;quot; Corp.&amp;quot;;

    str_add(a, b); //a와 b의 첫번째 주소를 전달

    printf(&amp;quot;%s\n&amp;quot;, a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 비교 함수&lt;ul&gt;
&lt;li&gt;두개의 문자열의 크기를 비교하는 함수를 설계&lt;/li&gt;
&lt;li&gt;두 문자열 a,b중에서 a가 크면 1, b가 크면 -1, 같으면 0 리턴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int str_comp(char *a, char *b)
{
    // 코드 작성
    int result = 0;
    for (int i = 0;; i++)
    {
        if (a[i] &amp;gt; b[i]) // a가 크면
            return result = 1;
        else if (a[i] &amp;lt; b[i]) // b가 크면
            return result = -1;
        else if ((a[i] == b[i])&amp;amp;&amp;amp;(a[i]==0)) //널문자가 나타날 때까지 함수를 탈출 못하면 문자열이 모두 같다
            return result = 0;
    }

}

void main(void)
{
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;ABC&amp;quot;, &amp;quot;BC&amp;quot;));
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;ABC&amp;quot;, &amp;quot;AC&amp;quot;));
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;ABC&amp;quot;, &amp;quot;AB&amp;quot;));
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;abc&amp;quot;, &amp;quot;ABC&amp;quot;));
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;ab&amp;quot;, &amp;quot; &amp;quot;));
    printf(&amp;quot;%d\n&amp;quot;, str_comp(&amp;quot;A&amp;quot;, &amp;quot;AB&amp;quot;));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/32</guid>
      <comments>https://tobilee1011.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 7 May 2024 22:29:22 +0900</pubDate>
    </item>
    <item>
      <title>517 : 입력 - 자가진단9</title>
      <link>https://tobilee1011.tistory.com/31</link>
      <description>&lt;pre id=&quot;code_1667557180662&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include&amp;lt;stdio.h&amp;gt;

int main(void)
{
	double a, b, c;

	scanf(&quot;%lf&quot;, &amp;amp;a);
	scanf(&quot;%lf&quot;, &amp;amp;b);
	scanf(&quot;%lf&quot;, &amp;amp;c);

	printf(&quot;%.3lf\n&quot;, a);
	printf(&quot;%.3lf\n&quot;, b);
	printf(&quot;%.3lf\n&quot;, c);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/31</guid>
      <comments>https://tobilee1011.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:20:06 +0900</pubDate>
    </item>
    <item>
      <title>516 : 입력 - 자가진단8</title>
      <link>https://tobilee1011.tistory.com/30</link>
      <description>&lt;pre id=&quot;code_1667557153107&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
int main(void)
{
	double a, b;
	char c;

	scanf(&quot;%lf %lf %c&quot;, &amp;amp;a, &amp;amp;b, &amp;amp;c);

	//아래 방법은 에러발생
	//scanf(&quot;%lf&quot;, &amp;amp;a);
	//scanf(&quot;%lf&quot;, &amp;amp;b);
	//scanf(&quot; %c&quot;, &amp;amp;c); - char 입력받을 때 띄어쓰기 필요

	printf(&quot;%.2lf\n&quot;, a);
	printf(&quot;%.2lf\n&quot;, b);
	printf(&quot;%c\n&quot;, c);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/30</guid>
      <comments>https://tobilee1011.tistory.com/30#entry30comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:19:19 +0900</pubDate>
    </item>
    <item>
      <title>515 : 입력 - 자가진단7</title>
      <link>https://tobilee1011.tistory.com/29</link>
      <description>&lt;pre id=&quot;code_1667557105929&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main(void)
{
	int a, b;
	scanf(&quot;%d %d&quot;, &amp;amp;a, &amp;amp;b);
	printf(&quot;%d * %d = %d\n&quot;, a, b, a*b);
	printf(&quot;%d / %d = %d&quot;, a, b, a/b);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/29</guid>
      <comments>https://tobilee1011.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:18:28 +0900</pubDate>
    </item>
    <item>
      <title>514 : 입력 - 자가진단6</title>
      <link>https://tobilee1011.tistory.com/28</link>
      <description>&lt;pre id=&quot;code_1667557067122&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main(void)
{
	int height;
	printf(&quot;height = &quot;);
	scanf(&quot;%d&quot;,&amp;amp;height);
	printf(&quot;Your height is %dcm.&quot;, height);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/28</guid>
      <comments>https://tobilee1011.tistory.com/28#entry28comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:18:02 +0900</pubDate>
    </item>
    <item>
      <title>513 : 입력 - 자가진단5</title>
      <link>https://tobilee1011.tistory.com/27</link>
      <description>&lt;pre id=&quot;code_1667557017877&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
	float YardToCm, inchToCm;
	YardToCm = 91.44;
	inchToCm = 2.54;

	float yard, inch;
	yard = 2.1;
	inch = 10.5;

	printf(&quot;%4.1fyd = %5.1fcm\n&quot;, yard, yard*YardToCm);
	printf(&quot;%4.1fin = %5.1fcm&quot;, inch, inch*inchToCm);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/27</guid>
      <comments>https://tobilee1011.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:17:18 +0900</pubDate>
    </item>
    <item>
      <title>512 : 입력 - 자가진단4</title>
      <link>https://tobilee1011.tistory.com/26</link>
      <description>&lt;pre id=&quot;code_1667556988521&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main(void)
{
	int weight;
	float gravity;
	weight = 49;
	gravity = 0.2683;

	printf(&quot;%d * %.6f = %.6f&quot;, weight, gravity, weight * gravity);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tobilee1011</author>
      <guid isPermaLink="true">https://tobilee1011.tistory.com/26</guid>
      <comments>https://tobilee1011.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 4 Nov 2022 19:16:37 +0900</pubDate>
    </item>
  </channel>
</rss>