<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>70세 코딩</title>
    <link>https://hackhyun.tistory.com/</link>
    <description>IT 및 프로그램 개발 관련되어 공부하고 근무 중 겪는 일들을 포스팅 합니다.
방문하시면 댓글,방명록 부탁 드립니다.</description>
    <language>ko</language>
    <pubDate>Sun, 31 May 2026 20:38:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>해나</managingEditor>
    <image>
      <title>70세 코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/534885/attach/06b3ba2805d84c1ab8ccab99a1b04ca2</url>
      <link>https://hackhyun.tistory.com</link>
    </image>
    <item>
      <title>[NSIS] .Net Framework 설치 포함</title>
      <link>https://hackhyun.tistory.com/315</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NSIS 로 설치파일을 만들 때, .Net Framework이 설치되어 있지 않은 구형 PC에서 자동으로 다운로드 및 설치가 필요한 경우가 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;물론 별도로 수동설치 하면 되겠지만 아무래도 자동으로 해당 기능이 포함되어 있으면 사용자 입장에서는 더 편리하겠죠?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 .Net Framework 4.7.2 가 시스템에 없다면 다운로드 해서 설치까지 되도록 하는 부분 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688689239338&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Section
    Call CheckDotNetFramework
SectionEnd

Function CheckDotNetFramework
    ; .NET Framework 4.7.2를 확인합니다.
    ; Release DWORD 값은 https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#find-net-framework-versions-by-viewing-the-registry 에서 찾을 수 있습니다.
    ReadRegDWORD $0 HKLM &quot;SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full&quot; &quot;Release&quot;
    IfErrors install
    IntCmpU $0 461808 install ; 461808은 .NET Framework 4.7.2의 Release 키 값입니다.
    Goto done
install:
    DetailPrint &quot;.NET Framework 4.7.2를 다운로드하고 있습니다...&quot;
    ; .NET Framework 4.7.2 설치파일을 다운로드합니다.
    nsisdl::download &quot;https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0fd66638cde16859462a6243a4629a50/ndp48-x86-x64-allos-enu.exe&quot; &quot;$TEMP\dotNetFx47_Full_setup.exe&quot;
    IfErrors downloadFailed
    DetailPrint &quot;.NET Framework 4.7.2를 설치하고 있습니다...&quot;
    ; .NET Framework 4.7.2를 설치합니다.
    ExecWait '&quot;$TEMP\dotNetFx47_Full_setup.exe&quot; /q /norestart' $0
    IfErrors installFailed
    Delete &quot;$TEMP\dotNetFx47_Full_setup.exe&quot;
    Goto done
downloadFailed:
    MessageBox MB_OK|MB_ICONSTOP &quot;Failed to download .NET Framework 4.7.2.&quot;
    Abort
installFailed:
    MessageBox MB_OK|MB_ICONSTOP &quot;Failed to install .NET Framework 4.7.2.&quot;
    Abort
done:
FunctionEnd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>.NET Framework</category>
      <category>NSIS</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/315</guid>
      <comments>https://hackhyun.tistory.com/315#entry315comment</comments>
      <pubDate>Fri, 7 Jul 2023 09:21:27 +0900</pubDate>
    </item>
    <item>
      <title>PIA(Primary Interop Assembly) 란?</title>
      <link>https://hackhyun.tistory.com/314</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PIA&lt;/span&gt;&lt;span&gt;는&lt;span&gt; .NET &lt;/span&gt;프레임워크가 처음 도입된&lt;span&gt; 2000&lt;/span&gt;년대 초반 이후부터 존재해 온 기술 입니다&lt;span&gt;. &lt;/span&gt;이 글을 통해&lt;span&gt; PIA&lt;/span&gt;에 대한 기본 개념을 익히고&lt;span&gt;, &lt;/span&gt;예제 소스를 통해 실제로 어떻게 사용되는지 알아보겠습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;1.&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Primary Interop Assembly(PIA)&lt;/span&gt;&lt;span&gt;란&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Primary Interop Assembly(PIA)&lt;/span&gt;&lt;span&gt;는 마이크로소프트에서 제공하는 기술로&lt;span&gt;, .NET &lt;/span&gt;어플리케이션에서&lt;span&gt; COM &lt;/span&gt;기반의 컴포넌트를 사용할 수 있게 도와주는 역할을 합니다&lt;span&gt;. &lt;/span&gt;여기서&lt;span&gt; COM(Component Object Model)&lt;/span&gt;은 마이크로소프트에서 개발한 프로그래밍 인터페이스로&lt;span&gt;, &lt;/span&gt;개발자들이 객체 지향 프로그래밍을 통해 모듈화된 소프트웨어를 개발할 수 있도록 도와줍니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;간단히 말해&lt;span&gt;, PIA&lt;/span&gt;는&lt;span&gt; .NET &lt;/span&gt;환경에서&lt;span&gt; COM &lt;/span&gt;기반의 컴포넌트를 사용할 수 있게 해주는&lt;span&gt; &quot;&lt;/span&gt;다리&lt;span&gt;&quot; &lt;/span&gt;역할을 하는 것입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;2.&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;왜&lt;span&gt; PIA&lt;/span&gt;가 필요한가&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그렇다면 왜&lt;span&gt; PIA&lt;/span&gt;가 필요할까요&lt;span&gt;? &lt;/span&gt;이는&lt;span&gt; .NET&lt;/span&gt;과&lt;span&gt; COM &lt;/span&gt;기반 컴포넌트 간에 런타임 환경의 차이 때문입니다&lt;span&gt;. .NET&lt;/span&gt;은 고유의 런타임 환경인&lt;span&gt; CLR(Common Language Runtime)&lt;/span&gt;을 사용하며&lt;span&gt;, COM &lt;/span&gt;기반 컴포넌트는&lt;span&gt; Win32 &lt;/span&gt;기반의 네이티브 런타임 환경을 가지고 있습니다&lt;span&gt;. &lt;/span&gt;이러한 차이로 인해 두 시스템 간에 직접적인 통신이 어렵습니다&lt;span&gt;. &lt;/span&gt;따라서&lt;span&gt; PIA&lt;/span&gt;를 사용하여&lt;span&gt; .NET&lt;/span&gt;과&lt;span&gt; COM &lt;/span&gt;간의 통신을 원활하게 만들어주는 것이 필요한 것입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;3.&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;PIA &lt;/span&gt;&lt;span&gt;작동 원리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞서 말한 바와 같이 PIA&lt;/span&gt;&lt;span&gt;는&lt;span&gt; .NET &lt;/span&gt;어플리케이션에서&lt;span&gt; COM &lt;/span&gt;기반 컴포넌트를 사용할 수 있게 해주는&lt;span&gt; &quot;&lt;/span&gt;다리&lt;span&gt;&quot; &lt;/span&gt;역할을 합니다&lt;span&gt;. &lt;/span&gt;이는&lt;span&gt; COM Callable Wrapper (CCW)&lt;/span&gt;와&lt;span&gt; Runtime Callable Wrapper (RCW) &lt;/span&gt;두 가지 방식으로 이루어집니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span&gt;COM Callable Wrapper (CCW): .NET&lt;/span&gt;&lt;span&gt;에서 개발된 객체를&lt;span&gt; COM &lt;/span&gt;기반 컴포넌트가 호출할 수 있도록 해주는 기능입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span&gt;Runtime Callable Wrapper (RCW): COM &lt;/span&gt;&lt;span&gt;기반 컴포넌트를&lt;span&gt; .NET &lt;/span&gt;어플리케이션에서 호출할 수 있도록 해주는 기능입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;4.&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;PIA &lt;/span&gt;&lt;span&gt;생성 및 참조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PIA&lt;/span&gt;&lt;span&gt;는 특별한 형태의 어셈블리로&lt;span&gt;, COM &lt;/span&gt;컴포넌트의 메타데이터를 포함하며 이를&lt;span&gt; .NET &lt;/span&gt;환경에서 사용할 수 있도록 해줍니다&lt;span&gt;. PIA&lt;/span&gt;를 생성하려면 먼저&lt;span&gt; COM &lt;/span&gt;컴포넌트의 타입 라이브러리&lt;span&gt;(Type Library)&lt;/span&gt;를&lt;span&gt; .NET &lt;/span&gt;어셈블리로 변환해야 합니다&lt;span&gt;. &lt;/span&gt;이를 위해 마이크로소프트에서 제공하는&lt;span&gt; Type Library Importer(tlbimp.exe) &lt;/span&gt;도구를 사용할 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어&lt;span&gt;, COM &lt;/span&gt;컴포넌트인&lt;span&gt; Microsoft Excel&lt;/span&gt;의&lt;span&gt; PIA&lt;/span&gt;를 생성하려면 다음 명령을 실행합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679378980774&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tlbimp.exe &quot;C:\Path\To\Excel.tlb&quot; /out:&quot;C:\Path\To\Output\Microsoft.Office.Interop.Excel.dll&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;명령을 실행한 후&lt;span&gt;, &lt;/span&gt;생성된&lt;span&gt; PIA&lt;/span&gt;를&lt;span&gt; .NET &lt;/span&gt;프로젝트에 참조해야 합니다&lt;span&gt;. Visual Studio&lt;/span&gt;에서 참조를 추가하는 방법은 다음과 같습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span&gt;프로젝트를 마우스 오른쪽 버튼으로 클릭한 후&lt;span&gt;, '&lt;/span&gt;참조 추가&lt;span&gt;'&lt;/span&gt;를 선택합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;찾아보기&lt;span&gt;' &lt;/span&gt;탭을 클릭한 후&lt;span&gt;, &lt;/span&gt;생성된&lt;span&gt; PIA dll &lt;/span&gt;파일을 찾아 선택합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;확인&lt;span&gt;'&lt;/span&gt;을 클릭하여 참조를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경우에 따라 COM 컴포넌트 제작 업체에서 해당 제품에 대한 공식 PIA를 제공할 수 있습니다. 이러한 PIA는 COM 컴포넌트와의 통합이 잘 이루어지도록 최적화되어 있을 수 있으며, 업체에서 지원되는 방식으로 사용하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한&lt;span&gt; Visual Studio&lt;/span&gt;에서는&lt;span&gt; &quot;&lt;/span&gt;참조 추가&lt;span&gt;&quot; &lt;/span&gt;대화상자를 통해&lt;span&gt; COM &lt;/span&gt;컴포넌트를 선택함으로써, 자동으로 해당 COM 컴포넌트(구성요소)에 대한 런타임 호출 가능 래퍼(Runtime Callable Wrapper, RCW)가 생성됩니다. 이 RCW는 PIA와 비슷한 역할을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Visual Studio에서 COM 컴포넌트를 참조하려면 다음과 같이 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;프로젝트를 마우스 오른쪽 버튼으로 클릭한 후, '참조 추가'를 선택합니다.&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;'COM'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;탭을 클릭한 후&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;원하는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;COM&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컴포넌트를 선택합니다.&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;'확인'을 클릭하여 참조를 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면, COM 컴포넌트를 사용할 수 있는 인터페이스가 포함된 interop 어셈블리가 자동으로 생성되고 프로젝트에 추가됩니다. 이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;interop&lt;span&gt; &lt;/span&gt;&lt;/span&gt;어셈블리는 PIA와 유사한 기능을 수행하며, 프로젝트에서 COM 컴포넌트의 기능을 사용할 수 있게 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;5.&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;예제 소스&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래 예제에서는&lt;span&gt; .NET&lt;/span&gt;에서&lt;span&gt; COM &lt;/span&gt;기반 컴포넌트를 사용하는 방법을 살펴보겠습니다&lt;span&gt;. &lt;/span&gt;이 예제에서는 마이크로소프트 엑셀&lt;span&gt;(Microsoft Excel)&lt;/span&gt;을&lt;span&gt; COM &lt;/span&gt;기반 컴포넌트로 사용합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679379090802&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelInteropExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 엑셀 애플리케이션 객체 생성 (PIA를 사용하여 COM 컴포넌트를 호출)
            Excel.Application excelApp = new Excel.Application();
            // 엑셀 파일을 새로 생성하거나 기존 파일을 열기
            Excel.Workbook workbook = excelApp.Workbooks.Add();
            Excel.Worksheet worksheet = workbook.ActiveSheet;

            // 셀에 데이터 입력
            worksheet.Cells[1, 1] = &quot;Hello&quot;;
            worksheet.Cells[1, 2] = &quot;World&quot;;

            // 엑셀 파일 저장
            workbook.SaveAs(&quot;C:\\Path\\To\\Output\\Sample.xlsx&quot;);

            // 엑셀 애플리케이션 및 워크북 종료
            workbook.Close();
            excelApp.Quit();

            // COM 객체 메모리 해제
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

            Console.WriteLine(&quot;Excel file created successfully!&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; PIA와&amp;nbsp;관련된&amp;nbsp;기술들은&amp;nbsp;지속적으로&amp;nbsp;발전하고&amp;nbsp;있으며,&amp;nbsp;이에&amp;nbsp;따라&amp;nbsp;개발자들이&amp;nbsp;상호&amp;nbsp;운용성을&amp;nbsp;확보하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;노력이&amp;nbsp;점점&amp;nbsp;줄어들고&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;.NET&amp;nbsp;Core와&amp;nbsp;.NET&amp;nbsp;5에서는&amp;nbsp;COM&amp;nbsp;호스트를&amp;nbsp;통해&amp;nbsp;PIA&amp;nbsp;없이도&amp;nbsp;COM&amp;nbsp;기반&amp;nbsp;컴포넌트를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;되었습니다.&amp;nbsp;이러한&amp;nbsp;발전을&amp;nbsp;통해&amp;nbsp;앞으로&amp;nbsp;상호&amp;nbsp;운용성이&amp;nbsp;더욱&amp;nbsp;간편하고&amp;nbsp;효율적으로&amp;nbsp;구현될&amp;nbsp;것으로&amp;nbsp;예상됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>.net</category>
      <category>COM</category>
      <category>PIA</category>
      <category>Primary Interop Assembly</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/314</guid>
      <comments>https://hackhyun.tistory.com/314#entry314comment</comments>
      <pubDate>Tue, 21 Mar 2023 15:26:22 +0900</pubDate>
    </item>
    <item>
      <title>COM 개체와 타입 라이브러리(Type Library)</title>
      <link>https://hackhyun.tistory.com/313</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;COM(Components Object Model, COM)은 마이크로소프트에서 개발한 소프트웨어 컴포넌트 기술로, 다른 소프트웨어에서 사용할 수 있는 기능을 제공하는 객체지향 프로그래밍 모델입니다. COM 개체는 이식성이 좋고, 다른 프로그램과 상호작용할 수 있는 인터페이스를 제공합니다. 일반적으로 COM 개체는 DLL(Dynamic-Link Library) 파일 혹은 EXE(Executable) 파일에 구현될 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 라이브러리(Type Library)는 COM 개체가 제공하는 인터페이스와 메서드, 프로퍼티 등의 정보를 포함하는 라이브러리입니다. 이 정보를 바탕으로 개발자들은 다른 프로그램에서 COM 개체를 사용할 때 필요한 코드를 작성할 수 있습니다. 타입 라이브러리는 주로 TLB 확장자를 갖는 별도의 파일에 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM 개체와 타입 라이브러리는 서로 밀접한 관계를 갖습니다. COM 개체를 만들 때에는 해당 개체가 제공하는 인터페이스와 메서드 등을 타입 라이브러리에 정의하고 등록해야 합니다. 그리고 다른 프로그램에서 COM 개체를 사용할 때에는 해당 개체의 타입 라이브러리를 참조하여 개체의 인터페이스와 메서드를 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 COM 개체와 타입 라이브러리는 서로 보완적인 역할을 수행합니다. COM 개체는 기능을 제공하고, 타입 라이브러리는 해당 개체의 인터페이스와 메서드 등을 정의하여 개발자들이 COM 개체를 사용할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하자면 타입 라이브러리는 COM 개체에 대한 메뉴판이라고 할 수 있습니다.&amp;nbsp;메뉴판을 보면 어떤 음식이 있는지, 그 음식이 어떻게 만들어졌는지, 어떤 재료로 만들어졌는지 등에 대한 정보를 얻을 수 있습니다. 마찬가지로 타입 라이브러리를 보면 COM개체에 어떤 인터페이스와 메서드가 있는지, 그 인터페이스와 메서드, 프로퍼티 등을 어떻게 사용해야 하는지, 어떤 인자를 전달해야 하는지 등에 대한 정보를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개발자들은 타입 라이브러리를 참조하여 COM 개체의 인터페이스와 메서드 등에 대한 정보를 얻고, 이를 바탕으로 COM 개체를 사용하는 코드를 작성할 수 있습니다.&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>COM</category>
      <category>type library</category>
      <category>타입 라이브러리</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/313</guid>
      <comments>https://hackhyun.tistory.com/313#entry313comment</comments>
      <pubDate>Tue, 21 Mar 2023 13:56:56 +0900</pubDate>
    </item>
    <item>
      <title>RCW(Runtime Callable Wrapper)란</title>
      <link>https://hackhyun.tistory.com/312</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;런타임 Callable Wrapper(RCW)는 COM(Component Object Model) 기술을 사용하여 .NET 언어와 같은 매니지드 언어에서 COM 개체를 호출할 때 사용되는 개체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM 개체는 C++과 같은 비매니지드 언어로 작성되며, 매니지드 언어에서 직접 호출할 수 없습니다. 따라서 RCW는 COM 개체와 매니지드 언어 간의 인터페이스 역할을 합니다. RCW는 COM 개체에 대한 참조를 포함하며, 해당 개체를 호출하기 위해 필요한 래퍼 코드를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RCW는 .NET에서 COM 개체를 사용할 때 중요한 역할을 합니다. RCW를 사용하면 매니지드 코드에서 COM 개체를 사용하기 쉬워지며, COM 개체와 .NET 런타임 간의 상호 운용성을 개선할 수 있습니다. 또한 RCW는 .NET 언어에서 COM 개체를 사용하기 위해 필요한 다양한 기능, 예를 들어 자동 메모리 관리 및 예외 처리와 같은 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RCW는 .NET Framework에서 제공하는 기능 중 하나이며, 개발자가 직접 만들 필요가 없습니다. RCW는 .NET에서 COM 개체를 사용하기 위해 필요한 인터페이스를 런타임에 해당 개체에 대한 인스턴스를 생성할 때마다 동적으로 자동으로 생성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RCW가 동적으로 생성되는 이유는 COM 개체가 .NET Framework의 메모리 관리와 스레딩 모델과 다르게 동작하기 때문입니다. RCW는 .NET Framework에서 COM 개체를 호출하기 위해 필요한 래퍼 코드를 생성하며, 이를 통해 .NET Framework와 COM 개체 간의 상호 작용을 보다 효율적으로 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RCW는 가비지 컬렉션 처리도 담당합니다. 해당 COM 개체가 더 이상 필요하지 않은 경우, RCW는 개체에 대한 참조를 해제하고 메모리를 해제합니다.&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>.net</category>
      <category>COM</category>
      <category>RCW</category>
      <category>Runtime Callable Wrapper</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/312</guid>
      <comments>https://hackhyun.tistory.com/312#entry312comment</comments>
      <pubDate>Tue, 21 Mar 2023 09:34:24 +0900</pubDate>
    </item>
    <item>
      <title>COM 구성 요소란</title>
      <link>https://hackhyun.tistory.com/311</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;COM 구성 요소(COM Component)란, Component Object Model(COM) 기술을 사용하여 개발된 소프트웨어 컴포넌트를 말합니다. COM 구성 요소는 다른 소프트웨어에서 사용될 수 있는 기능을 제공하며, 다른 소프트웨어에서 COM 구성 요소를 사용하여 개발을 쉽게 할 수 있도록 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM 구성 요소는 다른 소프트웨어에서 사용될 수 있는 기능을 제공하므로, 다른 소프트웨어와의 상호 운용성을 보장할 수 있습니다. 예를 들어, Microsoft Office의 Word나 Excel 같은 프로그램은 COM 구성 요소를 사용하여 외부 프로그램에서 사용할 수 있는 기능을 제공합니다. 이러한 COM 구성 요소를 사용하여, 다른 소프트웨어에서는 Word나 Excel과 같은 프로그램의 문서를 열고, 저장하고, 인쇄하는 등의 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM 구성 요소는 COM 인터페이스를 구현하며, COM 인터페이스는 COM 구성 요소에서 제공하는 기능에 대한 명세서 역할을 합니다. 따라서, 다른 소프트웨어에서 COM 구성 요소를 사용하기 위해서는, COM 인터페이스에 대한 정보를 얻을 필요가 있습니다. 이러한 COM 인터페이스를 사용하여, 다른 소프트웨어에서 COM 구성 요소를 호출할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM 구성 요소는 다음과 같은 요소들로 이루어져 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인터페이스: COM 구성 요소는 하나 이상의 인터페이스를 가지며, 이를 통해 다른 소프트웨어와 통신합니다. 인터페이스는 일종의 계약서 역할을 합니다. 즉, 다른 소프트웨어는 해당 인터페이스가 제공하는 메서드와 속성만 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;클래스: COM 구성 요소는 클래스를 가지며, 이를 통해 구성 요소의 인스턴스를 생성합니다. 클래스는 일종의 템플릿 역할을 합니다. 즉, 클래스를 사용하여 여러 개의 COM 구성 요소 인스턴스를 생성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;레지스트리: COM 구성 요소는 레지스트리에 등록됩니다. COM 구성 요소의 클래스 ID(CLASSID)와 프로그램 ID(PROGID)를 저장합니다. 다른 소프트웨어가 해당 COM 구성 요소를 사용하려면, 해당 COM 구성 요소가 레지스트리에 등록되어 있어야 합니다.&lt;/li&gt;
&lt;li&gt;라이브러리: COM 구성 요소는 파일형태(DLL 및 EXE)로 라이브러리에 저장됩니다. 라이브러리는 COM 구성 요소가 제공하는 인터페이스와 클래스의 정보를 담고 있습니다. 다른 소프트웨어가 해당 COM 구성 요소를 사용하려면, 해당 COM 구성 요소의 라이브러리가 등록되어 있어야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-cke-filler-webkit=&quot;end&quot; data-cke-temp=&quot;1&quot;&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>개발정보</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/311</guid>
      <comments>https://hackhyun.tistory.com/311#entry311comment</comments>
      <pubDate>Mon, 20 Mar 2023 21:38:57 +0900</pubDate>
    </item>
    <item>
      <title>[.net] interop 과 p/invoke</title>
      <link>https://hackhyun.tistory.com/310</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wobjN/btr415vNfjU/kMvMl7BzZDyaComcLxLAMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wobjN/btr415vNfjU/kMvMl7BzZDyaComcLxLAMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wobjN/btr415vNfjU/kMvMl7BzZDyaComcLxLAMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwobjN%2Fbtr415vNfjU%2FkMvMl7BzZDyaComcLxLAMK%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;450&quot; height=&quot;450&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interop(Interoperability)는 서로 다른 프로그래밍 언어, 플랫폼, 기술 등 간의 상호 운용성을 지원하는 기술입니다. 특히, .NET 언어에서 Interop은 다른 플랫폼이나 라이브러리 등을 사용할 수 있도록 하는 방법을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interop은 COM(Component Object Model)과 관련된 기술로 시작되었습니다. COM은 Microsoft에서 개발한 프로그래밍 모델로, 다른 프로그래밍 언어나 플랫폼에서 COM 구성 요소를 사용할 수 있도록 하는 Interop 기술을 제공합니다. 이후 .NET Framework가 등장하면서 Interop 기술은 COM 뿐만 아니라 다른 플랫폼, 기술과도 상호 운용성을 지원하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interop은 Windows 운영 체제에서 사용되는 외부 binary와 상호 작용할 수 있도록 해주는 기술입니다. Interop은 COM Interop, P/Invoke 및 C++ Interop을 포함한 .NET Framework의 다양한 상호 운용 기술을 일컫는 말입니다. 따라서 P/Invoke는 Interop 기술 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P/Invoke와 COM Interop은 각각 다른 방식으로 Interop을 지원합니다. P/Invoke는 C/C++ 함수를 선언하고, 해당 함수를 호출하는 방식으로 상호 운용성을 지원합니다. COM Interop은 COM 구성 요소를 .NET 언어에서 사용할 수 있는 클래스로 래핑하여 상호 운용성을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM Interop의 주요 용도로서 Microsoft Office 제품군과의 상호 운용성이 있습니다. C#과 같은 .NET Framework 언어로 작성된 애플리케이션에서 Microsoft Word 문서를 조작하려면, COM Interop을 사용하여 Word의 COM 객체 모델에 액세스해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COM Interop을 사용하여 Word와의 상호 운용성을 지원하는 코드 예제는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1679312905044&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Word = Microsoft.Office.Interop.Word;

// Word Application 인스턴스 생성
Word.Application wordApp = new Word.Application();

// Word Document 인스턴스 생성
Word.Document wordDoc = wordApp.Documents.Add();

// Document 내용 수정
Word.Paragraph para1 = wordDoc.Content.Paragraphs.Add();
para1.Range.Text = &quot;Hello, World!&quot;;

// Document 저장
wordDoc.SaveAs2(&quot;C:\\Temp\\Hello.docx&quot;);

// Word 종료
wordDoc.Close();
wordApp.Quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;P/Invoke는 Platform Invocation Services의 약자로, .NET Framework에서 C# 또는 다른 .NET 언어로 C/C++ 외부 DLL 함수를 호출하는 방법을 제공합니다. 즉 P/Invoke를 사용하여 Win32 API를 포함한 C/C++ DLL 함수를 호출할 수 있으며, 이를 통해 .NET으로 개발되지 않은 기존의 많은 DLL의 기능을 활용할 수 있습니다. &lt;br /&gt;&lt;br /&gt;P/Invoke는 외부 DLL 함수를 호출하기 위해 일반적으로 DllImport 어트리뷰트를 사용합니다. DllImport 어트리뷰트는 해당 DLL 파일과 함수의 이름을 지정하고, 필요한 경우 함수 매개변수 및 반환 값에 대한 정보를 제공합니다. &lt;br /&gt;&lt;br /&gt;예를 들어, C#에서 Win32 API 함수 중 MessageBox 함수를 호출하려면 다음과 같이 DllImport 어트리뷰트를 사용하여 함수 이름을 지정하고, 필요한 경우 함수 매개변수 및 반환 값에 대한 정보를 제공해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1679309190972&quot; class=&quot;cs&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[DllImport(&quot;user32.dll&quot;, CharSet = CharSet.Auto)]
public static extern MessageBoxResult MessageBox(IntPtr hWnd, string text, string caption, uint type);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P/Invoke를 사용할 때는 또한 해당 함수의 호출 규약(calling convention)과 매개변수의 전달 방식 등을 고려해야 합니다. 대부분의 DLL 함수는 C 언어 기반으로 작성되므로, C calling convention을 사용하며, 일부 함수는 STDCALL calling convention을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P/Invoke를 사용하여 C/C++ DLL 함수를 호출할 때는 함수 매개변수 및 반환 값의 자료형이 호환되어야 합니다. 예를 들어, C#에서 int 자료형은 C/C++에서 int 자료형과 호환되지만, string 자료형은 C/C++에서 wchar_t 배열과 호환되므로 이에 대한 변환 작업이 필요합니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 때 호출하는 함수와 .NET 언어 간에 데이터 형식이 다른 경우에는 마샬링(marshaling) 기술이 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마샬링은 서로 다른 프로그래밍 언어나 환경에서 데이터를 주고받을 때 데이터의 형식을 변환하는 과정입니다.&amp;nbsp;P/Invoke에서도 호출하는 함수와 .NET 언어 간에 데이터 형식이 다른 경우에는 이를 변환하는 마샬링 기술이 사용됩니다. P/Invoke에서는 이러한 마샬링 과정을 자동으로 처리해주는 기능을 제공하며, 일부 자료형의 경우에는 사용자가 직접 변환 과정을 처리해주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 P/Invoke를 위한 Win32 API의 메소드 원형을 쉽게 작성하기 위해서는 &lt;a href=&quot;http://pinvoke.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pinvoke.net&lt;/a&gt; 사이트를 이용하면 편리 합니다.&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>API</category>
      <category>COM</category>
      <category>interop</category>
      <category>p/invoke</category>
      <category>win32</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/310</guid>
      <comments>https://hackhyun.tistory.com/310#entry310comment</comments>
      <pubDate>Mon, 20 Mar 2023 21:18:59 +0900</pubDate>
    </item>
    <item>
      <title>[SQL서버] IDENT_CURRENT(), SCOPE_IDENTITY() 및 @@IDENTITY 차이점</title>
      <link>https://hackhyun.tistory.com/309</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IDENT_CURRENT(), SCOPE_IDENTITY(), 그리고 @@IDENTITY는 모두 SQL Server에서 IDENTITY 값을 반환하는 데 사용됩니다. 하지만 이들 간에는 몇 가지 차이점이 있습니다. 반환된 값이 현재 세션과 범위에 따라 다를 수 있으므로, 사용할 때는 주의해야 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IDENT_CURRENT()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDENT_CURRENT() 함수는 임의 세션 및 범위에 있는 특정 테이블에 생성된 &lt;span&gt;IDENTITY&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;값을 반환합니다. 현재 세션이 아닌 다른 세션에서 해당 테이블에 마지막으로 데이터가 INSERT된 경우 그 값을 가져오므로 주의해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 지정한 테이블에 데이터가 하나도 없는 경우에 0이 아닌 1이 리턴되는 점도 유의할 필요가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래의 쿼리는 &quot;Orders&quot; 테이블에서 마지막으로 생성된 IDENTITY 값을 반환합니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1676418284374&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT IDENT_CURRENT('Orders');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SCOPE_IDENTITY()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCOPE_IDENTITY() 함수는 현재 세션 및 범위 내에서 마지막으로 생성된 IDENTITY 값을 반환합니다. 이 함수는 현재 실행 중인 스크립트 또는 저장 프로시저에서 마지막으로 생성된 IDENTITY 값을 반환합니다. 다른 세션이나 트리거에서 생성된 IDENTITY 값은 반환하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래의 쿼리는 &quot;Orders&quot; 테이블에 새로운 행을 삽입하고, 해당 행의 IDENTITY 값을 반환합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1676418387940&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO Orders (CustomerID, OrderDate) 
VALUES ('ALFKI', '2023-01-01'); 

SELECT SCOPE_IDENTITY();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;@@IDENTITY&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@@IDENTITY 함수는 현재 세션에서 마지막으로 생성된 IDENTITY 값을 반환합니다.&amp;nbsp; 만약 테이블에 트리거가 있고, 트리거에서 다른 테이블에 삽입된 행이 IDENTITY 값이 있는 경우 이를 반환 하게 되므로&amp;nbsp;사용에 주의 해야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <category>@@IDENTITY</category>
      <category>IDENT_CURRENT()</category>
      <category>SCOPE_IDENTITY()</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/309</guid>
      <comments>https://hackhyun.tistory.com/309#entry309comment</comments>
      <pubDate>Wed, 15 Feb 2023 09:32:34 +0900</pubDate>
    </item>
    <item>
      <title>[C#] params 키워드</title>
      <link>https://hackhyun.tistory.com/308</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C#에서는 메서드에 파라미터를 전달할 때, 개수가 정해지지 않은 경우 params 키워드를 사용할 수 있습니다. params 키워드를 사용하면, 메서드 호출 시 전달되는 인자의 개수를 동적으로 결정할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;params 키워드의 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;params 키워드는 메서드의 파라미터 선언에서 가변 개수의 인자를 받을 파라미터에 사용됩니다. params 키워드 다음에는 배열의 형태로 받을 인자의 자료형을 명시합니다. 예를 들어, 아래와 같이 선언된 Sum 메서드는 params 키워드를 사용하여 가변 개수의 정수형 인자를 받습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676415577583&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static int Sum(params int[] numbers) {
  int sum = 0;
  foreach(int number in numbers) {
    sum += number;
  }
  return sum;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;params&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드로 선언된 매개변수를 사용하여 메서드를 호출할 때에는 두가지 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개별 인수로 호출:&lt;span&gt;&amp;nbsp;&lt;/span&gt;params&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드로 선언된 매개변수에 다음과 같이 가변 인수를 전달할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676417235847&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int result = Sum(1, 2, 3, 4, 5); // 15&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 배열로 호출:&lt;span&gt;&amp;nbsp;&lt;/span&gt;params&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드로 선언된 매개변수에 배열 형태로 전달할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676417251504&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] myArray = { 1, 2, 3, 4, 5 };
int result = Sum(myArray);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;params 키워드 사용 시 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;params 키워드를 사용할 때는 다음과 같은 주의점이 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;params 키워드를 사용하는 파라미터는 하나만 선언할 수 있습니다.&lt;/li&gt;
&lt;li&gt;params 키워드로 선언된 파라미터는 메서드의 마지막 파라미터로 선언되어야 합니다.&lt;/li&gt;
&lt;li&gt;params 키워드를 사용하는 파라미터는 기본값을 설정할 수 없습니다.&lt;/li&gt;
&lt;li&gt;params 키워드를 사용하는 파라미터는 ref 또는 out으로 전달될 수 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>c#</category>
      <category>params</category>
      <category>매개 변수 배열</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/308</guid>
      <comments>https://hackhyun.tistory.com/308#entry308comment</comments>
      <pubDate>Wed, 15 Feb 2023 08:29:17 +0900</pubDate>
    </item>
    <item>
      <title>[C#] Initializer(이니셜라이저)의 종류와 사용법</title>
      <link>https://hackhyun.tistory.com/307</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;이니셜라이저(Initializer)&quot;는&amp;nbsp;객체를&amp;nbsp;생성할&amp;nbsp;때&amp;nbsp;각&amp;nbsp;프로퍼티의&amp;nbsp;값을&amp;nbsp;직접&amp;nbsp;지정하여&amp;nbsp;객체를&amp;nbsp;초기화하는&amp;nbsp;기능을&amp;nbsp;의미합니다.&amp;nbsp;이니셜라이저를&amp;nbsp;사용하면,&amp;nbsp;객체&amp;nbsp;생성&amp;nbsp;코드를&amp;nbsp;간결하고&amp;nbsp;직관적으로&amp;nbsp;작성할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C#에서는 여러 종류의 Initializer를 사용할 수 있습니다. 아래에서는 각 Initializer의 종류와 사용법에 대해 살펴보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Object Initializer (객체 이니셜라이저)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 생성한 후 각 프로퍼티의 값을 직접 지정하여 객체를 초기화할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;vbscript&quot;&gt;&lt;code&gt;class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}

Car myCar = new Car
{
    Make = &quot;Toyota&quot;,
    Model = &quot;Camry&quot;,
    Year = 2019
};&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Collection Initializer (컬렉션 이니셜라이저)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬렉션 객체를 생성할 때 원소를 초기화할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[참고] &lt;br /&gt;&quot;컬렉션(Collection)&quot;이란, 하나의 데이터 구조로서 여러 개의 객체를 담을 수 있는 구조를 의미합니다. 컬렉션은 배열과 마찬가지로 여러 개의 객체를 담을 수 있지만, 배열과는 달리 컬렉션은 동적으로 크기를 조절할 수 있습니다.&lt;br /&gt;C#에서 제공하는 컬렉션 클래스로는 List, ArrayList, Dictionary, HashSet, Queue, Stack 등이 있습니다. 이들 클래스를 사용하여 객체들을 저장, 검색, 정렬, 순회 등의 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;List&amp;lt;int&amp;gt; numbers = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5 };&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Array Initializer (배열 이니셜라이저)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 객체를 생성할 때 원소를 초기화할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int[] numbers = new int[] { 1, 2, 3, 4, 5 };&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Anonymous Type Initializer (익명 타입 이니셜라이저)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명 타입을 생성할 때 프로퍼티 값을 직접 지정할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;var car = new { Make = &quot;Toyota&quot;, Model = &quot;Camry&quot;, Year = 2019 };&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. String Interpolation Initializer (문자열 보간 이니셜라이저)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 내에 변수의 값을 직접 넣어서 새로운 문자열을 생성하는 문자열 보간 처리를 할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;string message = $&quot;The car is a {myCar.Year} {myCar.Make} {myCar.Model}.&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>c#</category>
      <category>Initializer</category>
      <category>객체 이니셜라이저</category>
      <category>문자열 보간 이니셜라이저</category>
      <category>배열 이니셜라이저</category>
      <category>이니셜라이저</category>
      <category>익명 타입 이니셜라이저</category>
      <category>컬렉션 이니셜라이저</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/307</guid>
      <comments>https://hackhyun.tistory.com/307#entry307comment</comments>
      <pubDate>Mon, 13 Feb 2023 05:42:10 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 객체 초기화</title>
      <link>https://hackhyun.tistory.com/306</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C#에서&amp;nbsp;객체를&amp;nbsp;초기화하는&amp;nbsp;방법은&amp;nbsp;여러가지가&amp;nbsp;있습니다.&amp;nbsp;가장&amp;nbsp;기본적인&amp;nbsp;방법은&amp;nbsp;객체를&amp;nbsp;생성한&amp;nbsp;후&amp;nbsp;각&amp;nbsp;프로퍼티를&amp;nbsp;따로&amp;nbsp;지정하는&amp;nbsp;것입니다.&lt;/p&gt;
&lt;pre class=&quot;vbscript&quot;&gt;&lt;code&gt;class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}
&amp;nbsp;
Car myCar = new Car();
myCar.Make = &quot;Toyota&quot;;
myCar.Model = &quot;Camry&quot;;
myCar.Year = 2019;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또&amp;nbsp;다른&amp;nbsp;방법으로는&amp;nbsp;생성자를&amp;nbsp;통한&amp;nbsp;객체&amp;nbsp;초기화가&amp;nbsp;있습니다.&amp;nbsp;생성자를&amp;nbsp;통해&amp;nbsp;객체를&amp;nbsp;생성할&amp;nbsp;때&amp;nbsp;필요한&amp;nbsp;프로퍼티&amp;nbsp;값들을&amp;nbsp;매개변수로&amp;nbsp;전달할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre class=&quot;vbscript&quot;&gt;&lt;code&gt;class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
&amp;nbsp;
    public Car(string make, string model, int year)
    {
        Make = make;
        Model = model;
        Year = year;
    }
}
&amp;nbsp;
Car myCar = new Car(&quot;Toyota&quot;, &quot;Camry&quot;, 2019);
&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로,&amp;nbsp;C#에서는&amp;nbsp;Object&amp;nbsp;Initializer&amp;nbsp;문법을&amp;nbsp;사용하여&amp;nbsp;객체를&amp;nbsp;초기화할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;문법을&amp;nbsp;사용하면&amp;nbsp;객체를&amp;nbsp;생성할&amp;nbsp;때&amp;nbsp;필요한&amp;nbsp;프로퍼티&amp;nbsp;값들을&amp;nbsp;직접&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre class=&quot;vbscript&quot;&gt;&lt;code&gt;class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}
&amp;nbsp;
Car myCar = new Car
{
    Make = &quot;Toyota&quot;,
    Model = &quot;Camry&quot;,
    Year = 2019
};
&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서는 new Car 이후에 각 프로퍼티의 값을 직접 지정하여 객체를 초기화하고 있습니다. 단, 값을 지정할 수 있는 것은 public 속성(property)만 가능 합니다.&lt;br /&gt;&lt;br /&gt;위에서&amp;nbsp;언급한&amp;nbsp;3가지&amp;nbsp;방법&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;편리한&amp;nbsp;방법은&amp;nbsp;Object&amp;nbsp;Initializer&amp;nbsp;문법이며,&amp;nbsp;이&amp;nbsp;문법을&amp;nbsp;사용하면&amp;nbsp;간결하고&amp;nbsp;직관적인&amp;nbsp;코드를&amp;nbsp;작성할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;</description>
      <category>개발정보</category>
      <category>c#</category>
      <category>Object Initializer</category>
      <category>객체 이니셜라이저</category>
      <category>객체 초기화</category>
      <author>해나</author>
      <guid isPermaLink="true">https://hackhyun.tistory.com/306</guid>
      <comments>https://hackhyun.tistory.com/306#entry306comment</comments>
      <pubDate>Mon, 13 Feb 2023 05:13:53 +0900</pubDate>
    </item>
  </channel>
</rss>