about_Hidden — hidden 키워드로 클래스 멤버 숨기기
about_Hidden — hidden 키워드로 클래스 멤버 숨기기
클래스 안에 만들었지만, 클래스를 쓰는 사람이 굳이 볼 필요 없거나 함부로 건드리면 곤란한 멤버가 있을 때가 있어요. 이럴 때 쓸 수 있는 게 hidden 키워드예요. 이 키워드를 붙이면 해당 멤버가 Get-Member 같은 기본 조회 결과에서는 보이지 않게 돼요. 어떤 걸 숨길 수 있고 어떻게 쓰는지 함께 살펴볼게요.
출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hidden
본문
한 줄 요약
hidden 키워드는 클래스 멤버를 기본 Get-Member 결과에서 숨겨 주는 역할을 해요. 즉, 정의는 그대로 두되 겉으로 잘 드러나지 않게 해 주는 키워드예요.
자세히 살펴보기
스크립트에서 클래스의 멤버에 hidden 키워드를 붙이면, 그 멤버는 기본적으로 숨겨져요. 숨긴 멤버는 Get-Member cmdlet의 기본 결과나 IntelliSense, 탭 완성(Tab completion) 결과에 나타나지 않아요. hidden으로 숨긴 멤버를 다시 보고 싶다면, Get-Member 명령에 Force 매개 변수를 붙여 주면 돼요.
hidden 키워드로 숨길 수 있는 대상은 이렇습니다.
- 메서드(생성자 포함)
- 이벤트
- 별칭 속성(Alias Property)
- 그 밖의 멤버 유형(정적 멤버 포함)
숨겨진 멤버는 탭 완성이나 IntelliSense에도 나타나지 않아요. 다만 예외가 있는데, 정확히 그 숨긴 멤버를 정의한 클래스 안에서 완성(completion)이 일어나는 경우에는 보여요. 즉, 클래스 내부에서는 자기 멤버를 잘 찾아주고, 바깥에서 쓰는 사람 기준으로만 감춰지는 구조예요.
새로 추가된 특성(attribute)인 System.Management.Automation.HiddenAttribute를 쓰면, C# 코드에서도 PowerShell과 똑같은 의미로 이 동작을 구현할 수 있어요.
hidden 키워드는 클래스 안에 있는데 클래스 사용자에게 꼭 보여 주고 싶지 않거나, 쉽게 수정하면 곤란한 속성·메서드를 만들 때 유용해요.
한 가지 짚고 갈 점이 있어요. hidden 키워드는 멤버를 보거나 수정하는 방법 자체에는 아무 영향도 주지 않아요. PowerShell의 모든 언어 키워드가 그렇듯 hidden도 대소문자를 구분하지 않고, 그리고 중요하게도 숨겨진 멤버는 여전히 public이에요. 숨김은 '비공개로 바꾼다'는 뜻이 아니라 '기본 조회에서 잘 보이지 않게 한다'는 뜻이라는 걸 기억해 두면 헷갈리지 않아요.
hidden 키워드와 사용자 정의 클래스는 Windows PowerShell 5.0에서 함께 도입됐어요.
예제
실제로 어떻게 쓰는지 코드로 볼게요. 아래 예시에서 Car 클래스의 메서드 Drive에는 Rides라는 속성이 있어요. 이 속성은 Car 클래스에서 Drive가 몇 번 호출됐는지 숫자만 세 주는 역할이라, 클래스 사용자가 굳이 보거나 바꿀 필요가 없어요. 비유하자면, 차를 살 때 판매자에게 "이 차가 지금까지 몇 번 운행됐나요?"라고 굳이 묻지 않는 것과 같죠.
클래스 사용자가 이 속성을 바꿀 일이 거의 없으니까, hidden 키워드로 Get-Member와 자동 완성 결과에서 숨겨 버리면 돼요.
hidden 키워드는 속성과 그 데이터 형식이 있는 같은 문장 줄에 적어요. 키워드의 위치는 줄 안에서 어디든 상관없지만, 문장을 hidden 키워드로 시작해 두면 나중에 어떤 멤버를 숨겼는지 한눈에 알아보기 쉬워요.
class Car
{
# Properties
[string] $Color
[string] $ModelYear
[int] $Distance
# Method
[int] Drive ([int]$Miles)
{
$this.Distance += $Miles
$this.Rides++
return $this.Distance
}
# Hidden property of the Drive method
hidden [int] $Rides = 0
}
이제 Car 클래스의 새 인스턴스를 만들어서 $TestCar 변수에 저장해 볼게요.
$TestCar = [Car]::new()
인스턴스를 만든 다음, $TestCar 변수의 내용물을 Get-Member로 넘겨(pipeline) 볼게요. 결과 멤버 목록에서 Rides 속성이 빠져 있는 걸 확인할 수 있어요.
PS C:\Windows\system32> $TestCar | Get-Member
TypeName: Car
Name MemberType Definition
---- ---------- ----------
Drive Method int Drive(int Miles)
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Color Property string Color {get;set;}
Distance Property int Distance {get;set;}
ModelYear Property string ModelYear {get;set;}
Rides Property int Rides {get;set;}
Rides 속성은 클래스 안에 정의되어 있는데도 Get-Member 결과에 나타나지 않아요. 이게 바로 hidden 키워드가 만들어 주는 효과예요.