개요
지금까지는 Get-Process, Get-Service처럼 기존 cmdlet이 만들어 주는 객체를 다뤘다. 이 장은 반대로 직접 객체를 만드는 두 가지 방법을 다룬다 — 기존 .NET/COM 타입의 인스턴스를 생성하는 New-Object와, 속성 몇 개로 즉석에서 커스텀 객체를 만드는 [PSCustomObject]다.
정신 모델은 “이미 정의된 타입의 인스턴스가 필요하면 New-Object(또는 [type]::new()), 이 스크립트 안에서만 쓸 임시 데이터 구조가 필요하면 [PSCustomObject]“라는 역할 분담이다. 두 방법 모두 결과는 파이프라인에 흘려보낼 수 있는 객체이지만, 목적과 성능 특성이 다르다.
사용법
| |
매개변수
| 항목 | 설명 |
|---|---|
-TypeName | 생성할 .NET 타입의 정규화된 이름(System.Version 등) |
-ArgumentList(별칭 -Args) | 생성자에 전달할 인자 배열 |
-ComObject | 생성할 COM 객체의 ProgID(레거시 COM 자동화용) |
-Property | 생성 직후 설정할 속성-값 해시테이블(순서대로 적용) |
[PSCustomObject]@{ } | 해시테이블(순서 보존을 위해 [ordered]@{} 권장)을 즉시 커스텀 객체로 변환 |
예시
| |
주의사항·함정
[PSCustomObject]는 속성 순서를 그대로 보존한다: Get-Member(11장)는 결과를 알파벳순으로 보여주지만, [PSCustomObject]@{ }로 만든 객체 자체는 해시테이블에 적은 순서대로 속성을 유지한다(Format-Table로 출력할 때도 그 순서가 반영된다). 일반 @{ } 해시테이블은 순서를 보장하지 않으므로, 순서가 중요하면 [ordered]@{ }를 먼저 만든 뒤 캐스팅하는 습관을 들인다.
배열을 생성자 인자로 넘길 때 “의사 메서드 구문” 문제를 조심한다: New-Object -ArgumentList $array처럼 배열 하나를 그대로 넘기면, PowerShell은 배열의 각 원소를 개별 인자로 분해해서 시도한다. 생성자가 실제로 배열 하나를 받는 타입이라면, (, $array)처럼 바깥에 배열을 한 겹 더 씌워야 한다. 23장에서 다룬 New-Object System.Guid($bytes) 실패 사례가 같은 문제다.
[type]::new()가 대부분 더 빠르고 이 함정도 없다: .NET 타입에 정적 new() 메서드가 노출되어 있다면([System.Guid]::new($bytes)), New-Object보다 실행 속도가 빠르고 배열 인자 문제도 겪지 않는다. New-Object는 COM 객체 생성처럼 ::new() 문법이 통하지 않는 경우, 또는 타입 이름을 문자열 변수로 동적으로 받아야 하는 경우에 여전히 유용하다.
이식성: CMD·Bash에는 임의 구조의 객체를 만드는 개념이 없다 — 구조화된 데이터가 필요하면 텍스트 포맷(JSON, 구분자 있는 줄)으로 직접 인코딩해야 한다. [PSCustomObject]는 이런 임시 데이터 구조를 언어에 내장된 문법으로 즉시 만들 수 있게 해준다.
![Featured image of post [PowerShell] 27. New-Object와 [PSCustomObject]](/post/powershell/new-object-pscustomobject-powershell/wordcloud_hu_df3fdd7e88701dc1.webp)
![[PowerShell] 25. 공통 매개변수 — -Verbose/-Debug/-ErrorAction/-OutVariable](/post/powershell/common-parameters-verbose-debug-erroraction-powershell/wordcloud_hu_af2f3755ebbce019.webp)
![[PowerShell] 26. -WhatIf/-Confirm과 ShouldProcess](/post/powershell/whatif-confirm-shouldprocess-powershell/wordcloud_hu_41a4dbb601ca47c7.webp)
![[PowerShell] 27. New-Object와 [PSCustomObject]](/post/powershell/new-object-pscustomobject-powershell/wordcloud_hu_a77220cb464cca6d.webp)
![[PowerShell] 28. Add-Member — 커스텀 객체에 속성·메서드 추가](/post/powershell/add-member-command-custom-object-properties-powershell/wordcloud_hu_5d862fe677def637.webp)
![[PowerShell] 29. Write-Host vs Write-Output — 출력 스트림 오개념 정리](/post/powershell/write-host-vs-write-output-streams-powershell/wordcloud_hu_cd68b845a7c59766.webp)
![[PowerShell] 44. 해시테이블(Hashtable) 다루기](/post/powershell/hash-tables-powershell/wordcloud_hu_d1fd29269ce3c32d.webp)
![[PowerShell] 13. Select-Object — 속성 선택과 투영](/post/powershell/select-object-command-property-projection-powershell/wordcloud_hu_edd09be1027d5ea6.webp)
![[PowerShell] 60. 매개변수 스플래팅(Splatting)](/post/powershell/splatting-parameter-powershell/wordcloud_hu_af62c7747984032.webp)
![[PowerShell] 77. PowerShell 클래스(class 키워드)](/post/powershell/powershell-class-keyword-powershell/wordcloud_hu_5ff5e6ec1d4f4d49.webp)
![[PowerShell] 00. 과정 개요와 커리큘럼](/post/powershell/getting-started-powershell/wordcloud_hu_15979a96cd2a594f.webp)