<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 블로그</title>
    <link>https://daraq.tistory.com/</link>
    <description>공부 정리용 블로그</description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 07:30:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>채린.__.</managingEditor>
    <item>
      <title>[DB] DBeaver에서 오라클 -&amp;gt; MSSQL  데이터 옮길때 UNIQUEIDENTIFIER 오류 해결법</title>
      <link>https://daraq.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오라클이랑 MSSQL은 PK 형식이 달라서 그대로 데이터를 복사하면 오류가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle의 RAW(16) 또는 VARCHAR2 기반 UUID &amp;harr; MSSQL의 UNIQUEIDENTIFIER 간 매핑이 자동으로 안되기 때문에 CSV파일로 저장해서 직접 데이터를 수정해서 옮겨야함..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(엑셀로 저장이 어려운 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;대용량 데이터는&lt;span&gt; &lt;/span&gt;&lt;/span&gt;다른 방법을 찾아야할5듯)&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;1. 오라클에서 데이터 csv파일로 저장하기 (디비버에서)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmPZiS%2FbtsP03MfTZU%2FbY4ArAyLwrBUmc037u3J20%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;156&quot; height=&quot;421&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;421&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;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-origin-width=&quot;814&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btRMuF/btsPZ3e8d79/Vk2Pq3EGolqfWTZLyMuTj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btRMuF/btsPZ3e8d79/Vk2Pq3EGolqfWTZLyMuTj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btRMuF/btsPZ3e8d79/Vk2Pq3EGolqfWTZLyMuTj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtRMuF%2FbtsPZ3e8d79%2FVk2Pq3EGolqfWTZLyMuTj0%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;500&quot; height=&quot;378&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;615&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;csv파일로 내보내기 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btvtsI/btsPZo4TTvm/Uvs5TK9I9vzLyoNufqtoY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btvtsI/btsPZo4TTvm/Uvs5TK9I9vzLyoNufqtoY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btvtsI/btsPZo4TTvm/Uvs5TK9I9vzLyoNufqtoY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtvtsI%2FbtsPZo4TTvm%2FUvs5TK9I9vzLyoNufqtoY1%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;527&quot; height=&quot;409&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(한국어 데이터 포함되어있다면) 다음다음 누르다가 Output에서 Encoding을 EUC-KR로 설정/ 저장 디렉터리 지정 후 진행 버튼 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(한국어 데이터 없다면) 다음다음 누르다가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Output에서 디렉터리 지정 후 진행 버튼 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;저장완 ~~&lt;/span&gt;&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; text-align: start;&quot;&gt;2. 엑셀에서 키값 UNIQUEIDENTIFIER로 바꿔주기&lt;/span&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;b&gt;0F7E59D0D618652EE0630100007F4E01&amp;nbsp; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 생긴 애를 아래와 같은 형식으로 바꿔야하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;13AA2683-D7BB-4041-BB18-5EDE9D4F3092&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;일단 키값에 들어있는 값들 다 지우고 (셀 클릭하고 CTRL+SHIFT + 아래화살표 / 마우스 우클릭 내용지우기 선택)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 랜덤으로 생성한 UNIQUEIDENTIFIER값을 넣자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==================================================================================&lt;/p&gt;
&lt;h2 data-end=&quot;133&quot; data-start=&quot;101&quot; data-ke-size=&quot;size26&quot;&gt;-&amp;nbsp; 엑셀 기본 함수 사용 (Excel 365 이상)&lt;/h2&gt;
&lt;p data-end=&quot;176&quot; data-start=&quot;134&quot; data-ke-size=&quot;size16&quot;&gt;Excel 365 이후 버전은 GUID() 함수가 추가되어 있음&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;=GUID() &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;265&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;  실행하면 예: 550e8400-e29b-41d4-a716-446655440000 형태의 값이 생성됨&lt;/p&gt;
&lt;hr data-end=&quot;270&quot; data-start=&quot;267&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;308&quot; data-start=&quot;272&quot; data-ke-size=&quot;size26&quot;&gt;- Excel 2016 ~ 2021 (GUID 함수 없음)&lt;/h2&gt;
&lt;p data-end=&quot;345&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;이 경우는 &lt;b&gt;VBA 사용자 정의 함수&lt;/b&gt;를 만들어야 함.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;408&quot; data-start=&quot;347&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;377&quot; data-start=&quot;347&quot;&gt;Alt + F11 눌러 VBA 편집기 열기&lt;/li&gt;
&lt;li data-end=&quot;408&quot; data-start=&quot;378&quot;&gt;삽입 &amp;gt; 모듈 선택 후 아래 코드 붙여넣기&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Function NewGUID() As String NewGUID = Mid$(CreateObject(&quot;Scriptlet.TypeLib&quot;).GUID, 2, 36) End Function &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;556&quot; data-start=&quot;530&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;556&quot; data-start=&quot;530&quot;&gt;저장 후 Excel 셀에 다음처럼 입력&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;=NewGUID() &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;  실행하면 MSSQL UNIQUEIDENTIFIER와 동일한 랜덤 GUID가 생성됨&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;==================================================================================&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;엑셀 2019버전을 쓰고있는 나는 후자의 방법을 채택함.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;그러나,, 랜덤 GUID가 생성이 되긴 했지만 수식으로 되어있어서 DB IMPORT가 안됨. 값 복사도 안됨(왤까)&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;그래서 그냥&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;224&quot; data-start=&quot;182&quot; data-ke-size=&quot;size26&quot;&gt;1) VBA로 안전하게 GUID 생성 (WinAPI, 권한 이슈 없음)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;272&quot; data-start=&quot;226&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;254&quot; data-start=&quot;226&quot;&gt;엑셀에서 Alt + F11 &amp;rarr; &lt;b&gt;삽입 &amp;gt; 모듈&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;272&quot; data-start=&quot;255&quot;&gt;이 코드를 그대로 붙여넣기&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1755750100038&quot; class=&quot;vbnet&quot; data-ke-language=&quot;vbnet&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#If VBA7 Then
    Private Declare PtrSafe Function CoCreateGuid Lib &quot;ole32.dll&quot; (ByRef pguid As GUID) As Long
#Else
    Private Declare Function CoCreateGuid Lib &quot;ole32.dll&quot; (ByRef pguid As GUID) As Long
#End If

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Function GuidToString(g As GUID) As String
    GuidToString = _
        LCase$(Right$(&quot;00000000&quot; &amp;amp; Hex$(g.Data1), 8) &amp;amp; &quot;-&quot; &amp;amp; _
               Right$(&quot;0000&quot; &amp;amp; Hex$(g.Data2), 4) &amp;amp; &quot;-&quot; &amp;amp; _
               Right$(&quot;0000&quot; &amp;amp; Hex$(g.Data3), 4) &amp;amp; &quot;-&quot; &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(0)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(1)), 2) &amp;amp; &quot;-&quot; &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(2)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(3)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(4)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(5)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(6)), 2) &amp;amp; _
               Right$(&quot;00&quot; &amp;amp; Hex$(g.Data4(7)), 2))
End Function

Public Function NewGUID() As String
    Dim g As GUID
    If CoCreateGuid(g) = 0 Then
        NewGUID = GuidToString(g)   ' 예: 550e8400-e29b-41d4-a716-446655440000
    Else
        NewGUID = vbNullString
    End If
End Function

' 선택한 셀들에 &quot;값&quot;으로 GUID 채우기 (고정)
Public Sub InsertGUID()
    Dim rng As Range
    For Each rng In Selection
        rng.Value = NewGUID()
    Next rng
End Sub&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1707&quot; data-start=&quot;1700&quot; data-ke-size=&quot;size23&quot;&gt;사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1874&quot; data-start=&quot;1708&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1763&quot; data-start=&quot;1708&quot;&gt;&lt;b&gt;함수처럼 쓰기&lt;/b&gt;: 셀에 =NewGUID() 입력 &amp;rarr; GUID 생성(재계산 시 값 바뀜)&lt;/li&gt;
&lt;li data-end=&quot;1874&quot; data-start=&quot;1764&quot;&gt;&lt;b&gt;고정값으로 넣기&lt;/b&gt;: GUID를 넣을 셀 범위를 선택 &amp;rarr; Alt + F8 &amp;rarr; InsertGUID 실행&lt;br /&gt;(선택한 셀마다 &lt;b&gt;값으로&lt;/b&gt; 바로 들어가므로 값 붙여넣기 필요 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;위 방법으로 함.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;직접 UNIQUEIDENTIFIER를 생성해서 키값으로 넣어주니까 해결됨.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size26&quot;&gt;3. 디비버 MSSQL DB 테이블에 집어넣기&lt;/h2&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;미리 생성해둔 빈 테이블 우클릭&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmPZiS/btsP03MfTZU/bY4ArAyLwrBUmc037u3J20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmPZiS%2FbtsP03MfTZU%2FbY4ArAyLwrBUmc037u3J20%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;156&quot; height=&quot;421&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;데이터 가져오기 선택&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; 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;798&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFfekA/btsP1q1yiik/DjpYMWhKt0br9JboSEQNE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFfekA/btsP1q1yiik/DjpYMWhKt0br9JboSEQNE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFfekA/btsP1q1yiik/DjpYMWhKt0br9JboSEQNE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFfekA%2FbtsP1q1yiik%2FDjpYMWhKt0br9JboSEQNE0%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;798&quot; height=&quot;609&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;CSV에서 가져오기 선택&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;폴더 뜨면 가져올 파일 선택해서 가져온다.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; 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;797&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3uwOE/btsP0vJlRMN/Q6dMSuUYsn0qkfcKIKxZe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3uwOE/btsP0vJlRMN/Q6dMSuUYsn0qkfcKIKxZe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3uwOE/btsP0vJlRMN/Q6dMSuUYsn0qkfcKIKxZe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3uwOE%2FbtsP0vJlRMN%2FQ6dMSuUYsn0qkfcKIKxZe1%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;797&quot; height=&quot;783&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 소스파일과 타겟파일 경로를 볼 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;(한글데이터 포함인 경우) 여기서 아래 Importer settings에 인코딩을 EUC-KR로 바꿔주고 다음 클릭&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(한글데이터 미포함 경우)&lt;span&gt; 다음 클릭&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; 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;808&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvoY0/btsP06hXUxw/1virdVjAp4f4ZeowAVPNJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvoY0/btsP06hXUxw/1virdVjAp4f4ZeowAVPNJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvoY0/btsP06hXUxw/1virdVjAp4f4ZeowAVPNJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvoY0%2FbtsP06hXUxw%2F1virdVjAp4f4ZeowAVPNJ1%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;557&quot; height=&quot;538&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;다음에 보이는 테이블에서 source밑에 테이블 명 왼쪽에 &amp;gt; 이 화살표를 누르면 각 칼럼들 매핑된게 보인다.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;여기서 어떤 칼럼값을 어떤 칼럼값으로 넣을것인지/ 스킵할 것인지 선택할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;칼럼 선택 후 다음다음 진행 누르면 데이터 복사 완료.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;* 디비버에서 위 방법으로 했을때 UNIQUEIDENTIFIER 값이 중복이라고 뜨는 경우*&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;이미 존재하는 키값이 중복으로 들어갔다는 건데&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;그럴때 다시 생성하거나 새로운 열에서 넣어줘야 하는 값보다 더 많이 생성해놓고 중복 안뜰때까지 넣어줌.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;생 노가다라서,, 좋은 방법이 있다면 .. 공유 부탁드리며...&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;끝&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/124</guid>
      <comments>https://daraq.tistory.com/124#entry124comment</comments>
      <pubDate>Thu, 21 Aug 2025 13:33:29 +0900</pubDate>
    </item>
    <item>
      <title>[ C# ]  WinForms Tag 속성</title>
      <link>https://daraq.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tag 속성: WinForms에서 거의 **모든 컨트롤(Control)**이 가지고 있는 &lt;b&gt;범용적인 데이터 저장소&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ Tag란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;object 타입으로 정의된 &lt;b&gt;속성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;어떤 &lt;b&gt;형식의 데이터든 저장 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;주로 &lt;b&gt;컨트롤에 부가 정보&lt;/b&gt;나 &lt;b&gt;ID값&lt;/b&gt;, &lt;b&gt;임시 상태값&lt;/b&gt;을 저장할 때 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  예시 코드 설명&lt;/h3&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;btnSearch1.Tag = 1;
btnSearch2.Tag = 2;
&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;btnSearch1 버튼의 Tag에 숫자 1을 저장&lt;/li&gt;
&lt;li&gt;btnSearch2 버튼의 Tag에 숫자 2를 저장&lt;br /&gt;&amp;rarr; 이걸 활용해서 나중에 어떤 버튼이 눌렸는지 구분할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  활용 예: 하나의 이벤트 핸들러에서 여러 버튼 처리&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;private void btnSearch_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    int tagValue = Convert.ToInt32(btn.Tag);

    switch (tagValue)
    {
        case 1:
            MessageBox.Show(&quot;btnSearch1 클릭됨&quot;);
            break;
        case 2:
            MessageBox.Show(&quot;btnSearch2 클릭됨&quot;);
            break;
    }
}
&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;버튼마다 Tag를 다르게 지정해두고&lt;/li&gt;
&lt;li&gt;클릭 시 sender.Tag로 분기 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Tag에 저장할 수 있는 것들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 값 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;int, string&lt;/td&gt;
&lt;td&gt;단순 숫자나 텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;구조체, 클래스 등 복합 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataRow, DTO&lt;/td&gt;
&lt;td&gt;행 데이터나 모델 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;초기화 안 해도 무관&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tag는 &lt;b&gt;컨트롤에 데이터를 잠깐 붙여두는 데 쓰는 속성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;형식 제한 없음 (object 타입)&lt;/b&gt;&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;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/122</guid>
      <comments>https://daraq.tistory.com/122#entry122comment</comments>
      <pubDate>Tue, 17 Jun 2025 10:43:41 +0900</pubDate>
    </item>
    <item>
      <title>C# | 디자인패턴 싱글톤</title>
      <link>https://daraq.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&quot;싱글톤(Singleton) 타입&quot;은 소프트웨어 디자인 패턴 중 하나로, &lt;b&gt;클래스의 인스턴스를 오직 하나만 생성&lt;/b&gt;하도록 제한하는 패턴이다. 주로 &lt;b&gt;전역적으로 하나만 존재해야 하는 객체&lt;/b&gt;에 사용된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  싱글톤 패턴(Singleton Pattern)이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;특정 클래스의 인스턴스가 애플리케이션 전체에서 단 하나만 존재하도록 보장하는 패턴&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 사용할까? (사용 목적)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;전역 접근&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프로그램 어디서든 동일한 객체에 접근할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;공유 자원 관리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DB 연결, 설정 파일, 로그 관리처럼 &lt;b&gt;공유되어야 하는 자원&lt;/b&gt;을 일관성 있게 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;성능 향상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;자주 생성될 필요가 없는 무거운 객체를 한 번만 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;상태 유지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객체 상태를 한 곳에서 유지하고 관리하고자 할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 싱글톤 클래스의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요소 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;private 생성자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;외부에서 new로 생성하지 못하게 막음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;static 인스턴스 필드&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인스턴스를 담아두는 정적 변수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;static 메서드 (getInstance())&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인스턴스를 리턴하며, 필요시 직접 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  구조 예시 (C#)&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public class Singleton
{
    private static Singleton instance = null;
    private static readonly object syncRoot = new object();

    private Singleton() { }

    public static Singleton getInstance()
    {
        lock (syncRoot)
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

    public void DoSomething()
    {
        Console.WriteLine(&quot;싱글톤 메서드 실행!&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 사용 예시&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

Console.WriteLine(object.ReferenceEquals(s1, s2)); // true
&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;s1과 s2는 같은 인스턴스를 가리킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  싱글톤이 유용한 사례&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;로그 기록기 (Logger)&lt;/td&gt;
&lt;td&gt;애플리케이션 전체에서 공통된 로그 객체 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설정 객체 (ConfigManager)&lt;/td&gt;
&lt;td&gt;환경설정 파일을 불필요하게 여러 번 읽지 않게&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터베이스 연결 풀 (DBConnectionPool)&lt;/td&gt;
&lt;td&gt;연결을 재사용하여 성능 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI의 메인 윈도우&lt;/td&gt;
&lt;td&gt;프로그램에 하나만 존재해야 하는 화면&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;테스트 어려움&lt;/b&gt;: 전역 상태를 가지므로 유닛 테스트가 어려워질 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성 주입(DI)과 충돌&lt;/b&gt;: DI 컨테이너 기반 설계에서는 싱글톤 직접 구현이 안 맞을 수도 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;남용 위험&lt;/b&gt;: 아무 객체에나 싱글톤 적용하면 코드가 꼬일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/121</guid>
      <comments>https://daraq.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 5 Jun 2025 09:55:22 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 비모달- Show() 과 모달-ShowDialog() 의 차이</title>
      <link>https://daraq.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ Show() vs ShowDialog() 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 Show() ShowDialog()&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;형태&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비모달&lt;/b&gt; (Non-modal)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;모달&lt;/b&gt; (Modal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기본 의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;폼을 띄우되, &lt;b&gt;메인 프로그램은 계속 실행됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;폼을 띄우면 &lt;b&gt;그 폼 닫을 때까지 다른 작업 불가&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;다른 폼과 상호작용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가능 (동시에 여러 폼 조작 가능)&lt;/td&gt;
&lt;td&gt;불가능 (열린 폼 닫기 전까지 다른 폼 못 조작)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 예&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;옵션 설정 창, 다중 창을 동시에 띄울 때&lt;/td&gt;
&lt;td&gt;확인창, 입력창, 경고창 등 사용자가 응답해야 하는 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;반환값&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;DialogResult 반환 (예: OK, Cancel 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 예제 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Show() 예제 (비모달)&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;frmManualCNV f = new frmManualCNV(1085);
f.Show(); // 폼이 열리고, 기존 폼도 계속 사용할 수 있음
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과&lt;/b&gt;: 새 폼이 열리면서, 기존 폼도 마우스로 클릭하거나 조작 가능함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  ShowDialog() 예제 (모달)&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;frmManualCNV f = new frmManualCNV(1085);
DialogResult result = f.ShowDialog(); // 사용자가 닫기 전까지 프로그램 멈춤
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과&lt;/b&gt;: 새 폼이 열리고, &lt;b&gt;그 창을 닫기 전까지 다른 폼 조작 불가&lt;/b&gt;&lt;br /&gt;&amp;rarr; 예를 들어, &quot;설정창&quot;, &quot;로그인 창&quot;, &quot;경고창&quot; 같은 데 사용함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ ShowDialog()를 쓰는 이유&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;선택하거나 입력을 완료하기 전까지 다른 행동 못 하게 하려는 경우&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;폼에서 DialogResult로 결과값을 받아 처리하고 싶은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제:&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;frmLogin loginForm = new frmLogin();
if (loginForm.ShowDialog() == DialogResult.OK)
{
    // 로그인 성공한 경우만 다음 단계 진행
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Show()&lt;/td&gt;
&lt;td&gt;비모달. 새 폼 띄우고도 기존 폼 사용 가능. 동시에 여러 폼 작업 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ShowDialog()&lt;/td&gt;
&lt;td&gt;모달. 폼을 닫기 전까지 다른 작업 불가. 주로 확인/입력 창에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ShowDialog()는 주로 사용자로 하여금 &lt;b&gt;해당 폼에서 반드시 뭔가를 하고 나서&lt;/b&gt; 다른 곳으로 가도록 유도할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;+ DialogResult 커스터마이징하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; **모달 폼(ShowDialog로 띄운 폼)**에서 사용자가 어떤 버튼을 눌렀는지 판단하기 위해 직접 &lt;b&gt;결과값(DialogResult)을 설정하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;사용자가 확인을 눌렀는지&lt;/b&gt;, &lt;b&gt;취소했는지&lt;/b&gt;, 등을 &lt;b&gt;DialogResult.OK, DialogResult.Cancel&lt;/b&gt; 같은 값으로 호출한 쪽에서 판단할 수 있게한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 기본 구조&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  폼 띄우는 쪽 (부모 폼):&lt;/h3&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;frmLogin loginForm = new frmLogin();
DialogResult result = loginForm.ShowDialog();

if (result == DialogResult.OK)
{
    // 로그인 성공 처리
}
else
{
    // 로그인 취소 또는 실패 처리
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 자식 폼 (frmLogin 등)에서 DialogResult 설정 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 방법 1: 버튼의 DialogResult 속성 설정&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;에서 버튼을 선택하고 DialogResult 속성을 OK, Cancel, 등으로 지정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;b&gt;코드로 직접 지정&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;private void btnOK_Click(object sender, EventArgs e)
{
    // 입력값 검증 등 로직 처리 후
    this.DialogResult = DialogResult.OK;  // OK 버튼처럼 작동
    this.Close(); // 폼을 닫음
}

private void btnCancel_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
    this.Close();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 방법 2: 반환값 커스터마이징 (조건 따라 결정)&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;private void btnLogin_Click(object sender, EventArgs e)
{
    if (txtID.Text == &quot;admin&quot; &amp;amp;&amp;amp; txtPassword.Text == &quot;1234&quot;)
    {
        this.DialogResult = DialogResult.OK;
    }
    else
    {
        MessageBox.Show(&quot;로그인 실패&quot;);
        return; // 창 닫지 않음
    }

    this.Close();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 커스터마이징 예제 전체 흐름&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  부모 폼 (MainForm)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;frmLogin login = new frmLogin();
if (login.ShowDialog() == DialogResult.OK)
{
    MessageBox.Show(&quot;로그인 성공&quot;);
}
else
{
    MessageBox.Show(&quot;로그인 실패 또는 취소&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  자식 폼 (frmLogin)&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private void btnOK_Click(object sender, EventArgs e)
{
    if (txtUser.Text == &quot;admin&quot; &amp;amp;&amp;amp; txtPwd.Text == &quot;1234&quot;)
    {
        this.DialogResult = DialogResult.OK;  // 부모가 OK로 받을 수 있음
        this.Close();
    }
    else
    {
        MessageBox.Show(&quot;아이디 또는 비밀번호가 틀렸습니다.&quot;);
    }
}

private void btnCancel_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
    this.Close();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  지원되는 DialogResult 값들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancel&lt;/td&gt;
&lt;td&gt;취소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yes, No&lt;/td&gt;
&lt;td&gt;질문 창 등에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abort, Retry, Ignore&lt;/td&gt;
&lt;td&gt;예외 처리 또는 특수 시나리오&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;아무 처리도 안 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 방법&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부모 폼에서 사용자 선택 여부를 확인&lt;/td&gt;
&lt;td&gt;ShowDialog() &amp;rarr; DialogResult 값 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자식 폼에서 결과 설정&lt;/td&gt;
&lt;td&gt;this.DialogResult = DialogResult.XXX; 후 this.Close();&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI 버튼에 직접 설정 가능&lt;/td&gt;
&lt;td&gt;디자이너에서 DialogResult 속성 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/111</guid>
      <comments>https://daraq.tistory.com/111#entry111comment</comments>
      <pubDate>Thu, 22 May 2025 15:32:56 +0900</pubDate>
    </item>
    <item>
      <title>[ C# ] ToolStripContainer 컨트롤 -  윈폼 레이아웃 컨테이너 컨트롤</title>
      <link>https://daraq.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;System.Windows.Forms.&lt;b&gt;ToolStripContainer &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: WinForms에서 툴바(ToolStrip), 메뉴(MenuStrip), 상태 표시줄(StatusStrip) 등을 자동으로 분리된 영역에 배치할 수 있도록 도와주는 레이아웃 컨테이너 컨트롤&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &amp;nbsp; 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ToolStripContainer는 다음과 같은 &lt;b&gt;5개의 영역&lt;/b&gt;을 자동으로 제공하여 UI를 나눠준다:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;+--------------------------------------+
| [TopToolStripPanel]                 |
+--------------------------------------+
|                                      |
| [ContentPanel] &amp;larr; 본문 내용 위치     |
|                                      |
+--------------------------------------+
| [BottomToolStripPanel]              |
+--------------------------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 좌우도 가능:&lt;/p&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;| [LeftToolStripPanel]   ContentPanel   [RightToolStripPanel] |
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  구성 요소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TopToolStripPanel&lt;/td&gt;
&lt;td&gt;상단에 ToolStrip, MenuStrip 등을 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BottomToolStripPanel&lt;/td&gt;
&lt;td&gt;하단 상태 표시줄 배치 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LeftToolStripPanel&lt;/td&gt;
&lt;td&gt;좌측 도구 막대 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RightToolStripPanel&lt;/td&gt;
&lt;td&gt;우측 도구 막대 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ContentPanel&lt;/td&gt;
&lt;td&gt;애플리케이션의 주요 콘텐츠 (Form 내용) 표시 영역&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  사용 예제&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;ToolStripContainer container = new ToolStripContainer();
container.Dock = DockStyle.Fill;

ToolStrip toolStrip = new ToolStrip();
toolStrip.Items.Add(&quot;파일&quot;);
toolStrip.Items.Add(&quot;편집&quot;);

container.TopToolStripPanel.Controls.Add(toolStrip);

TextBox textBox = new TextBox();
textBox.Multiline = true;
textBox.Dock = DockStyle.Fill;

container.ContentPanel.Controls.Add(textBox);

this.Controls.Add(container); // 폼에 추가
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조로 하면 툴바는 자동으로 위에 고정되고, 텍스트박스는 그 아래 영역 전체를 차지한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;툴바/메뉴/상태바를 자동으로 깔끔하게 정렬하고 싶을 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ToolStrip, MenuStrip, StatusStrip을 자유롭게 &lt;b&gt;위, 아래, 좌, 우로 배치/이동&lt;/b&gt;하고 싶을 때&lt;/li&gt;
&lt;li&gt;Dock = Top 등으로 수동 배치하는 것보다 &lt;b&gt;더 유연한 레이아웃 구조&lt;/b&gt;가 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  유용한 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ToolStripContainer는 ToolStrip 전용 컨테이너입니다. Panel이나 GroupBox처럼 일반 컨트롤을 다루기보단 도구막대 전용 구조&lt;/li&gt;
&lt;li&gt;ToolStrip은 사용자가 마우스로 드래그해서 다른 Panel(Top &amp;rarr; Left 등)로 이동시킬 수 있도록 설정할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 단점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;툴바/메뉴/상태바 자동 배치&lt;/td&gt;
&lt;td&gt;초보자에겐 구조가 다소 복잡할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;레이아웃 분리로 유지보수 용이&lt;/td&gt;
&lt;td&gt;일반 컨트롤에 쓰기엔 과함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다양한 방향으로 배치 가능&lt;/td&gt;
&lt;td&gt;Dock으로 충분하면 굳이 필요 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/110</guid>
      <comments>https://daraq.tistory.com/110#entry110comment</comments>
      <pubDate>Thu, 22 May 2025 11:21:12 +0900</pubDate>
    </item>
    <item>
      <title>[ C# ]  SuspendLayout, ResumeLayout - 폼/컨트롤의 레이아웃 계산을 일시 중단하기</title>
      <link>https://daraq.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SuspendLayout()&lt;/b&gt; : 윈폼(Windows Forms)에서 폼이나 컨트롤의 레이아웃 논리를 일시 중지하는 메서드. 컨트롤들을 추가하거나 위치, 크기를 변경할 때 불필요한 리렌더링과 깜빡임을 방지하고 성능을 향상시키기 위해 사용된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  요약 정의&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;this.SuspendLayout();
this.panel1.SuspendLayout();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨트롤의 레이아웃 계산을 일시 중단&lt;/li&gt;
&lt;li&gt;다수의 속성 변경, 컨트롤 추가 작업 후 ResumeLayout()으로 다시 활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;폼 로딩 시 많은 UI 변경이 있을 때&lt;/li&gt;
&lt;li&gt;레이아웃 중복 계산을 방지하고 속도 및 깜빡임을 줄이고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 예시&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;this.SuspendLayout();

Button btn1 = new Button();
btn1.Text = &quot;Button1&quot;;
btn1.Location = new Point(10, 10);

Button btn2 = new Button();
btn2.Text = &quot;Button2&quot;;
btn2.Location = new Point(10, 50);

this.Controls.Add(btn1);
this.Controls.Add(btn2);

this.ResumeLayout();         // 기본값 false (자동 레이아웃 갱신 X) True로 설정하면 바로  레이아웃 갱신
this.PerformLayout();        // 레이아웃 강제 적용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 한 줄로도 많이 쓴다:&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;this.ResumeLayout(true);   // true면 PerformLayout()을 자동 호출함
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  관련 메서드 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SuspendLayout()&lt;/td&gt;
&lt;td&gt;레이아웃 로직 일시 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResumeLayout()&lt;/td&gt;
&lt;td&gt;레이아웃 로직 다시 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PerformLayout()&lt;/td&gt;
&lt;td&gt;수동으로 레이아웃 강제 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SuspendLayout()은 Controls.Add(), Size, Location, Dock, Anchor 등을 여러 번 설정할 때 wrapping해서 사용하면 좋다.&lt;/li&gt;
&lt;li&gt;ResumeLayout(true)만 써도 대부분의 경우 충분하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 컨트롤 수정이 끝난 후에만 ResumeLayout() 호출&lt;/b&gt;해야 제대로 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/109</guid>
      <comments>https://daraq.tistory.com/109#entry109comment</comments>
      <pubDate>Wed, 21 May 2025 10:03:40 +0900</pubDate>
    </item>
    <item>
      <title>C# 인터넷 또는 제한 영역에 있거나 파일에 웹 표시가 있으므로 처리할 수 없습니다.</title>
      <link>https://daraq.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; 프로젝트 파일을 압축해제해서 빌드하려고 하는 중 뜬 오류&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcJrIP/btsNWrwkWyH/Nu8kkmQx8Nt7rl9W6PBF91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcJrIP/btsNWrwkWyH/Nu8kkmQx8Nt7rl9W6PBF91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcJrIP/btsNWrwkWyH/Nu8kkmQx8Nt7rl9W6PBF91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcJrIP%2FbtsNWrwkWyH%2FNu8kkmQx8Nt7rl9W6PBF91%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;700&quot; height=&quot;56&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;56&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;해결방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; win+x 눌러서 A (관리자모드 window powershell) 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;gci -Recurse &quot;&quot; | Unblock-File&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&quot;&quot;에 해당 폴더명 입력&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;예) gci -Recurse &quot;C:\Users\sheep\Downloads\cscs_winforms-master2\cscs_winforms-master&quot; | Unblock-File&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;이렇게하면 .resx파일들 여러개의 웹 표시를 한번에 제거할 수 있다.&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;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>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/108</guid>
      <comments>https://daraq.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 15 May 2025 09:50:07 +0900</pubDate>
    </item>
    <item>
      <title>C# 윈폼 소스코드만 보이고 디자인 안 열릴 때</title>
      <link>https://daraq.tistory.com/107</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bThZq7/btsJslrV5Hf/OUqMJOLUVwN6SfR0ht2pp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bThZq7/btsJslrV5Hf/OUqMJOLUVwN6SfR0ht2pp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bThZq7/btsJslrV5Hf/OUqMJOLUVwN6SfR0ht2pp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbThZq7%2FbtsJslrV5Hf%2FOUqMJOLUVwN6SfR0ht2pp1%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;325&quot; height=&quot;202&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;202&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;요런식으로 .cs&amp;nbsp; &amp;nbsp;.Designer.cs 파일 다 있는데 폼 디자인이 안보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스 우클릭해도 안나와서 구글링 해보니까 Visual Studio에서 코드 깃 풀받으면 종종 있는 문제라고 ..&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; csproj 코드 수정&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;프로젝트 파일 (.csproj) 우클릭해서 메모장으로 열면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725497009464&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;Compile Include=&quot;Menu\Main\frmI001.cs&quot;/&amp;gt;&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;pre id=&quot;code_1725497034803&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;Compile Include=&quot;Menu\Main\frmI001.cs&quot;&amp;gt;
      &amp;lt;SubType&amp;gt;Form&amp;lt;/SubType&amp;gt;
    &amp;lt;/Compile&amp;gt;&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;파일이름 아래에 Form 속성이 있어야 하는데 이게 빠져있어서 안보였던 것. .!.&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/107</guid>
      <comments>https://daraq.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 5 Sep 2024 09:44:51 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 파이썬 길 찾기 게임</title>
      <link>https://daraq.tistory.com/106</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1699274260481&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42892&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ejUqIF/hyUrwiFNLM/eMlhlR8OMwsVunkoueGmp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/7bCt0/hyUrAZFyA0/qOxdjGY7coiiqZ5HkNTVn0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42892&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42892&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ejUqIF/hyUrwiFNLM/eMlhlR8OMwsVunkoueGmp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/7bCt0/hyUrAZFyA0/qOxdjGY7coiiqZ5HkNTVn0/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;프로그래머스&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;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;gt;&amp;gt; 조건에서 노드가 최대 만개이므로 편향이진트리인 경우 재귀가 만번 돌게 되어서 파이썬 기본 재귀 횟수인 1000개를 넘어선다. 그래서 setrecursionlimit으로 재귀횟수를 만번으로 늘려줘야한다.&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;gt;&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;gt;&amp;gt; 주어진 노드들을 조건에 맞게 (y는 큰 값부터, x는 작은 값부터) 정렬하고 나머지는 그냥 이진트리 생성 후 전위순회 후위순회하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699274248689&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sys import setrecursionlimit
setrecursionlimit(10000)

#노드 클래스 정의
class Node(object):
    def __init__(self, info):
        self.num = info[2]  #각 노드의 초반 순서 (최종 출력에 쓰인다)
        self.pos = info[:2]  #노드의 x,y좌표
        self.left = None     #노드의 양쪽 값 초기화
        self.right = None

#nodeinfo를 입력받아서 전위순회,후위순회한 인덱스를 반환하는 함수
def solution(nodeinfo):
    for idx in range(len(nodeinfo)):  #초반 인덱스를 각 노드에 세번째 값으로 추가해준다.
        nodeinfo[idx].append(idx+1)
    
    nodeinfo.sort(key=lambda x: (-x[1], x[0]))  #y값이 큰 값부터 작아지도록, x는 작은 값부터 커지도록 정렬
    tree = Node(nodeinfo[0])  #root노드 삽입
    
    for info in nodeinfo[1:]:  #nodeinfo의 두번째 값부터 tree에 add_node함수로 삽입해준다.
        add_node(tree, info)
    
    return [pre_order(tree), post_order(tree)]

#전위탐색
def pre_order(curr):
    path =[curr.num]  #현재노드 일단 저장
    if curr.left:   #왼쪽부터 값 있는지 재귀적으로 확인
        path += pre_order(curr.left)
    if curr.right:   
        path += pre_order(curr.right)
    return path

#후위탐색
def post_order(curr):
    path =[]   #빈 배열 생성
    if curr.left:    #왼쪽부터 재귀적으로 확인
        path += post_order(curr.left)
    if curr.right:
        path += post_order(curr.right)
    path.append(curr.num)  #가장 나중값부터 추가
    return path
        
#트리에 노드 추가하는 함수
def add_node(parent,info):
    if parent.pos[0] &amp;gt; info[0]: #x값이 부모값보다 작으면 부모노드의 왼쪽으로
        if parent.left:     #근데 이제 왼쪽에 값이 이미 있다면,, 재귀적으로 다시 add_node함수 호출
            add_node(parent.left,info)
        else :              #값이 없다면 바로 부모노드 왼쪽값으로 노드 삽입
            parent.left = Node(info)
    else:
        if parent.right:
            add_node(parent.right,info)
        else:
            parent.right = Node(info)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>파이썬/백준</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/106</guid>
      <comments>https://daraq.tistory.com/106#entry106comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:51:50 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 | 파이썬 과제 진행하기</title>
      <link>https://daraq.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/176962&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/176962&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699049262884&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/176962&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dmtJkd/hyUnK9Wlnh/6Rx6j757v6tHg9eufaBpfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/v4F3M/hyUrwhU7So/HF244eXrGk3P8pQ4XsGrLk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/176962&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/176962&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dmtJkd/hyUnK9Wlnh/6Rx6j757v6tHg9eufaBpfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/v4F3M/hyUrwhU7So/HF244eXrGk3P8pQ4XsGrLk/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;프로그래머스&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;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;정답&lt;/p&gt;
&lt;pre id=&quot;code_1699049232607&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque


def solution(plans):
    
    temp = deque()
    left_time = 0
    answer = []
    
    for plan in plans:
        time=0
        a,b = plan[1].split(':')
        time = (60*int(a)) + int(b)
        plan[1] = time
        plan[2] = int(plan[2])
    
    plans = sorted(plans, key = lambda x : x[1])
    
    for i in range(len(plans)):
        sub, start_time, dur_time = plans[i]
        
        while temp:
            sub_, dur_time_ = temp.pop()
            if left_time &amp;gt;= dur_time_:
                answer.append(sub_)
                left_time -= dur_time_
            else:
                temp.append([sub_, dur_time_-left_time])
                break

        
        temp.append([sub, dur_time])
        
        if i &amp;lt; len(plans)-1:
            left_time = plans[i+1][1] - start_time
            
    while temp:
        과제, 시간 = temp.pop()
        answer.append(과제)
    
    return answer&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;gt;&amp;gt; temp에 언제 값을 넣어줄 것인지에 대한 고민이 있었다. 조건이 많아서 조건의 순서를 잘 배열해서 코드를 짜는게 중요했던 문제.&lt;/p&gt;</description>
      <category>파이썬/백준</category>
      <author>채린.__.</author>
      <guid isPermaLink="true">https://daraq.tistory.com/105</guid>
      <comments>https://daraq.tistory.com/105#entry105comment</comments>
      <pubDate>Sat, 4 Nov 2023 07:08:53 +0900</pubDate>
    </item>
  </channel>
</rss>