개요
PowerShell 5.0부터 class 키워드로 사용자 정의 타입을 직접 만들 수 있다. 27장에서 [PSCustomObject]로 임시 객체를 만들었다면, class는 그 객체가 항상 같은 속성 구조와 동작(메서드)을 갖도록 청사진을 정의한다는 점이 다르다 — [PSCustomObject]가 즉석에서 찍어낸 객체 하나라면, 클래스는 같은 모양의 객체를 몇 개든 찍어낼 수 있는 틀이다.
정신 모델은 “클래스는 속성(데이터)과 메서드(그 데이터로 할 수 있는 동작)를 하나로 묶은 새로운 타입 정의"라는 것이다. 인스턴스를 만들면 [타입]::new(...) 문법으로 그 청사진에서 실제 객체가 찍혀 나온다.
사용법
| |
종류
| 요소 | 설명 |
|---|---|
| 프로퍼티 | 클래스 스코프에 선언된 변수, 인스턴스마다 별개의 값을 가짐 |
| 생성자 | 클래스와 이름이 같은 메서드, [클래스]::new(...)로 호출됨 |
| 메서드 | 항상 반환 타입을 명시해야 함(값이 없으면 [void]) |
static 키워드 | 인스턴스 없이 클래스 자체에 속하는 프로퍼티·메서드([클래스]::멤버로 접근) |
hidden 키워드 | Get-Member(11장)와 자동완성에서 숨기되, 여전히 공개 멤버로 접근은 가능 |
상속(class A : B) | 단일 상속만 지원(다중 상속 불가) |
예시
| |
주의사항·함정
클래스는 기본적으로 ForEach-Object -Parallel(79장)에서 안전하지 않다: PowerShell 클래스는 자신이 정의된 런스페이스(Runspace)에 결속돼 있어, 병렬로 실행되는 다른 런스페이스에서 메서드를 호출하면 상태가 손상되거나 교착 상태(deadlock)에 빠질 수 있다. 병렬 처리에서 안전하게 쓰려면 클래스 선언에 [NoRunspaceAffinity()] 특성(PowerShell 7.4+)을 추가해야 한다.
모듈에 정의한 클래스는 Import-Module만으로는 자동으로 딸려 오지 않는다: 75장에서 배운 Import-Module은 함수·별칭·변수는 가져오지만 클래스·열거형 정의는 별도로 취급한다 — 클래스를 쓰려면 스크립트 맨 위에 using module <모듈이름> 문을 추가해야 한다. 이 차이를 모르면 “모듈을 임포트했는데 왜 타입을 찾을 수 없다고 나오지?“라는 혼란에 빠지기 쉽다.
세션 도중에 클래스를 다시 로드하거나 언로드할 수 없다: 함수는 다시 정의하면 즉시 갱신되지만, 클래스는 한 번 정의되면 세션이 끝날 때까지 그 정의가 고정된다. 개발 중 클래스 코드를 수정했다면 새 세션을 시작해야 변경 사항이 반영된다 — Import-Module -Force로도 해결되지 않는다는 점이 다른 모듈 멤버와 다르다.
생성자·메서드의 매개변수에는 검증 특성(ValidateSet 등)을 쓸 수 없다: 59장에서 배운 [ValidateNotNullOrEmpty()] 같은 매개변수 검증 속성은 클래스의 생성자·메서드 매개변수에는 적용되지 않는다. 검증이 필요하다면 메서드 본문 안에서 직접 확인 로직을 작성해야 한다.
이식성: C#의 class 문법을 상당 부분 그대로 계승해, 접근 지정자(hidden↔private)와 static 키워드 사용법이 비슷하다. Python의 class와도 개념적으로 유사하지만, Python은 다중 상속을 지원하는 반면 PowerShell 클래스는 단일 상속만 허용한다는 차이가 있다. Bash·CMD에는 객체지향 타입 시스템 자체가 없다.
![Featured image of post [PowerShell] 77. PowerShell 클래스(class 키워드)](/post/powershell/powershell-class-keyword-powershell/wordcloud_hu_732325a46d4d19a3.webp)
![[PowerShell] 75. Import-Module/Get-Module/Remove-Module](/post/powershell/import-get-remove-module-powershell/wordcloud_hu_f7c6ed2cf0491565.webp)
![[PowerShell] 76. PowerShell Gallery — Install-Module/Find-Module](/post/powershell/powershell-gallery-install-find-module-powershell/wordcloud_hu_68568dc7c4947f25.webp)
![[PowerShell] 77. PowerShell 클래스(class 키워드)](/post/powershell/powershell-class-keyword-powershell/wordcloud_hu_5ff5e6ec1d4f4d49.webp)
![[PowerShell] 78. Start-Job/Get-Job/Receive-Job — 백그라운드 작업](/post/powershell/start-job-get-job-receive-job-powershell/wordcloud_hu_f975cbd44945c564.webp)
![[PowerShell] 79. ForEach-Object -Parallel(PowerShell 7+)](/post/powershell/foreach-object-parallel-threadjob-powershell/wordcloud_hu_30c9034b5b05c027.webp)
![[PowerShell] 27. New-Object와 [PSCustomObject]](/post/powershell/new-object-pscustomobject-powershell/wordcloud_hu_a77220cb464cca6d.webp)
![[PowerShell] 74. 모듈 개념과 구조(.psm1/.psd1)](/post/powershell/module-structure-psm1-psd1-powershell/wordcloud_hu_7fca0b454a750e2a.webp)