๋ ํตํฉ ๋ฐ ๋ ์กฐ๊ฑด๋ถ ์ก์ธ์ค (null-soaking)๋ ์ธ์ด์ ํธ๋ฆฌํ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค.
_Update_ : @BrucePay ๋ ?=
์ ํจ๊ป null ์กฐ๊ฑด๋ถ _assignment_๋ฅผ ์ถ๊ฐ๋ก ์ ์ ํฉ๋๋ค .
์๋ฅผ ๋ค์ด, ์์ฑํ๋ ๋์ :
if ($null -ne $varThatMayBeNull) { $varThatMayBeNull } else { $fallbackValue }
#
if ($null -ne $varThatMayBeNull) { $varThatMayBeNull.Name } else { $null }
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
$varThatMayBeNull ?? $fallbackValue # null-coalescing
#
$varThatMayBeNull?.Name # null-conditional access, for Set-StrictMode -Version 2+
$varThatMayBeNull?[42] # ditto, with indexing
๋ค์ null ์กฐ๊ฑด๋ถ ์ก์ธ์ค : Set-StrictMode
๊ฐ OFF (๊ธฐ๋ณธ๊ฐ)์ด๋ฉด $varThatMayBeNull.Name
๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํน๋ณํ ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ Set-StrictMode -Version 2
์ด์์ด ์ ์ฉ๋๋ ๊ฒฝ์ฐ $varThatMayBeNull.Name
๋ _break_๊ฐ๋ฉ๋๋ค. ์ฌ๊ธฐ์์ null ์กฐ๊ฑด ์ฐ์ฐ์ ( ?.
)๊ฐ ๋์์ด๋ฉ๋๋ค. ๊ฐ๊ฒฐํ๊ฒ $null
.
์ด๋ฆฐ ์ง๋ฌธ :
$varThatMayBeNull?[42]
๋ ๋ณ์๊ฐ $null
์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ง์ ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ๋ฐฐ์ด ์์๊ฐ _ ์์ด์ผํฉ๋๋ค _.
๋ฐ๋ผ์ ์ฐ์ฐํ _indexing_ null-conditional- C #์ด ์ง์ํ์ง _ ์๋ _ ๋ฌด์ธ๊ฐ๋ฅผ .ElementAtOrDefault()
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค).
๋ ๊ฐ์ง ๊ธฐ๋ณธ ์ ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์กด์ฌํ์ง ์๋ _index_๋ฅผ ๋ฌด์ํ๋ ค๋ ์๋๋ฅผ ๋ช ์ ์ ์ผ๋ก ๋ํ๋ด๋ ์ถ๊ฐ ๊ตฌ๋ฌธ์ ์๊ฐํด๋ณด์ญ์์ค.
?[...]
๋ฐ [...]?
๊ฐ ๋ชจํธํจ์ผ๋ก ์ธํด ์ต์
์ด ์๋๋ฏ๋ก์ด๋ฅผ ์ํด ์ ํํ ๊ตฌ๋ฌธ์
๋๋ค.[...?]
์ด์ง๋ง ์ด์ํด ๋ณด์
๋๋ค.Set-StrictMode
์ค์ ์์ ์์ํ๋ ๊ฒ์ฒ๋ผ ์กด์ฌํ์ง ์๋ ์ธ๋ฑ์ค์ ์ก์ธ์คํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ๊ธฐ์กด ๋์์ ์ฌ์ฉ ํฉ๋๋ค .
๊ด๋ จ : ์ผํญ ์กฐ๊ฑด๋ฌธ ๊ตฌํ
@ mklement0 ๋ ๋ฒ์งธ ์ํ์ "?"์์ด ๋์์ธ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
name()
ํ์๊ฒ ์ต๋๊น?
@iSazonov : ์ข์ ์ง์ ์ด์ง๋ง Set-StrictMode -Version 2
์ด์์ด ํจ๊ณผ๊ฐ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ?
์์ด ๋ง ์๋ํฉ๋๋ค.์ด ์ ์ ๋ช
ํํํ๊ธฐ ์ํด ์ด๊ธฐ ๊ฒ์๋ฌผ์ ์
๋ฐ์ดํธํ์ต๋๋ค.
ํต์ฌ๋ก ์ ์คํ์ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ฆ๊ธธ ์์๋ powershell์ด โโ์ฌ์ฉํ ์์๋ ๊ฒ์ ๋๋ค. ์ ์์ +1.
๋ค๋ฅธ ์ธ์ด์ ๋ค์ ์ํ์ ๊ณ ๋ คํ์ญ์์ค.
a="${b:-$c}"
a = b || c;
a = b or c
a := b ? c
a = b ? b : c;
์กฐ์ฐจ
a = b if b else c
~๋ณด๋ค ๋ซ๋ค
if (b) { a = b } else { a = c }
์ถ๊ฐ์ ์ผ๋ก ์์ธํ ์ค๋ช ์ด ํ์ํ ๋๊ฐ ์์ต๋๋ค.
a = (if (b -ne $ null) {b} else {c})
ํ ์ฌ๋์ด ๋ชจ๋ ๋๋ฝ๊ณ ๋ถ๋๋ฝ๋ค ๊ณ ๋๋ผ๊ฒ ๋ง๋ญ๋๋ค.
์ค๋์ด ์ผ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ์์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
```ํ์ ์
$ word = ($ null, "two", "three"). Where ({$ _ -ne $ null}, "First")
````
๋น์ทํ ํจํด์ ์ฌ์ฉํฉ๋๋ค.
$word = ($null, "two", "three" -ne $null)[0]
@kfsone ์์ $a=(if ($b -ne $null) { $b } else { $c })
์์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. $a=$(if ($b -ne $null) { $b } else { $c })
์ด์ด์ผํ์ง๋ง $( )
๊ฐ ํ์ํ ์ ์ผํ PowerShell ๋ฒ์ ์ ๋ฒ์ 1์ด์์ต๋๋ค. v2๋ถํฐ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
$a = if ($b) { $b } else { $c }
@bgshacklett $word=($null,'two')[$null -ne 'three']
์๋ฏธํ์ง ์์ต๋๊น?
์ด๊ฒ์ด 6.1์์ 6.2๋ก "Future"๋ก ๋ฐ๋๋ ๊ฒ์ ์กฐ๊ธ ์ํ๊น์ต๋๋ค.
@ TheIncorrigible1 ์๋์, ์์์ ์ถ๊ฐ ํ ๋ด์ฉ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ์ผ๋ฉด $word
๊ฐ์ด "two"๋ก ์ค์ ๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด Stack Overflow ๋ต๋ณ์๋ ํจํด์ ์ฒ์ ๋ณธ ๋ถ๋ถ์ ๋ํ ์์ธํ ๋ด์ฉ์ด ์์ต๋๋ค.
https://stackoverflow.com/a/17647824/180813
Perlesque ํดํน์ RIPE-DB ์ฌ์ฉ์ ๋๋ ์กฐ์ง ๊ธฐ๋ก์ ๋ฑ๋ก ๋ฐ / ๋๋ ์ฟผ๋ฆฌ ํ shebang์ ์์ฑํ 20 ๋ ์ ์ ์๊ฒ ํธ์ํ์ง๋ง, powershell์์ ๋ฐ๋ผ๋ ๊ฒ์ ๋๋ฃ๋ค์ด ์ธ์ด๋ฅผ ์ฌ์ฉํ๋๋ก ์ฅ๋ คํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์๊ฒ ๋๋ ค์์ ์ฌ์ด์ฃผ๊ธฐ๋ณด๋ค๋
๋ด ๋ฆฌํธ๋จธ์ค ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ํด ์์นจ 3์์ ํ๋ธ๋ฆฟ์ ํตํด ์ด๊ฒ์ ์ฝ๊ณ ์ถ์๊น์? ์ฐ๋ฆฌ๊ฐ ๋ช ๋ฐฑ๋ง ๋ฌ๋ฌ๋ฅผ ์๊ณ ์๋์ง ์ ํ๋ก ์ธ๋ฉด์ ์ ํ๋ฅผ ๋๋ ๋์.
(์ฐธ๊ณ : ์ด๊ฒ์ ๋ด๊ฐ ํ์ด์ค ๋ถ์์ ์ผํ๊ณ ๊ธด๊ธํ ์ ์ถ์์ ๋์์์ 2 ๋ถ ๋ง์ ๋ค๋๋๋ ์ธ๊ตฌ๋ณด๋ค ๋ ๋ง์ ์ฌ๋๋ค์ด ๋น ์๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค๊ณ ๋งํ๊ธฐ ์ ๊น์ง๋ ์ค์ ๊ฒฝํ์ ๋ํ ๋์จํ ๊ณผ์ฅ ์ผ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ด ์ฝ๋๊ฐ ์๋์๊ณ , ์ค์๋ ๋งค์ฐ ํน์ ํ ํ ํ๋ฆฟ ์ผ์ด์ค์ ๋ํ C ++ ํ์ค์์ return x ๋ return (x)์ ์๋ฏธ๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝ ํ ๊ฒ์ด ์์ต๋๋ค. "2 ๋ถ ์์์ด ์ฝ๋๋ฅผ ์ฝ์ผ์๊ฒ ์ต๋๊น? ๋ง๊ฐ์ผ, ๋ฐฉ๊ด์ด ๊ฐ๋ ์ฐจ๊ณ , ๋ค๋๋๋ ์ฌ๋์ ๊ณ ์์ด ์ฌ์ง์ ์ด๊นจ์ ๊ฑธ์น๊ณ ์๋ ๋ชจ๋ ๋งํ์ ์ด๋ช ??? "์ด ๋ฉ์ง๊ฒ ๋ค๋ฆฌ์ง ์์์ต๋๋ค.)
์. PS์๋ ๋๋จํ ํธ๋ฆญ์ด ์๊ฑฐ๋ ์ผํ์ฑ ์๊ธฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ๊น๋ํ ํธ๋ฆญ์ด ์์ต๋๋ค.
์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋์ ๊ฒฝ์ฐ ์ด์์ ์ผ๋ก๋ C #๊ณผ ๊ฐ์ ๋ช
์์ ์ธ null ํตํฉ ์ฐ์ฐ์๊ฐ ์์ด์ผํฉ๋๋ค. ์ ์๊ฒ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋-์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ์ํด ๋ฌด์์ ์ฌ์ฉํฉ๋๊น? ?
์ด๋ฏธ ๋ณ๋ช
์ด ๋ถ์ Where-Object
(I๊ฐ ์ญ์ ๋ ๊ทธ๊ฒ์ ์ํด ์ถ์ง๋ง๋งํผ, ๋งค์ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ด๋ค). %
๋ณ์นญ์ ForEach-Object
์ด์ง๋ง ๋ชจ๋๋ฌ์ค ์ฐ์ฐ์ ๋ฐฉํดํ์ง๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ก ์ ์ผ๋ก๋ ์ ์ด๋ ?
๊ฐ null-coalescing ์ฐ์ฐ์๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ข์; Where-Object
๋ ์ด์จ๋ ์ค์ ๋ก ์ ํจํ์ง ์์ ํํ์์์๋ง ํด์๋ฉ๋๋ค.
@ vexx32 :
์ ์ด๋ _syntactically_ ??
๋ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค. _expression_ ๋ชจ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ฉด ?
๋ [๋ณ์นญ] ๋ช
๋ น์ผ๋ก _argument_ ๋ชจ๋์์๋ง ์ธ์๋ฉ๋๋ค.
์ฌ๋ณผ์ ์ฌ์ฌ์ฉ์ด ํผ๋์ ์ ๋ฐํ๋์ง ํ์คํ์ง ์์ง๋ง ์ฌ๋ณผ์ด ๋ค๋ฅธ ๋งฅ๋ฝ์์ ์ด์ค ์ญํ ์ํ๋ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ ์๋๋๋ค.
๋๋๊ฒ๋, null-soaking์ ?.
๋ฐ ?[]
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ์ ์ ์ผ๋ก ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์
๋๋ค. PowerShell์ ํ์ฌ ?
๋ฅผ ๋ณ์ ์ด๋ฆ์ ์ด๊ธฐ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค.
PS> $foo? = @{ bar = 1 }; $foo?.bar # !! $foo? is a legal variable name
1
๊ทธ๋ฌ๋ ์ด๊ฒ์ด Bucket 3 : ๊ฐ๋ฅ์ฑ์ด์๋ ํ์ ์์ญ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ๋ด๊ฐ ๋๊ตฐ๊ฐ ์ฌ์ฉ์ ๋ณธ ์ ์ด ๋งํ ์ ์๋ค? ๋ณ์ ์ด๋ฆ์ผ๋ก ... ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์๋ํ๋ฉด ์๋ชป ์ฝ์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค, ์๋ฒฝํ๊ฒ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ์ด ์กฐ๊ธ ๋ฆ์๋ค ๊ณ ์๊ฐํ์ง๋ง Bash๋ ๋งค๊ฐ ๋ณ์ ๋์ฒด ๊ธฐ๋ฅ ( https://www.tldp.org/LDP/abs/html/parameter-substitution.html )์ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ (๋ฐ ์ผ๋ถ ๋ค๋ฅธ ๊ฒฝ์ฐ)๋ฅผ ์ฒ๋ฆฌํ์ต๋๋ค
๊ทธ๊ฒ์ผ๋ก ํ ์์๋ ์ผ์ด ์์ฒญ๋๊ฒ ๋ง๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ๊ณฐ์ด ๋ ์ ์์ง๋ง, ๋ฏฟ์ ์ ์์๋งํผ ๊ฐ๋ ฅํฉ๋๋ค. PowerShell์ด โโ๋ณ์์ ํจ๊ป ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ธํด์ด ์ ํํ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ธ์ด์ ์ผ๋ฐ์ ์ธ ๋๋์ ๊ผญ ๋ง์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ ์ฉํ ๋ฐ์ดํฐ ํฌ์ธํธ์ฒ๋ผ ๋ณด์ ๋๋ค.
@bgshacklett :
์, ๋งค๊ฐ ๋ณ์ ๋์ฒด๋ ๊ฐ๋ ฅํ์ง๋ง, ์ํ๊น๊ฒ๋ _learn_๋ฟ๋ง ์๋๋ผ _remember_์๋ ๋ถ๋ด์ด๋ฉ๋๋ค.
๋ฐ๋ผ์ Bash์ _features_๋ ์ข ์ข ํฅ๋ฏธ๋กญ์ง ๋ง _syntactic form_์ ์ข ์ข ์ ๋นํ๊ณ ๊ธฐ์ตํ๊ธฐ ์ด๋ ต๊ณ PowerShell์ ์ ํฉํ์ง ์์ต๋๋ค.
_Brace์ expansion_ (์๋ฅผ ๋ค์ด, a{1,2,3}
์์ bash
๋ก ํ์ฅ a1 a2 a3
) ํํ๋ ฅ ๋ด๊ฐ PowerShell์์๋ณด๊ณ ์ถ์ด์ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ์์ด์ง๋ง, PowerShell์ ๋ง๋์ ๊ตฌ๋ฌธ-# 4286 ์ฐธ์กฐ
์์ ํ ๋์ ํด. ์ด ๋ฌธ์ ๊ฐ ์ ํํ ํด๊ฒฐ์ฑ ์ด ์๋ ๋ค๋ฅธ ๊ณณ์์ ์ด๋ป๊ฒ ํด๊ฒฐ๋์๋์ง์ ๋ํ ์๋ก์ ๋ ๋ง์ด ์ธ๊ธํ์ต๋๋ค.
๊ณ ๋ คํด์ผ ํ ๋ค๋ฅธ ์ฐ์ฐ์๊ฐ ํ๋ ์์ต๋๋ค.
$x ?= 12
์ค์ ๋์ง ์์ ๊ฒฝ์ฐ $x
์ค์ ๋ฉ๋๋ค (์กด์ฌํ์ง ์์). ์ด๊ฒ์ ์ ํต์ ์ธ ์ธ์ด์์๋ ํํ์ง ์์ง๋ง ์, ๋ฉ์ดํฌ ๋๊ตฌ ๋ฑ๊ณผ ๊ฐ์ (๋์ ์ผ๋ก ๋ฒ์๊ฐ ์ง์ ๋) ์ธ์ด์ "์ด๊ธฐํ ํจํด"์ ์ผ๋ถ์
๋๋ค. ์ฌ์ฉ์๊ฐ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. . (์ฌ์ค ๋งค๊ฐ ๋ณ์ ์ด๋์
๋ผ์ด์ ๋ ๋งค์ฐ ๋๋ฆฌ ํผ์ ธ ์์ต๋๋ค.)
์ด๊ฒ์ ์์ฑ์ผ๋ก ํ์ฅ :
$obj.SomeProperty ?= 13
์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ์ฒด์ SomeProperty
๋ฉ๋ชจ ์์ฑ์ ์ถ๊ฐํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ -์ฌ๋ฏธ๋ก- -or
์ฌ์ฉํ์ฌ ๋ณ์ ์ด๊ธฐํ์ ๋ํ ๋ ๋ค๋ฅธ ๋ณํ :
$x -or ($x = 3.14) > $null
$x ?= 12
์ข์ ์๊ฐ ๊ฐ๋ค์.
์ฐ๋ฆฌ๊ฐ ์๋ง LHSํ์ง _exist_ ์์ง๋ง, ๋ํ _does์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ง ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ฟ๋ง ์๋๋ผ contain_ ์ด๋ฌํ ๋ชจ๋ ์ฐ์ฐ์๋ฅผ ์ ์ฉํด์ผ ๋์๊ฒ ๋ฐ์ $null
(์ [System.Management.Automation.Internal.AutomationNull]::Value
์ทจ๊ธ $null
์ด ๋ฌธ๋งฅ์์
๋ฉ๋ชจ ์์ฑ SomeProperty ์ถ๊ฐ ๋ฐ ์ด๊ธฐํ
๊ทธ๋ฐ ๋งฅ๋ฝ์์ $obj.SomeProperty ?= 13
๋ .SomeProperty
์ด ์กด์ฌํ๊ณ $null
ํฌํจํ๋ ๊ฒฝ์ฐ์๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค (๋ฐ๋๋ก _hasthables_์ ๊ฒฝ์ฐ ์์ฑ์ ์์ ์ ์ผ๋ก ์์ฑ ํ ์ ์์). ์์ ์ ํญ๋ชฉ ์์ฑ์ด ์๋ฏธ๊ฐ ์์).
๋ ผ์ ๋ ๋ชจ๋ ์ด์์๋ ์๊ฒฉ ๋ชจ๋ ์กด์ฌ ํ์ธ์์ LHS๋ฅผ ๋ฉด์ ํด์ผํฉ๋๋ค.
์ strictmode๊ฐ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ก์ธ์คํ๋ ๊ฒ์ ๋ง๋ $x.pretnd
์ ๊ฐ์ ์คํ๋ฅผ ์ก์ผ๋ ค๋ ์๋์
๋๊น? assert(x != null)
์ ๊ฐ์ ๊ฐ์ ์ ํ์ธํ๋ ค๋ ์๋์
๋๊น? ์ฝ๋์์ ์ค์๋ก $null
์ ํ๋ฅผ ์ฐจ๋จํ๋ ค๋ ์๋์
๋๊น?
null-soaking (?.)์ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก $ null์ ๋ฌด์ํ๋ ค๋ ๋ช ์์ ์ธ ์๋๋ฅผ ์๋ฆฌ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
.
์ ํธ๊ฐ ์ด๋ฏธ ๋น ์๊ฒฉ ๋ชจ๋์ ์์ง ์์ต๋๊น? ์๊ฒฉ ํด ์ง๊ธธ ์ํ๋ค๋ฉด ๋จผ์ ํ์ธํ์ง ์์์ผ๋ก์จ .Name
์กด์ฌ ์ฌ๋ถ๋ฅผ ๋จผ์ ํ์ธํ ์ ์์์ผ๋ฉฐ, ํ์ธ์ด ์ค์ํ์ง ์๋ค๋ ๋ช
์์ ์ธ ์๋๋ฅผ ์ด๋ฏธ ํ์ ํ ๊ฒ์
๋๋ค.
StrictMode๋ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ก์ธ์ค ๋ฐ ๋ฐํ ๋ชฉ์ ์ด์๋ ๊ฒฝ์ฐ $null
๊ธ์ง, ๋ค์ ๊ฐ์ ๋
ผ๋ฆฌ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค ?.
, ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ ์ด์ ๋ก ๊ฐ์ ์์ธ๋ฅผ ๋ฐ์ํ๋ค์ . ๊ทธ๋ ์ง ์๋ค๋ฉด ์ ์๋ฉ๋๊น?
๋ ํตํฉ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
$result = Invoke-RestMethod -Uri 'https://example.org/api/test'
$test = $result?.Name
๋ชจ๋ ์์ฑ ์ฐธ์กฐ์ ๋ํด ํญ์ ?.
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด " .
์ฒ๋ผ ๋์ํ๊ณ strictmode๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ ์์ธ๋ฅผ ๋์ง์ง ์์ ๊ฒ"์ด๋ฏ๋ก ๋น ๋ฅด๊ฒ ๊ถ์ฅ๋๊ฑฐ๋ ๊ด์ฉ์ ์ผ๋ก ๋ณํ ๊น์?
์๋ฅผ ๋ค์ด ์คํฌ๋ฆฝํธ # StrictMode SkipMemberExistenceCheck
์ ๋งจ ์์ ์ ์ธํ๊ฑฐ๋ unstrict code
๋ธ๋ก์ ๋ํ๋ด๋ ์ด์ค์ผ์ดํ ํด์น ์์ฑ์ ๊ฐ์ง ์ ์๋๋ก ๋ณ์ ์ค์ ์ด์๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ strictmode๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ง์ง ์๋ง์
๋๊น? ์ผ๋ฐ์ ์ผ๋ก? [์๋ง์ด ๊ฐ๊ฒฐํ C # ์คํ์ผ ๊ตฌ๋ฌธ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ฌด์จ ๋ป์ธ์ง ์ ๊ฒ์
๋๋ค.]
@HumanEquivalentUnit์ ์๊ฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
$x.pretnd
์ ๊ฐ์ ์คํ๋ฅผ ์ก์ผ๋ ค๋ ์๋์ ๋๊น?
๋๋ ๋์์ธ ์๋์ ๋ํด ๋งํ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ๋์๊ฒ ์๋ฏธ๊ฐ์๋ ๊ฒ์
๋๋ค. Set-StrictMode -Version 1
๊ฐ _variables_์ ๋ํดํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด $null
์ธ์ง ์ฌ๋ถ๊ฐ ์๋๋ผ _existence_์ ๊ดํ ๊ฒ์ด๋ฉฐ ์์ฑ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋์ผํ ํจํด์ ๋ฐ๋ฆ
๋๋ค.
๋์ ์คํฌ๋ฆฝํ ์ธ์ด๊ฐ ์ ์ ์ผ๋ก ํ์ํ ๋ ์ปดํ์ผ ๋ ์ธ์ด๊ฐ _compile time_์๋ณด๊ณ ํ๋ ์ค๋ฅ๋ฅผ ์ฐพ๋ ๋ฐ ๊ฐ์ฅ ๊ทผ์ ํ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ ๋ญ์ผ. ์ด๋ฏธ ๋น ์๊ฒฉ ๋ชจ๋์์๋ ์ ํธ์ ๋๊น? ์๊ฒฉํ๊ฒํ๊ณ ์ถ์๋ค๋ฉด ๋จผ์ ์กด์ฌํ๋ .Name์ ํ์ธํ ์ ์์ต๋๋ค.
์,ํ์ง๋ง ์๊ฒฉํ์ง ์์ ๋ชจ๋์์๋ ์์ ์ธ๊ธ ํ ์กด์ฌ ํ์ธ์ ๋ฌด์ํ๊ณ ์๋ ํ ์คํธ๋ ๋ถ๋ช ํ ์๋นํ ๋ฒ๊ฑฐ๋กญ๊ณ ๋ด์ฅ ๊ธฐ๋ฅ๋ณด๋ค ํญ์ ๋๋ฆฝ๋๋ค.
๋จผ์ ํ์ธํ์ง ์์์ผ๋ก์จ ํ์ธ์ด ์ค์ํ์ง ์๋ค๋ ๋ช ์์ ์ธ ์๋๋ฅผ ์ด๋ฏธ ํ์ ํ ๊ฒ์ ๋๋ค.
์์ ์ Set-StrictMode -Version 2
์ด์์ด๋ฉด ๋ค์์ ์ป์ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
.?
์คํฌ๋ฆฝํธ ์๋จ์
# StrictMode SkipMemberExistenceCheck
์ ์ธ์ํ๊ฑฐ๋ ์ผ๋ฐ์ ์ผ๋กunstrict code
๋ธ๋ก์ ๋ํ๋ด๋ ์ด์ค์ผ์ดํ ํด์น ์์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๊ด๋ จ : Set-StrictMode
์ ํ์ฌ ๋์ ๋ฒ์ ์ง์ ์ด ๋ฌธ์ ์
๋๋ค. _lexical_ ์๊ฒฉ ๋ชจ๋๋ฅผ ๊ตฌํํ๊ธฐ์ํ์ RFC ์ด์์ @lzybkr ์ฐธ์กฐ : https://github.com/PowerShell/PowerShell-RFC/blob/master/1-Draft/RFC0003-Lexical-Strict-Mode.md
๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์ฑ์ ์กด์ฌ ํ์ธ์ ์ด์
PS์๋ ๋ฉค๋ฒ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ์กด์ฌํ์ง ์์ผ๋ฉด $ null์ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํํ์ด๋ฉฐ, ์ํ๋ ๊ฒฝ์ฐ $x.psobject.properties...
์์ ์ ๋ฉค๋ฒ ์กด์ฌ ํ
์คํธ๋ฅผ ์์ฑํ์ฌ ํผํ ์๋ ์์ต๋๋ค. StrictMode๋ ์ด๋ฌํ ์ด์ ์ ์ ๊ฑฐํ๊ณ ์กด์ฌ ํ
์คํธ๋ฅผ ์์ฑ ํด์ผํ๋ ๋ฐฉํด ๋ฅผ ๋จ๊ฒจ ๋ก๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฉค๋ฒ ์กด์ฌ ํ
์คํธ๋ฅผ ์ ํํ๊ฒ ์์ฑํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๋์ ?.
๋ .
ํญ์ํ๋ ์์
์ ์ป์ ์์๋ ๊ฐ๊ฒฐํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฉค๋ฒ๊ฐ ์กด์ฌํ๋ ๊ฒ์ด ์ค์ํ๋๋ผ๋ ๋ณ๋๋ก ์ฝ๋ฉํด์ผํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ฉ์๋ ํธ์ถ์ ๋ํด ๋ฌด์์ ๋ฌป๊ฒ ๋ง๋ญ๋๋ค.
$x.pretend -> $null
$x.pretend() -> Exception MethodNotFound
$x?.pretend -> $null
$x?.pretend() -> ____ what goes here? $null?
set-strictmode -version 2
$x.pretend -> Exception PropertyNotFoundStrict
$x.pretend() -> Exception MethodNotFound
$x?.pretend -> $null
$x?.pretend() -> ____ ?
์ฆ, ?.
๋ non-strictmode์ ์์ฑ ์กฐํ์ ๋ํด .
์ ๋์ผํ๊ฒ ์๋ํ์ง๋ง non-strictmode์ ๋ฉ์๋ ํธ์ถ์ ๋ํด์๋ .
์ ๋ค๋ฅด๊ฒ ์๋ํ์ฌ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ๋ง๋ญ๋๋ค. ๋๋กญ ์ธ ๊ต์ฒด. ์ด๊ฒ์ ?.
๋ฅผ ์ฌ์ฉํ ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง ๋๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์๋์ง ์ ์์๋ ๋ฐฉ๋ฒ์ด ์ ํ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? ์์ฑ์ getter ๋ฉ์๋์ ์ํด ๋ท๋ฐ์นจ ๋ ์ ์์ง๋ง getter๊ฐ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด DotNet์ ๊ด๋ก๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ฉ์๋ ํธ์ถ์ด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ?.
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋์ง ์ ์ ์์ต๋๊น?
??
์์ ์ผ์ชฝ์ ํํ์์์ PropertyNotFoundException ๋ฐ MethodNotFound ์์ธ๋ฅผ ์ง์ ์ฒ๋ฆฌ ํ ์์๊ฒํ๊ณ (๋ฉ์๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๋ค๋ฅธ ์์ธ๋ ์ ์ธ) ??
null์ด๋ฉฐ ?.
๊ฐ ์ ํ ์์ต๋๋ค. ์
$varThatMayBeNull ?? $fallbackValue # null-coalescing
#
$varThatMayBeNull.Name ?? $fallbackvalue # catching PropertyNotFoundStrict exception
$varThatMayBeNull.Name ?? # default fallback is $null
$varThatMayBeNull.Method() ?? # catching MethodNotFound Exception
# and potentially addressing the index case too
$varThatMayBeNull.first.second[3].Method() ?? # catching MethodNotFound Exception, or index not found Exception
๊ทธ๋ฐ ๋ค์ ?.
๋ฉค๋ฒ๋ฅผ ํธ์ถํ๊ฑฐ๋ ์์ฑ์ ์ก์ธ์คํ๋ ๋์ ๋ฉค๋ฒ๊ฐ ์๋์ง ๋ฌป๊ณ [bool]์ ๋ฐํํ๋ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ ์ผ ์ ์์ต๋๋ค.
??
๋ฐ ?.
์ ๋์ผํ ๊ตฌ๋ฌธ ์ถ๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ง์ ์ํฉ์ ์ฒ๋ฆฌ ํ ์ โโ์์ผ๋ฉฐ ๊ฒน์น๋ ๋ถ๋ถ์ ๋ ํผ๋ ํ ์ ์์ต๋๋ค.
StrictMode๋ ์ด๋ฌํ ์ด์ ์ ์ ๊ฑฐํ๊ณ ์กด์ฌ ํ ์คํธ๋ฅผ ์์ฑํด์ผํ๋ ์ฅ์ ๋ฅผ ๋จ๊น๋๋ค.
ํ ์ฌ๋์ ์ฅ์ ๋ ๋ค๋ฅธ ์ฌ๋์ ์ด์ต์
๋๋ค.
๊ทธ๊ฒ์ ๋ชจ๋ ๋น์ ์ด ์ํ๋ ์ผ์ ๋ฌ๋ ค ์์ต๋๋ค ._ ๊ธฐ๋ณธ์ ์ผ๋ก _ :
์ฝ๋์ _typos_๊ฐ ์๋ค๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ-๋ฐ๋์ _default_ ๋์ (์๊ฒฉ ๋ชจ๋ OFF)์ ํ์ฉํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด .?
(_ property_ ์ก์ธ์ค์ ๊ฒฝ์ฐ-์ฐธ์กฐ)๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ค์ ์ฝ๋ฉํธ re _method calls_ ๋ฐ _indexing_).
Set-StrictMode -Version 1
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝํฅ์ด ์์ง๋ง, ์ฃผ๋ก # 2798๋ก ์ธํด -Version 2
์ด์์ด ๋๋ฌด ๊ท์ฐฎ์ต๋๋ค. ์ด ์ ์).(a) ์์ฑ ์ด๋ฆ์ ์ฒ ์๊ฐ ํ๋ฆฌ์ง ์์๋์ง ๋ฐ / ๋๋ (b) ์ฝ๋๊ฐ ์๋ํ์ง ์์ ๋ฐ์ดํฐ ์ ํ์์ ์ค์๋ก ์๋ํ์ง ์๋์ง ํ์ธํ๋ ค๋ฉด ์๊ฒฉ ๋ชจ๋๋ฅผ ๋ฒ์ 2 ์ด์์ผ๋ก ์ค์ ํ์ญ์์ค. .
๋ฉค๋ฒ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ช ์ ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ ์ค์ ๋ก ์ ์ฉ๋๋ ์๊ฒฉ ๋ชจ๋์ ๊ด๊ณ์์ด ํ์์ ์ผ ์์๋ ๋ณ๋์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
OP๊ฐ ๋ค๋ฃจ์ง ์๋ _method calls_์ ๊ฒฝ์ฐ :
_ ๋ฉ์๋ ํธ์ถ _ (์ : $varThatMayBeNull.Method()
) ๋ฐ _indexing_ (์ : $varThatMayBeNull[$index]
)์ ์๊ฒฉ ๋ชจ๋๊ฐ ๊บผ์ ธ ์๊ฑฐ๋ ๋ฒ์ 1์์๋ ๋์์ด ๋ ์์๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์
๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ฌ _invariably_ ์ก์ธ์ค๋๋ ๊ฐ์ $null
์
๋๋ค.
๊ตฌ๋ฌธ์ ๋ฉ์๋์ ์์ฑ- $varThatMayBeNull?.Method()
-์ ๋์ผํ๊ณ ์ธ๋ฑ์ฑ- $varThatMayBeNull?[$index]
-์ ๊ฒฝ์ฐ C #๊ณผ ์ ์ฌํฉ๋๋ค.
_Update_ : ์ธ๋ฑ์ฑ์ ๋ํ ๋ ๋ฒ์งธ ์ธก๋ฉด์ด ์์ต๋๋ค. ์ฆ, ๋ณ์๊ฐ null์ด ์๋์ง๋ง ์ง์ ๋ ์ธ๋ฑ์ค์ ์์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ (์ : $arr = 0,1; $arr[2]
). Strict ๋ชจ๋ ๋ฒ์ 2 ์ดํ์์๋ $null
๋ก ํ๊ฐ๋์ง๋ง ๋ฒ์ 3 ์ด์์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ์ด ์ค๋ฅ๋ ์ตํธ ์์ ํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋์ด ๊ฒฝ์ฐ์ ๊ตฌ๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ ์ํฉ๋๋ค. ์
๋ฐ์ดํธ ๋ OP๋ฅผ ์ฐธ์กฐํ์ธ์. ํ์ฌ ์๋ง๋ ์ด์ํ [...?]
์ ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, ์ ๋ ์ด๋ฌํ ์ก์ธ์ค๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก $null
๋ก ์ค์ ํฉ๋๋ค. ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ก์ธ์ค์ค์ธ ๊ฐ์ฒด๊ฐ $null
์ด๋ฉด ์๋ฌด ์์
๋ํ์ง ์์๋๋๋ค๋ _explicitly_ ์ ํธ๋ฅผ ๋ณด๋
๋๋ค. ๊ทธ๋ฌํ ๋ฐฐ์ด ์์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ.
C #์๋ ๋ ๋ฒ์งธ ์๋ฏธ์์ null ์กฐ๊ฑด๋ถ ์ธ๋ฑ์ฑ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋น์ ์ด ์ ์ํ๋ ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ null ์กฐ๊ฑด๋ถ ์ธ๋ฑ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. C #์ ์ผ๋ฐ์ ์ธ "์ธ๋ฑ์ค๋ฅผ null ๋ฐฐ์ด / ์ปฌ๋ ์
์ผ๋ก"๋ฌธ์ ๋ฅผ ์ฐํํ๊ณ null์ ๋ฐํํ๋ array?[0]
๋ฅผ ํ์ฉํฉ๋๋ค (์ ์ด๋ ...).
ํ์ง๋ง ๋ค, ์ด๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ฝ๋๋ฅผ ๋งค์ฐ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํฉ๋๋ค.
@ vexx32 , ์ฆ null ์กฐ๊ฑด๋ถ ์ธ๋ฑ์ฑ์ _one_ ์ธก๋ฉด์
๋๋ค. array
array?[0]
์ด null
์ธ ๊ฒฝ์ฐ ์ธ๋ฑ์ฑ ์์
์ด ๋ฌด์๋ฉ๋๋ค. C #๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๋ (null) ์กฐ๊ฑด๋ถ ์์ธ์ _other_ ์ธก๋ฉด์ ๋ํด ์ด์ผ๊ธฐ : (_also_ ๊ฐฑ์ ) : I์ด์๋ค ๊ฒฝ์ฐ ๊ฒฝ์ฐ array
์์ array?[0]
_not_์
๋๋ค null
ํ์ง๋ง ์ธ๋ฑ์ค์์ _The ์์ 0
_ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์๋ ํ C #์์ ๋ฌด์ํ ์์๋ ๊ฒ์ ํ์์ด์ง๋ง ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ์ธก๋ฉด์ ๊ณ ์ ํ ์ด๋ฆ์ ๋ถ์ฌํ๋ ์ฉ์ด๋ฅผ ์๊ฐํ ์ ์์ต๋๊น?
๋ค๋ฅธ ์๋ฐ ์คํฌ๋ฆฝํธ ๋ฌธ์ ์ ์ฝ๋๋ $_.Description[0].Text
์์ $_?.Description[0?]?.Text
๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ??
๊ฐ ์ด๋ป๊ฒ ๋์ ํ ์ ์๋์ง์ ๋ํ ๋์ ๋ค๋ฅธ ์ ์์ ์ฃผ๊ด์ ์ผ๋ก ๋ ์ข์ $_.Description[0].Text ??
๊ฐ์ ธ๊ฐ ๊ฒ์ด๋ฉฐ, ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ฒด์ธ์ ๋ชจ๋ ์กฐํ ์ง์ ์์ ํ ๋ฒ์ ์คํจ๋ฅผ ์ฒ๋ฆฌ ํ ๊ฒ์
๋๋ค. , ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ํ ์์
์ ์ ํํ ์ ์์ผ๋ฉฐ $null
๋ก๋ง ์ ํ๋๋ ๋์ ๋ง์๋๋ก ๋ค๋ฅธ ํด๋ฐฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ ์ณ๋๊ณ ,์ด ?.
๊ตฌ๋ฌธ์ด ์ ์ ์์ฑ ๋ฐ ๋ฉ์๋ (์ : $t = [int]; $t::MaxValu; $t::Pars("1")
)์ ๋ํ ์๋ ๋ก๊ทธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๊น? ?:
๋๋ ?::
?
๋ ์ด์์ ์ธ๋ฑ์ค๊ฐ ์ง์ ๋ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ๋ํด ์ํ๋ ๋์์ ๋ฌด์์
๋๊น? $array[0,4?,1,2]
๊ฐ๊ฐ์ด ์คํจ ํ ์์๋ ๊ฒฝ์ฐ, ์๋๋ฉด ์ ์ฒด ๋กํธ ๋ง ์ฑ๊ณตํ๊ฑฐ๋ ์คํจ ํ ์์๋ $array[0,4,1,2?]
?
์ต์ํ ๊ฐ๋ ์ ์ผ๋ก๋ ๋ถ๋ฆฌ ํ ๊ฐ์น๊ฐ์๋ ์ธก๋ฉด์ ํตํฉํ์์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋จผ์ ํ ๋ฐ ๋ฌผ๋ฌ์์ผํฉ๋๋ค.
C #์์์ ๊ฐ์ด _Null-value_- ์กฐ๊ฑด๋ถ ๋ฉค๋ฒ ๋๋ ์ธ๋ฑ์ค ์ก์ธ์ค :
$null
์ด๋ฉด ํด๋น ๋ฉค๋ฒ ๋๋ ์ธ๋ฑ์ค์ ๋ํ ์ก์ธ์ค ์๋๋ฅผ ๋ฌด์ํ๊ณ $null
ํ๊ฐ๋ฉ๋๋ค._Member-existence_- ์กฐ๊ฑด๋ถ ๋ฉค๋ฒ ๋๋ ์ธ๋ฑ์ค ์ก์ธ์ค, PowerShell ๊ด๋ จ :
$null
_ ์ธ ๊ฒฝ์ฐ ์กด์ฌํ์ง ์๋ _members_ (์์ฑ, ๋ฉ์๋ ํธ์ถ, ์ธ๋ฑ์ฑ)์ ๋ํ ์ก์ธ์ค ์๋๋ฅผ ๋ฌด์ํฉ๋๋ค.์ฐธ๊ณ : ๊ฐ๊ฒฐํจ์ ์ํด ์ฌ๊ธฐ์๋ _member_๋ฅผ ๋ค์ ๋์จํ๊ฒ ์ฌ์ฉํ์ฌ ์ ํ๊ธฐ๋ฒ์ด ์๋ _indexing_์ผ๋ก ์ก์ธ์ค๋๋ ์ปฌ๋ ์ ์ธ ๊ฐ์ฒด์ _elements_๋ ํฌํจํฉ๋๋ค.
์ฝ๋์ ์คํ๊ฐ ์๋ค๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ-๋ฐ๋์ ๊ธฐ๋ณธ ๋์ (์๊ฒฉ ๋ชจ๋ OFF)์ ํ์ฉํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด.? (์์ฑ ์ก์ธ์ค ์ฉ
@ mklement0 ๋๋ ๋น์ ์ด " ์๊ฒฉ ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด " ๋ค๋ฅธ ์ฌ๋์ด strictmode์์ ๋ด ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ด ๊ทธ๋ค์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๊น? "๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ฅผ ๋ค๋ฅธ ์ถ๋ก ์ผ๋ก ์ด๋๊ณ ์์ต๋๋ค. ?.
๋ฅผ ์ฌ์ฉํ๋ฉด .
๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌ ํ ๊ฒ์ด๋ฉฐ ์ฝ๋๋ ์๊ฒฉ ๋ชจ๋์์ ์๋ํ์ฌ ์ด๋์๋ ์ต๊ด์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ์๋ฌด๊ฒ๋ ์์ง ์๊ณ ํธํ์ฑ์ ์ป์ต๋๋ค. ๋ ๋ง์ ๊ฒฝ์ฐ์ "์๋"ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ PowerShell ์ฝ๋๊ฐ ๊ทธ๋ฐ ์์ผ๋ก ์๋ํ์ง ์์๊น ๋๋ ต์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋น ์๊ฒฉ ๋ชจ๋์์ ์คํจํ ๋ฉ์๋ ํธ์ถ ์กฐํ๋ฅผ ์นจ๋ฌต์ํค๊ณ ์๊ฒฉ ๋ชจ๋์์ ์คํจํ ์์ฑ ์กฐํ๋ฅผ ์นจ๋ฌต์ํค๊ธฐ ๋๋ฌธ์ ๋๋กญ ์ธ ๋์ฒด๊ฐ ์๋๋๋ค. ์ด๊ฒ์ ์์ฒญ๋๊ฒ ์ผ๋ฐ์ ์ธ ์์ ์ธ ๋ฉค๋ฒ ์กฐํ์ ๋ฌํ ๋์์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๊ฒฉํ ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ํตํด ์์ฉ๊ตฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ํ๋ ์ฌ๋์๊ฒ๋ ๋์์ด๋์ง ์์ต๋๋ค. ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํ ์ํฉ์์ ์ถฉ๋ถํ ์ฌ๋๋ค์ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋์ ํธํ์ฑ์ ๋์ด๋ ๊ฒ์ ๋๋ฌด ํธ๋ฆฌํฉ๋๋ค. "์ํ์ง ์์ผ๋ฉด ๋ฌด์"ํ๋ ๊ฒ์ด ์ถฉ๋ถํ ๊ฐ๋ ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
PowerShell์ ์๋ ๋ณ์๋ฅผ ์ค์ ํ๊ฑฐ๋ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ๋ฐฐํ์์ ์นจ๋ฌตํ๋ ์ ๋ก๋ฅผ ๊ฐ๋ ๋ฑ C #์ด ์ํํ์ง ์๋ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค. ํ์ ์กฐํ๋ฅผ ์ ํ ๋ณต์กํ๊ฒํ์ง ์๋ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์ ์ด
@HumanEquivalentUnit ์ด๋ป๊ฒ ์ด๋ฌํ ๊ฒ๋ค์ ์นจ๋ฌตํฉ๋๊น? ๋์ ์ด์ ์ ์์ธ ์ฒ๋ฆฌ ๋ฐ null ๊ฒ์ฌ๋ก๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.
$prop = $item?.Method().PropIwant ?? 'PropActionFailed'
V.
$prop = if ($null -ne $item) {
$propIwant= $item.Method().PropIwant
if ($null -eq $propIwant) {
'PropActionFailed'
}
else {
$propIwant
}
}
๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ๋ ๋๋ฌธ ์ผ์ด ์๋๋๋ค. ๋๋ $ErrorActionPreference = 'Stop'
๋์ง๊ณ ๋ชจ๋ ๊ฒ์ try/catch
๋ก ๋ํํ์ฌ ์๋ชป๋ ํจํด (์์ธ ๊ธฐ๋ฐ ๋
ผ๋ฆฌ) ์ธ null ๊ฒ์ฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
๋ํ ์ด๊ฒ์ ์ธ์ด์ ๋ฏธ๋์ ๋๋ค. 5.1๋ก ๋์๊ฐ์ ์ํฉ์ ๋ฐ๊พธ๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ๋ ๋ง์ ์ฑํ์๋ฅผ ์ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋กํด์ผํฉ๋๋ค.์ด ์ ์์ด ๊ทธ๋ ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ mklement0 "_ ํ ์ฌ๋์ด ์์ ์ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๊ฒฉ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค _"๋ผ๋ ๊ด์ ์์ ๋ ผ์ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ "_ ๋ค๋ฅธ ์ฌ๋์ด strictmode์์ ๋ด ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ค ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฝ๋๊ฐ ์๋ํ๊ฒ ๋ ๊น์?" _ "
"set -euo pipefail"(bash strict ๋ชจ๋)์ ํด๋นํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
a- ๋ณ์ ์กฐํ ์ ํ (๋ฉค๋ฒ ์กฐํ์ ๋ํ ๊ฐ๋จํ null ๊ฒ์ฌ๊ฐ ๋์ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ๋ ์ ์ ์์ง๋ง ์ค์ ๋ฉค๋ฒ ์กฐํ๋ if (result is null)
๋ณด๋ค ํจ์ฌ ๋น์๋๋ค)
b- ๋ฒ์ / ์ฝ๋ ๋ธ๋ก์์ [Strict]
๋ฅผ ์ฌ์ฉํ์ฌ ํ์์๊ฒ์ด๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ง์ํฉ๋๋ค.
c- ์๊ฒฉ ์ฑ์ ๋ฒ์๋ฅผ ๊ธฐ๋ฐ์ผ๋กํฉ๋๋ค. ์๊ฒฉํจ์ผ๋ก ํ์๋์ง ์์ ์ฝ๋๋ ์๊ฒฉํ์ง ์์ต๋๋ค.
์ฌ์ฉํ ๋ ์คํจํ๋ ์๊ฒฉํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฐ๋ฆฌ ์ค ํ ๋ช ์ด ์ค์๋ฅผ ํ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ํ ์คํธ ํ ์ ์ด์๋ ์ฝ๋์์ ๋๋ฝ ๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ๋ด ํจ์์ ์ ๋ฌ๋์ง ์์ ๋ณ์์ ์กด์ฌ์ ๋ฐ๋ผ ์๋ชป ์ค๊ณ๋ API๋ฅผ ์คํดํ์ฌ ์ฑ์์ง ๊ฒ์ผ๋ก ์์๋๋ ๋ณ์๋ฅผ ์ฑ์ฐ์ง ๋ชปํ์ต๋๋ค. .
# Their code
Function Log($Message) { Write-Host $Massege } # not strict
# My code
[Strict]
Function DebugMsg
{
Param([String] $Message)
if ($DEBUG) { Log Host $Message }
}
# Your code
DebugMsg "Hello" # you didn't define DEBUG, and by saying strict I expressed a contract whereby the variable MUST be defined.
"๋ก๊ทธ"๊ธฐ๋ฅ์ ์๊ฒฉ์ผ๋ก ํ์๋์ง ์์์ผ๋ฏ๋ก ์คํ์ ๋ํด ๋ถํํ์ง ์์ต๋๋ค.
๐ค ์ด์ ์ธ๊ธ ํ์ผ๋ฏ๋ก [Strict()]
์์ฑ์ ๋ฒ์ ์ ํ ๋ฐฉ์์ผ๋ก ์๊ฒฉ ๋ชจ๋๋ฅผ ๊ตฌํํ๋ _awesome_ ๋ฐฉ๋ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์๊ฒฉ ๋ชจ๋ ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์ด์ ์ค๋ ๋์์ ์ธ๊ธ๋์ด์ผํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ๊ณ ์ฌ๊ธฐ๋ก ๋ค์ ๋งํฌ ํ ๊ฒ์
๋๋ค.
@ TheIncorrigible1 " ์ด๋ป๊ฒ ์ด๋ฌํ ๊ฒ๋ค์ ์นจ๋ฌตํฉ๋๊น? "๋น ์๊ฒฉ ๋ชจ๋์์ $null.x
๋ ์นจ๋ฌตํ๊ณ , $null.x()
๋ ์์ธ์
๋๋ค. ?.
์์ ์ค๋ช
ํ๋๋ก $null?.x
๋ ๋ฌด์์ด๊ณ $null?.x()
๋ ๋ฌด์์
๋๋ค.
๋ฐ๋ผ์ ์์ธ๊ฐ ๋ฐ์ํ๋ ์๊ฒฉ ๋ชจ๋๋ฅผ ์ ์ธํ๊ณ ๋ C #์ ?.
์ฒ๋ผ ์๋ํ๋ .
๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ C #์ ?.
์ ๊ฐ์ ์๊ฒฉ ๋ชจ๋์์ ์๋ํ๋ ?.
๊ฐ ์๊ณ PowerShell์ .
์ฒ๋ผ ์๊ฒฉํ์ง ์์ ๋ชจ๋์์ ์๋ํ์ง๋ง PowerShell์ .
์๋ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค .
. ์ผ๋ง๋ ๋์ฐํ ์กฐํฉ์
๋๊น (๊ทธ๋ฆฌ๊ณ ?.
๊ฐ ๋ ๋ง์ ์๋๋ฆฌ์ค์์ ๋ถ๋ช
ํ ๋ ์ข๊ณ ๋ ์ ์ฉํ ์กฐํฉ).
์ด์ ์ ์์ธ ์ฒ๋ฆฌ ๋ฐ null ๊ฒ์ฌ๋ก๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค. ๋์
$prop = $item?.Method().PropIwant ?? 'PropActionFailed'
๋ฉ์๋ ํธ์ถ์ด throw๋๊ฑฐ๋ $ null์ ๋ฐํ ํ ์ ์์ผ๋ฉฐ PropIWant๊ฐ ๋๋ฝ๋์์ ์ ์์ต๋๋ค. ์ฌ์ ํ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผํฉ๋๋ค.
$prop = try {
$item?.Method()?.PropIwant ?? 'PropActionFailed'
} catch [someMethodException] {
'PropActionFailed'
}
๋ด ์ ์ ๋ ??
(๋น๋ ํ ์์๋ ๊ฒฝ์ฐ) ๋ฐ ?.
ํ์ ์์, ๊ทธ๋ฆฌ๊ณ ๊ด์ฌ์๋ ๋ชจ๋ ๊ฒ์ด "์ฑ๊ณต ์ฌ๋ถ"์ธ ๊ฒฝ์ฐ ๊ฐ๋ฅํ ๋ฉ์๋ ์์ธ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค. ์์ธํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค.
$prop = $item.Method().PropIWant ?? 'AnythingFailed'
๋ ๋ง์ ์ฑํ์๋ฅผ ์ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋กํด์ผํฉ๋๋ค.์ด ์ ์์ด ๊ทธ๋ ๋ค๊ณ ์๊ฐํฉ๋๋ค.
PowerShell์์ .
๋ฅผ ์ผ๋ง๋ ์์ฃผ ์
๋ ฅํฉ๋๊น? ์ผ๋ง๋ ์์ฃผ ๋น์ ์ ์ฐจ์ด๊ฐ ์ฌ์ด์ ์ด๋ค ์๋ก์ด ์ฌ์ฉ์์๊ฒ ์ค๋ช
ํ๊ณ ์ถ์ด .
๋ฐ ?.
๊ทธ๋ค์ ๊ทธ๋ค์ด ์
๋ ฅ ํ ๋๋ง๋ค์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํด์ผ ๊ทธ๋ค์๊ฒ
"์ด๋ป๊ฒ ๋์ด?" "C #์์๋ .
์์ ๋๋ฝ ๋ ๊ตฌ์ฑ์์ ๋ํ ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ?.
๋ฅผ ๋ฐ๋ช
ํ์ง๋ง ๊ทธ๋ ์ง ์์์ต๋๋ค. ํ๋ฅญํ๊ธฐ ๋๋ฌธ์ PowerShell์์ ๊ธฐ๋ณธ์ ์ผ๋ก .
๋ฅผ ๋ง๋ค์์ต๋๋ค .
C #์ฒ๋ผ ๋์ํ๊ณ ๋์ง๋๋กํ๋ Strict-mode๋ฅผ ๋ฐ๋ช
ํ์ต๋๋ค.ํ์ง๋ง ๊ทธ ์ํฉ์์๋ง ๋์ง์ง ๋ง, ์๋์ผ๋ก ๋ฉค๋ฒ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ ๋ง ์ฅํฉํ๊ณ ๊ท์ฐฎ์ ๊ณ ์๋ฌด๋ ์
๋ ฅํ๊ณ ์ถ์ง ์์์ต๋๋ค. ๊ทธ ๋ฌธ์ ๋ฅผ ์ ๋ฉด์ผ๋ก ํด๊ฒฐํ๊ณ strictmode์ ํํ์ ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋๋ ๋์ , ๊ทธ๋ค์ ๊ทธ๊ฒ์ ํผํ๊ณ ๋์ C #์ ?.
์ฌ์ฉํ์ฌ ์์ฒญํ ์๊ฒฉํจ์์ ์๋ฐํ ๋ฐฉ๋ฒ์ ์ป์์ต๋๋ค. ์ด๊ฒ์ ์ฝ๊ฐ ํธ๋ฆฌํฉ๋๋ค. ๋น์ ์ ์ํด, ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ ์ํด ์ง์ฆ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ฌ์ ํ โโ๋ฉค๋ฒ ์กด์ฌ ํ
์คํธ๊ฐ ์์ผ๋ฉฐ strictmode์ ํํ์ ์ฌ์ ํ โโ์ฅํฉํ๊ณ ์ฑ๊ฐ์ ์ผ์ด์ง๋ง ์ ์ด๋ 'strictmode'์๋ 'normalmode'ํ์ถ ํด์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณ ํต์ ๊ฒช์ ํ์๊ฐ ์์ต๋๋ค. ์ง๊ธ". Ick.
์ฌ์ฉํ ๋ ์คํจํ๋ ์๊ฒฉํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฐ๋ฆฌ ์ค ํ ๋ช ์ด ์ค์๋ฅผ ํ ๊ฒ์ ๋๋ค.
ํ์ ์กฐํ์ ๋ํ ๊ฐ๋จํ null ๊ฒ์ฌ๊ฐ ๋์ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ค์ ํ์ ์กฐํ๋ if (result is null)๋ณด๋ค ํจ์ฌ ๋น์๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋์๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. PS non-strictmode๋ ์ด๋ฏธ ๊ทธ๋ ๊ฒํ๊ณ ์์ผ๋ฉฐ, ์ ์ ๋ ?.
๋ํ ๋ฐ๋์งํ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋งค์ฐ ๋ค๋ฅด๊ณ ๋ ๋ง์ ์ํฉ์์ ์ ์ฉํ๋ค.
๊ทธ๋ฌ๋ PS์์๋ C #์ด ํ ์์๋ ์ผ์ ํ ์ ์์ต๋๋ค.
(1..3)[1kb..100kb]
์๊ฒฉํ์ง ์์ ๋ชจ๋์์๋ ์์ธ๊ฐ ์์ต๋๋ค. ์ซ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์๊ฐ์ด ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋์ง ํ์ธํ์ญ์์ค. ์ฑ๋ฅ๊ณผ ์์์ ๊ฐ์ฒด๋ก ์ธ๋ฑ์ฑํ๊ธฐ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ํด์ผํ๋ค๊ณ ์๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ๋จํ๋ฉด ํธ์๋ฅผ ์ํด ์ค์ ๋ก ~ 100,000 ๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ์นจ๋ฌตํ๋ ๊ฒ ๊ฐ์ต๋๋ค. PS๋ ํญ์ "๊ฐ๋ฅํ ํ ๋นจ๋ฆฌํด์ผํ๊ณ , ์ฌ์ฉ์์๊ฒ ๋ถํธ์ ๋ผ์ณ ์ผํ๋ค"๋ ์ ํ์ํ๋ ๊ฒ์ ์๋๋๋ค. ์ ๋ ๊ทธ ์ ์ด ๋ง์์ ๋ญ๋๋ค.
@HumanEquivalentUnit ๋ชจ๋ ์ธ์ด์๋ ๊ฒฝ๋ ฅ์ ์ฌ์ฉํ์ง ์์ ์์๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ ์คํ์ผ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ์ ์๊ฒฉ ๋ชจ๋๋ฅผ ๋๋ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๊ฒ์ ์คํฌ๋ฆฝํธ์์ ์ข์ ๊ดํ์ด๋ฏ๋ก ์ธ์ด๊ฐ ๋ฌธ์ ๋ฅผ ์ผํค๋ ๊ฒ๋ณด๋ค ์์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ๊ณณ์์ ์์ ์ ๋น catch ๋ธ๋ก์ ๊ฐ์ง). ๋ค์ ๋งํ์ง๋ง, ๋น์ ์ ์์ง๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค (์๋ฅผ ๋ค์ด, ๋ด๊ฐ ์ฌ์ฉํ ์ ์ด Out-Default
).
๋ํ ์ฐ์ฐ์๋ ?
๊ฐ ์๋๋ผ ?.
. ์ธ๋ฑ์ค ์ก์ธ์ค์์๋ ์๋ํฉ๋๋ค.
๊ณ์ํด์ ์ถ๊ฐ ๋ ผ์๋ฅผ์ํ ํ ๋๋ฅผ ๋ง๋ จํ๊ธฐ ์ํด ๊ธฐ์กด์ ์๊ฒฉํ ๋ชจ๋๊ฐ null ๊ฐ ์กฐ๊ฑด๋ถ ๋ฐ ๋ฉค๋ฒ ์กด์ฌ ์กฐ๊ฑด๋ถ ์ก์ธ์ค์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง ์์ฝํ๊ฒ ์ต๋๋ค ( ์์ ์๊ฐ
์๋ ์ด์ Set-StrictMode
์ค์ ์ ๋ํ๋ด๊ณ ์ด ๊ฐ์ ๋ค์์ ๋ํ๋
๋๋ค.
์ ์ณ๋๊ณ : ์ค๋ฅ๊ฐ _script_-terminating์ด ์๋๋ผ _statement-_ ๋ฟ์ด๋ผ๋ ์ฌ์ค์ PowerShell์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๋ ํฐ ๋ ผ์์ ๊ด๋ จ์ด ์์ต๋๋ค .https : //github.com/PowerShell/PowerShell-Docs/issues/1583์ ์ฐธ์กฐ ํ์ญ์์ค.
$obj
_itself_๋ $null
.๊ตฌ์ฑ | -์คํ | -๋ฒ์ 1 | -๋ฒ์ 2 | -๋ฒ์ 3+
---------- | ---- | ---------- | ---------- | ------------
$ obj | ๐ | ๐ซ | ๐ซ | ๐ซ
$ obj.Prop | ๐ | ๐ | ๐ซ | ๐ซ
$ obj [42] | ๐ซ | ๐ซ | ๐ซ | ๐ซ
$ obj.Method () | ๐ซ | ๐ซ | ๐ซ | ๐ซ
-Off
๋ฐ -Version 1
, $obj.Prop
๋ ํ์ฉ๋๋ ๋ฐ๋ฉด $obj[42]
๋ ํ์ฉ๋์ง ์์ต๋๋ค.
$obj
is non- $null
์ด์ง๋ง ์ก์ธ์ค์ค์ธ ๋ฉค๋ฒ / ์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.๊ตฌ์ฑ | -์คํ | -๋ฒ์ 1 | -๋ฒ์ 2 | -๋ฒ์ 3+
---------- | ---- | ---------- | ---------- | ------------
$ obj.Prop | ๐ | ๐ | ๐ซ | ๐ซ
$ obj [42] (์ธ๋ฑ์ฑ ๊ฐ๋ฅ) | ๐ | ๐ | ๐ | ๐ซ
$ obj [42] (์ธ๋ฑ์ฑ ๋ถ๊ฐ๋ฅ) | ๐ | ๐ | ๐ซ | ๐ซ
$ obj.Method () | ๐ซ | ๐ซ | ๐ซ | ๐ซ
๋ณธ์ง์ ์ผ๋ก ์ธ๋ฑ์ฑ ํ ์์๋ ๊ฐ์ฒด (์ : ๋ฐฐ์ด)๋ -Version 2
๋ ์กด์ฌํ์ง ์๋ ์์์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํ๋ ๋ฐ๋ฉด, PowerShell์ด โโ์ปฌ๋ ์
๊ณผ์ ํตํฉ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ธ๋ฑ์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ค์นผ๋ผ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
null-soaking ( null-conditional ๋๋ C #์ Elvis ) ์ฐ์ฐ์๋ StrictMode Latest์์ ์คํ ์ค์ด๊ฑฐ๋ ์กด์ฌํ์ง ์์ ์์๋ ์์ฑ์ ์ก์ธ์คํ๋ ค๊ณ ํ ๋ ๊ฑฐ์ ํ์์ ๋๋ค. ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ฒญํ ์์์์ ์์งํด์ผํฉ๋๋ค.
function Get-OptionalPropertyValue($object, [string] $propertyName) {
if (-not ([bool] (Get-Member -InputObject $object -MemberType Properties -Name $propertyName))) {
return $null
}
$object.$propertyName
}
$value = Get-OptionalPropertyValue $foo "bar" # if $foo.bar exists, $value will contain its data; else $value will be $null
๋น์ ์ด _really_ ๊ทธ๋ฅ ์ธ ์ ์์ด์ผ ํ ๋ :
$value = $foo?.bar # if $foo.bar exists, $value will contain its data; else $value will be $null
์ ๋ฐ, ๋ง์ฝ ๋น์ ์ด์ด ์ ์์์ ์ค์ง ์์ฑ์ ๋ํด์๋ง null-conditional์ ์ป์ ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ ๋ง์ ์ฌ๋๋ค์ ๊ทธ๋ ๊ฒ ๋ง์ ๊ณ ํต์ ๋์ด ์ค ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์๋ณด๊ธฐ ์์ํ๊ณ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
??
๋ฐ ?=
๊ณ ๋ คํด๋ณด์ญ์์ค.
$x ?= 1
๋ฐ $x ?? 1
์ ๊ฐ๋จ ํด ๋ณด์
๋๋ค. ํ์ง๋ง ์ฐ์ฐ์์ด๋ฏ๋ก $x?=1
๋ฐ $x??1
๋ฅผ ์ง์ํด์ผํฉ๋๋ค.
๋ฌธ์ ๋ $x?
๋ฐ $x??
๋ชจ๋ PowerShell์์ ๋ณ์ ์ด๋ฆ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ค๋ ๊ฒ์
๋๋ค. ๋ช
ํํ๊ฒํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ${x}?=1
๋ฐ ${x}??1
์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด๋ถ ๋ฉค๋ฒ ์ก์ธ์ค ?.
๋ฐ ?[]
๊ฒฝ์ฐ ${x}?.name
๋ฐ ${x}?[0]
์ด ์์ด์ผํฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ $x ?.name
๋ฐ $x ?[0]
๋ ์ง์๋์ง ์์ต๋๋ค.
๋ค๋ฅธ ์ต์
์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์ ๋์
ํ๊ณ ๋ณ์ ์ด๋ฆ์ ?
๋ฅผ ์ ํ ํ์ฉํ์ง ์๋ ๊ฒ์
๋๋ค.
์ด๋ป๊ฒ ์๊ฐํด? ๋ฟก ๋นต๋จ
/ cc @rjmholt @ daxian-dbw @JamesWTruher
๋๋ ํน๋ณํ _liked_ํ์ง ์์๊ณ ?
์ด ์ ํจํ ๋ณ์ ์ด๋ฆ ์ธ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. $Safe?
์ ๊ฐ์ ์ด๋ฆ์ ๋ฌธ์ด ์ด๋ฆฌ๋๋ฐ, ์ด์จ๋ $IsSafe
๋ก ์ธ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ช
ํํ๊ณ ๋ ์ด์ํฉ๋๋ค.
๊ทธ ๋ณํ๋ ์๋ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค ๊ณ ์๊ฐํฉ๋๋ค.
์ผํญ ์ฐ์ฐ์๊ฐ ?
๋๋๋ ๋ณ์์ ์ ๋๋ก ์๋ํ๊ธฐ ์ํด ์ฐ์ฐ์ ์ฃผ์์ ๊ณต๋ฐฑ์ด๋ ๋ณ์ ์ด๋ฆ ์ฃผ์์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๊น?
์ด๋ฌํ ์ฐ์ฐ์๊ฐ ๋์
๋๋ฉด PowerShell์ ?
๋๋๋ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์๊ฐ $x?[0]
์ ๊ฐ์ ๊ตฌ๋ฌธ์์ ์ฐ์ฐ์์ ์ผ๋ถ๋ก ?
๋ฅผ ์ธ์ํ๋ ์ฐ์ ์์๋ฅผ ์ง์ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค $x?[0]
์ปฌ๋ ์
์ ์ ์ฅํ๋ ค๋ฉด ?
๋์ ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ผํฉ๋๋ค (์ด ๊ฒฝ์ฐ ๊ณต๋ฐฑ์ ์ ํจํ์ง ์์ผ๋ฏ๋ก) : ${x?}?[0]
. $x?.Name
๋ฐ ${x?}?.Name
์
๋๋ค.
๋ค๋ฅธ ์ต์ ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๋์ ํ๊ณ ? ๋ณ์ ์ด๋ฆ์ ์ ํ.
๐ ์ด๊ฒ์ด ์ฃผ์ ๋ฒ์ ๋ณ๊ฒฝ (6์์ 7)์ด๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ฌ๊ธฐ์์ ํฐ ๋ณํ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. GitHub๊ฐ ?
๋๋๋ PS ๋ณ์์ ์ธ์คํด์ค๊ฐ ๋ช ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ ๋์ ์ฝ๋ ๊ฒ์์ด ์์์ผ๋ฉดํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ทธ๋ค์ง ์ํฅ์ ๋ฏธ์น์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง GitHub์ ๋ํด ํ์ธํ๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค. PowerShell์ ์ฌ์ฉํ 14 ๋
๋์ ์ ๋ ๋ณ์ ์ด๋ฆ์ ?
๋ฅผ ์ฌ์ฉํ ์ ์ด ์์ง๋ง ์๋ง๋ ์ ์ผ ๊ฒ์
๋๋ค. :-)
๊ทธ ๋ฐฐ๋ ์ค๋ ์ ์ ํญํดํ์ผ๋ฉฐ ์ค๋๋ ์คํฌ๋ฆฝํธ์์ ?
๋ก ๋๋๋ ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์๋ณด๊ณ ๋๋ผ์ง ์์ ๊ฒ์
๋๋ค.
์ด ์์ ์์ ์ฐ๋ฆฌ๋ ๋จ์ํ ํด์์ ์ฐ์ ์์๋ฅผ ๊ฒฝ์ฐ ?
๊ฐ ์๋ก์ด ์ฌ์
์๋ก ๋๋๋ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ฌ ๋ ์์
์์ ์๋ ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ๋ก ์ผ๋ถ๋ก ?
ํด์ผ {}
๋๋ ๊ณต๋ฐฑ (๊ณต๋ฐฑ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐ)์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ฐ์ฐ์์ ํจ๊ป ํด๋น ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด ๋ฌธ๋งฅ์์ "์ ๋ฐฐ๊ฐ ํญํดํ๋ค"๋ผ๋ ๋ง์ ๋ฃ๋ ๊ฒ์ ์ด์ํฉ๋๋ค. ์ด๊ฒ์ _ ์ฃผ์ ๋ฒ์ _ ๋ณ๊ฒฝ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ด๊ฒ์ด ๋ฐ๋๋ ๊ฒ์ด ๋ถ๋นํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rkeithhill ๋๋ ๊ทธ๊ฒ์ ๊ฐ์ธ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉํ์ง๋ง ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ธฐํธ๋ฅผ ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ง๊ด์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต๋ ์์ ์ ๋ถ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค (
@KirkMunro ๊ฐ "์ฌ์ ๊ตฌ๋ฌธ ๋ถ์"์ํ๋ ๊ฒ์ ๋ฒ๊ทธ์ ๋ํ ์ด๋ฆฐ ๋ฌธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@ vexx32 : ์ฃผ์ ๋ฒ์ ๋ณ๊ฒฝ์ด๋ฏ๋ก ๋ธ๋ ์ดํน ์ฒด์ธ์ง์๋ ๋ถ๋นํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๊ธฐ์ค์ ๋งค์ฐ ๋๊ฒ ์ ์ง๋์ด์ผํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ?
์ฌ์ฉํ๋ ํ {}
๋ณ์ ์ด๋ฆ์ ์๋ณํ๊ธฐ์ํ
?
๋ก ๋๋๋ ์์ฑ ์ด๋ฆ๋ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ฌ ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ง ์๊ณ PowerShell์์ ์ด๋ฌํ ์์ฑ์ ๋ณด๋ ค๊ณ ํ๋ฉด ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด :
PS C:\> $o = [pscustomobject]@{
'DoesItBlend?' = $true
}
PS C:\> $o.DoesItBlend?
At line:1 char:15
+ $o.DoesItBlend?
+ ~
Unexpected token '?' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
PS C:\> $o.'DoesItBlend?'
True
์ค๋์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๋ ๊ฒ์ด ์กฐ๊ธ ๋๋์ต๋๋ค (์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์ต๋๊น?). ๊ทธ๋ฌ๋ ์ด๋ฌํ ์์ฑ์ ๊ฒฝ์ฐ ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผํฉ๋๋ค.์ด ๊ฒฝ์ฐ ๋ฐ์ดํ ๋ค์ ์ผํญ, null์ ์ฌ์ฉํ ์ ์์ต๋๋ค. -ํฉ์ฒด ๋ฑ ์ฐ์ฐ์๋ ๊ณต๋ฐฑ์์ด ์ ์๋ํฉ๋๋ค. ์ด ๊ตฌ๋ฌธ์ ${x?}?.name
์ ๋งค์ฐ ์ ์ฌํ๋ฉฐ ์ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ณ์ / ์์ฑ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋ค๋ ์
์ฅ์ ๋์ํ์ง๋ง ์ด๋ฌํ ์ด๋ฆ์ ์ผํญ ๋๋ null๊ณผ ํจ๊ป ์๋ํ๋ ค๋ฉด ์ถ๊ฐ ๊ตฌ๋ฌธ์ด๋ ๊ณต๋ฐฑ์ด ํ์ํ ์ ์์ต๋๋ค. -* ์ฐ์ฐ์.
@KirkMunro ์ฌ๋๋ค์ด ๋ํดํ ๋ณ์ ์ด๋ฆ์ ์ํ๋ ๊ฒฝ์ฐ ์์ผ๋ก ๋ณ์ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
PowerShell 7์ ์ฌ๋๋ค์ ์ด๋ฏธ ์ด๊ด์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๊ณ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ ์ฌ๋๋ค์ ์ฌ์ ํ โโ<= v5.1์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ค๋ซ๋์ ๊ณ์ํ ๊ฒ์ ๋๋ค. msft๊ฐ Windows 10์์ ์ ๊ฑฐ ํ ๋๊น์ง ๊ฐ๋ฅํฉ๋๋ค (์ ๋ ์ ๋จ).
@KirkMunro ๋ฌผ๋ก ์
๋๋ค.ํ์ง๋ง ํ์ค ํ์ฉ ๋ณ์ ๋ฌธ์์์ ์ ๊ฑฐํ๋ค๊ณ ํด์ ์ฌ์ฉ์๊ฐ ${Valid?}
๋ฅผ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ง๋ ์์ต๋๋ค. ๊ทธ๋ค์์ด ์ฐ์ฐ์๋ค๊ณผ ์๊ด์์ด ๊ทธ๋ ๊ฒํด์ผํ๊ธฐ ๋๋ฌธ์, ?
๊ฐ ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ _ ๋๋๋ก _ ์ค์ง _ ๋ง _ ๋ฌธ์๊ฐ๋๋ ๊ฒ๋ณด๋ค๋ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ์ ์ด๋ฏธ ํ๊ธฐ์ ์ธ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ๋ค๋ฅธ ์์ค์ ๋ชจํธ์ฑ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ์ ์ด๋ ๊ทธ๊ฒ์ ๋ํด ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋๊น์ง๊ฐ๋ ๊ฒ์ด ์ต์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐
@adityapatwardhan ์ธ์ด๊ฐ ์ ํจํ ๋ณ์ ๋ฌธ์๋ก ?
๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์คํฌ๋ฆฝํธ ์์ฑ ํ๋ก์ธ์ค์ ๋ง์ ์ธ์ฒด ๊ณตํ์ ์ถ๊ฐํ๋ ์น์ํ ๊ตฌ๋ฌธ์์ null-soak / coalesce ๋ฐ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@KirkMunro ๊ฐ "์ฐ์ ์์ ํ์ฑ"์ํ๋ ๊ฒ์ ๋ฒ๊ทธ์ ๋ํ ์ด๋ฆฐ ๋ฌธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@ TheIncorrigible1 : ์ ๋๋ก ๊ตฌํ๋์ง ์์ผ๋ฉด ๋ชจ๋ ์ฝ๋๊ฐ ๋ฒ๊ทธ์ ๋ฌธ์ ์ด ์ ์์ต๋๋ค. ์ ๋ PowerShell์ด โโ๋ณ์ ๊ฒฝ๊ณ๋ก ๋ฌถ์ด์ง ์์ ๋ณ์ ์ด๋ฆ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ?
๋ฌธ์๋ฅผ ๋ง๋ ๋ PowerShell์ด โโ์ผํญ ๋๋ null- * ์ฐ์ฐ์๋ก ์คํ๋๋์ง ์๋ณํ๊ธฐ์ํ ๊ฐ๋จํ ๋จ์ผ ๋ฌธ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ณต์กํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฝ๋ ๋ณ๊ฒฝ๋ณด๋ค ๋ ๋ง์ ๋ฒ๊ทธ์ ๋ฌธ์ ์ด์ง ์์ต๋๋ค.
PowerShell 7์ ์ฌ๋๋ค์ ์ด๋ฏธ ์ด๊ด์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๊ณ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ ์ฌ๋๋ค์ ์ฌ์ ํ โโ<= v5.1์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ค๋ซ๋์ ๊ณ์ํ ๊ฒ์ ๋๋ค. msft๊ฐ Windows 10์์ ์ ๊ฑฐ ํ ๋๊น์ง ๊ฐ๋ฅํฉ๋๋ค (์ ๋ ์ ๋จ).
@ TheIncorrigible1 : ๊ทธ ์ง์ ์ ๋ํ ๊ทผ๊ฑฐ / ์ฆ๊ฑฐ๋ ๋ฌด์์ ๋๊น? PowerShell 7์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ์ ๊ณต๋๋ฏ๋ก ํ์ฌ๋ ๋งค๋์ ๋ง ์ฌ์ฉํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฌ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋์ด์ PowerShell 7 ์ด์์ด ํ์ฌ์ ํ์ํ ๋งค๋ ฅ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋์์ ํ์ํ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ ํด๋น ๋ฒ์ ์ ์ฌ์ฉํ๊ฒ๋ฉ๋๋ค. PowerShell 7์ด OS์ ํจ๊ป ์ค์น๋ ๊ฒฝ์ฐ ํนํ ๊ทธ๋ ์ต๋๋ค. ์ ํธ๊ฐ๊ฐ ์์ฉํ๋ ์ ์ผํ ์์ ์ PowerShell 7์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ํ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ด์๋ ์กฐ์ง์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ด๋ฏธ ํ๊ธฐ์ ์ธ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ๋ค๋ฅธ ์์ค์ ๋ชจํธ์ฑ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ์ ์ด๋ ๊ทธ๊ฒ์ ๋ํด ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋๊น์ง๊ฐ๋ ๊ฒ์ด ์ต์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐
@ vexx32 ์คํธ๋ ์นญ์
๋๋ค. ๋ณ์ ์ด๋ฆ์ ??
์ด ์์ผ๋ฉด ํฐ ๋ณํ๊ฐ ๋ ์ ์์ง๋ง ์ด๋ฆ์ด ๋จ์ผ ?
๋๋๋ ๋ณ์๋ฅผ ๊ฐ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ต๋๋ค. ๊ทธ ์ธ์๋ ํ์ค ํ์ฉ ๋ณ์ ๋ฌธ์ ์ค๋จ ์คํฌ๋ฆฝํธ๋ก ?
๋ฅผ ์ฌ์ ํ ์ง์ํ๋ฉด์ null- * ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ด ๊ฒฝํ์ ์์ ํ๊ธฐ ์ข์ ์ฌ๋ (์ด๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์)์ ๋ํ ๋ณํ๋ฅผ ๊นจ๋ ๊ฒ์ ๊ฑฐ๋ถ๋์ง ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ๋ฐ์ํ๋ฉฐ, ๊ทธ์ ๋ํ ๋ ผ์ / ๋ ผ์๋ ์ผ์ ๊ทน์ ์ผ๋ก ์๋ฃํ๋ ๊ณผ์ ์ ๋ฆ์ถ๋ ์ญํ ์ํฉ๋๋ค. ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒฝ์ฐ ์ํฅ์ ํ๊ฐํ๊ณ ๊ทธ๋ฌํ ๋ณ๊ฒฝ์ ์ ๋นํ ํ ์ ์์ด์ผํ๊ธฐ ๋๋ฌธ์ ์๋ ์ ํ๊ฐ ์ข ์ข ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋ ๊ทธ ์ฆ๊ฑฐ๋ฅผ ์์งํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด ๋ง์ํ๋ ์ด์ ๋ ์ธ์ ๋ผ๋ ์ข์ ๋ณํ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ๋ณด๋ค ์ง๊ธ ๊ธฐ๋ฅ์ ์์ฑ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋ ๋ณ์ ์ด๋ฆ์ ?
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.ํ์ง๋ง ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ์ ์ฝ์ ์ ์๊ณ PowerShell 7์ ๋ํ ์ง์
์ ๋ถํ์ํ ์ฅ๋ฒฝ์๋๋ฉด ์ฑํ ์๋๊ฐ ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ฌ๋๋ค์ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ํนํ PowerShell์ ์ฌ์ฉํ๋ ๋ง์ ์ฌ๋๋ค์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํตํด ์์
ํ๋ ๋ฐ ๋ ์ต์ํ ๊ฐ๋ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ต๋๋ค.
์ด์จ๋ ,์ด ๊ณผ์ ์ ๋ฆ์ถ๋ ๊ฒ์ ๋ด ์๋๊ฐ ์๋๋ผ ์คํ๋ ค ๊ทธ ๋ฐ๋์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์ ์๊ฐ๊ณผ ๊ฒฝํ์ ๊ณต์ ํ์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ํ๊ธฐ์ ์ธ ๋ณํ๋ฅผ ์ถ์งํด์ผํ๋์ง ์ฌ๋ถ์ ๋ํด์๋ ๋ ์ด์ ์ธ๊ธํ์ง ์๊ฒ ์ต๋๋ค.
์ด ์ธ์์ ์ธ ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
$ValueIsValid? = @( $true, $false, $false, $true )
$ValueIsValid?[0]
# old behaviour? gets `$true`
# new behaviour? gets nothing, because the `?[0]` is interpreted as a null-conditional access.
์ด ๋์์ ์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก _ ์ด๋ฏธ _ ์ค๋จ๋ฉ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์์ธ๋ฅผ ๋์ดํ๊ณ ?
๊ฐ์๊ธฐ ์ ํจํ์ง ์์์๊ธฐ์ ์์น, ๊ทธ๋ฆฌ๊ณ ์ฌ์ ํ์๋ ์์น๋ฅผ ๋์ดํ๊ธฐ ์ํด ๋ฐ ํ์ด์ง ์ค๋ช
์ด ํ์ํ ํผ๋์ค๋ฌ์ด ํด์๋ณด๋ค ์ผ๊ด๋๊ณ ๊นจ๋ํ ํด์์ ์ ํธํฉ๋๋ค.
@KirkMunro PowerShell 7 ์ด์์ด ํ์ฌ์ ํ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋์์ ํ์ํ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ ํด๋น ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. PowerShell 7์ด OS์ ํจ๊ป ์ค์น๋ ๊ฒฝ์ฐ ํนํ ๊ทธ๋ ์ต๋๋ค.
ํฌ์ธ 50 ๋์ ๊ทผ๋ฌดํ๋ฉด์ ์ผ๋ถ ์ง์ ๊ธฐ๋ฐ์ด ์์ญ๋ง ๋ช ์ ์ด๋ฅด๋ ์ง๋ง OS์ ๊ธฐ๋ณธ ์ค์ ์์ ๋ฒ์ด๋๋ ๊ฒ๋ ๋์ ์ด์์ต๋๋ค (์ : v5.x๋ก ์ด๋). Core๋ฅผ ์ฑํํ ๊ณณ์ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค. ์คํ๋ ค ์ํธ ํธํ์ฑ์ ์ํด Python์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Windows ์ ํ์ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ๊ฒ๋ ๋งค์ฐ ๋๋ฌธ ์์ ์ด์์ต๋๋ค.
ํ์ฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ก์ด ๊ธฐ์ ์ด๋ ์ธ์ด ๋ฒ์ ์ ์ฐพ๋ ๊ฒ๋ณด๋ค ์์ ์ด ๊ฐ์ง ๊ฒ๊ณผ ์ง์์ ์ง์ ๊ธฐ๋ฐ์ ๊ฐ์ง๊ณ ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ถ๋ v2์ ์์ํ ๋จธ๋ฌผ๋ฉฐ ์ถ์ ๊ทน์ ์ผ๋ก ์ฝ๊ฒ ๋ง๋๋ Win10 / Server16 cmdlet์ ๊ฒฐ์ฝ ๊ฑด๋๋ฆฌ์ง ์๋ ์๋ฒฝํ ์ฝํ ์ธ ์ผ ๊ฒ์ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๋ํ ๋์ ์์ ์ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ์ง๊ณต ์ํ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ์ธ์ด๋ฅผ๋ณด๋ค ์ธ์ฒด ๊ณตํ์ ์ผ๋ก ๋ง๋ค๋ฉด ์ฌ๋๋ค์ด ๋ฌธ์ ๋ฅผ ๋ ๋นจ๋ฆฌ ํด๊ฒฐํ ์์๋ ๋๊ตฌ์ ๊ด์ฌ์ด์๋ ์ฌ๋๋ค์ด ๋ ๋ง์ด ์ฑํ ํ ์ ์์ต๋๋ค. (์ฐธ์กฐ : C # ๋ฐ ๋ ๋ง์ / ๋ ๋์ ์ธ์ด ๊ธฐ๋ฅ์ผ๋ก ์ธ๊ธฐ ์ฆ๊ฐ)
?
๋๋๋ ๋ณ์์ ๊ด๋ จํ์ฌ-์๋ ๋ณ์ $? .
@lzybkr ์ ๋ $^
๋ฐ $$
๋ํด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๊ฒฝ์ฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@lzybkr @ TheIncorrigible1 ์ ๊ฐ ๊ธฐ์ตํ๋ ํ, ๋ชจ๋ ๋ณ์๋ ํ ํฌ ๋์ด์ ์์ ๋ช
์ ์ ์ผ๋ก ํน์ํ ๊ฒฝ์ฐ์
๋๋ค. $^
_already_์ (๋) ์ ํจํ ๋ณ์ ์ด๋ฆ์ด ์๋๋๋ค. ํ ํฌ ๋์ด ์ ๋ ํ์ค ๋ณ์ ์ด๋ฆ์ ์ฐพ๊ธฐ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฒ์ ๋ํ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ ์ผํ ํด๊ฒฐ์ฑ
์ ยฟ
.
$ silly? ยฟ = 1
๋๋ ์คํฐ๋ธ๋ฅผ ๋ชฐ๋ผ, ๋๋ ์ด๊ฒ์ ๋ํด interrobang ๊ตฐ์ค์ ๋จ๋จํ ์์ต๋๋ค.
$silly?โฝ=1
@lzybkr- ๋ด๊ฐ ์๋ ํ $?
$$
๋ฐ $^
๋ ํน๋ณํ ๋ฐฉ์์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค.
์์ฝํ๋ฉด ๋ค์ ๋ค ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
?
๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.?.
๋ฅผ ์ฐ์ฐ์๋ก ์ ํธํฉ๋๋ค. ์ฆ, ?
๋๋๋ ๋ณ์ ์ด๋ฆ์ ${variablename}
๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ฌ์ ํ ํ๊ธฐ์ ์ธ ๋ณํ์
๋๋ค.?.
๋ฐ ?[]
, ${variablename}?.property
์ฌ์ฉํด์ผํฉ๋๋ค. ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ง๋ง ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฌ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง์ ์ ํธํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ฃผ์ ๋ฒ์ ๋ณ๊ฒฝ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ด๊ฒ์ด ๋ฐ๋๋ ๊ฒ์ด ๋ถ๋นํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค์ํ ์ ์ Windows PowerShell์ ๋์ฒด ํ ์ค๋น๊ฐ๋์์์ ์๋ฆฌ๊ธฐ ์ํด ๋ฉ์ด์ ๋ฒ์ ์ด ์ฆ๋ถ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์์์ด ์๋๋ผ ํธํ์ฑ์ ๋ํ๋ ๋๋ค. ์๋ ๋ฐํ์์ :
์ฃผ ๋ฒ์ ์ด ์ค๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
์ต์
1๊ณผ 2๋ ๋์ผํ์ง ์์ต๋๊น? ์๋๋ฉด ๋ณ์ ๋ค์ ๋ ํตํฉ ๋๋ ์ผํญ ์ฐ์ฐ์๊ฐ์๋ ๊ฒฝ์ฐ์๋ ?
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
๊ทธ๋ ๋ค๋ฉด ๋ง์ ์ญ ์ถ์ ์์ด ํ ํฐ ํ / ํ์ฑ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ก ์ธํด ๋ณ์๊ฐ ?
๋๋๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ์ ํ ๋ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ณผ ์ ์๋ฏ์ด ์ต์
2๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ฌ๊ธฐ์ ์ฃผ์ ๋ณ๊ฒฝ์ ๊บผ๋ฆฌ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ๋ณ์ ์ด๋ฆ์ ๋ฌถ์ง ์๊ณ ๋ ์ฌ์ฉํ ์์๋ ์๋๋ฆฌ์ค๋ฅผ ๋์
ํ์ฌ ๋ณ์ ์ด๋ฆ์ ?
์ฌ์ฉ์ ์ ๊ทน์ ์ผ๋ก ์ต์ ํ ์ ์์ต๋๋ค.
๋ด ์๊ฐ์ ์ด๊ฒ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์งํ๋จ์ ๋ฐ๋ผ ์๋นํ ์ฌ์ํ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ ์์๋ ๊ฒ๊ณผ ์ฌ์ฉํ ์์๋ ๊ฒ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ ๊ฒ์ ์๋ง๋ ๋ ๋์ ์ ํ ์ผ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๊ฒ๋ค์ ๊ฑฐ์ ๋ชจ๋ ์ํฉ์ ์ ์ฉ๋๋ ๋ช
ํํ ๊ท์น์ด ์์ด์ผํฉ๋๋ค. ํ์ฌ ์ด๊ฒ์ด ์ฌ์ค์
๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ฌผ์ ์งํํ์ผ๋ก ๋ง๋ค๊ณ ํ๋์ _less_ ๋ช
ํํ๊ฒ ๋ง๋ค ๊ฒ์ ์ ์ํฉ๋๋ค. ?
ํฌํจํ๋ ๋ณ์ ์ด๋ฆ์ด ์ผ๋ถ ์๋๋ฆฌ์ค์์ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ์ด๋ ต ๊ธฐ ๋๋ฌธ์ ๋ ์ฌ์ฉ๋๋ค๋ ์ ์ ์ ์ธํ๋ฉด ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. (ํจ๊ณผ์ ์ผ๋ก) ์ต์
1๋ก ๋ฐ๋ก ๋์๊ฐ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฑฐ์ ... ๊ทธ๋์ ์ง๊ธ์ ์ฌ์ง ์๊ณ ๋ชจํธํ ํ๋์ ํผํด์ผ ํ ํน๋ณํ ์ด์ ๊ฐ ์์ต๋๋ค.
@ vexx32 1๊ณผ 2 ์ฌ์ด์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
# 1์ ๊ฒฝ์ฐ ?
๋ฅผ ๋ณ์ ์ด๋ฆ์ ๋ชจ๋ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ์ด๋ $x? = 1
, $x?? = 1
$x?x?x = 1
๋ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์์ ์๋ฏธํฉ๋๋ค.
# 2์ ๊ฒฝ์ฐ $x? = 1
๋ ์ฌ์ ํ ์ ํจํ์ง๋ง $x?.name
๋ ${x}?.name
์ ๋์ผํฉ๋๋ค. ์ด๊ฒ์ ๋ฉค๋ฒ์ ์ก์ธ์คํ๋ ๋์ ?
๊ฐ์๋ ๋ณ์ ์ด๋ฆ ๋ง ๋์ต๋๋ค. ๋ฐ๋ผ์ $x? = 1
, $x?? = 1
$x?x?x = 1
๋ ์ฌ์ ํ ์ ํจํฉ๋๋ค.
๊ทธ๋, ๋๋ ๊ฑฐ๊ธฐ์์ ์ค๋ฒ ํค๋๋ฅผ ํ ํฐ ํํ๋ ๊ฒ์ ๋ํด ์ฝ๊ฐ ๊ฑฑ์ ํ ๊ฒ์ด๋ค. ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ๋ชจ๋ ๊ตฌํํ๊ณ ๋น์ทํ ๋ณ์ ์ด๋ฆ์ ํฉ๋ฆฌ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ์์ ๋ฒค์น ๋งํฌ๋ฅผ ์ํ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ ๊ฐ ์ ํธํ๋ ๊ฒ์ ํ์คํ ์ต์ 1์ ๋๋ค. ์ ์ด๋ ํ ๋ฒ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ ๋ฏธ๋๋ก ํ์ฑ ํ ์์๋ ๋ฐฉ๋ฒ์ ๋ถ์ผ์น๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ซ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ง์ ์ญ ์ถ์ ์์ด ํ ํฐ ํ / ํ์ฑ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ์๊ฐ?๋ก ๋๋ ๋ ์ฑ๋ฅ์ด ์ ํ ๋ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ๊ฐ๋ฅ์ฑ์ ๋ํ ์ฐ๋ ค๋ฅผ ๊ณต์ ํฉ๋๋ค. ๊ฐ๋ ํ ํฐ ๋ถ๋ฆฌ ์๋ก ?
์ ์ฌ์ฉํ๋ ๊ฒ์ ์ธ์ด์์ ๋ค์ญ๋ ์ญ ํ ์ ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ง์ ์ญ ์ถ์ ์์ด ํ ํฐ ํ / ํ์ฑ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ์๊ฐ?๋ก ๋๋ ๋ ์ฑ๋ฅ์ด ์ ํ ๋ ์ ์์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ํ ํฐ ํ ํ ๋ค์ ๋ฐฑ์
์ ๊ทผ ๋ฐฉ์๋ณด๋ค๋ ์๊ฒฌ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ๋ ํ ๊ด์ฐฎ์ต๋๋ค. ๋ณ์ ์ด๋ฆ์์ ?
๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ค์ ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ๋ฏธ๋ฆฌ ์ดํด๋ณด๊ณ ๋ค์ ํญ๋ชฉ์ ๋ฐ๋ผ ๋ณ์ ํ ํฐ์ "ํฌ์ฅ"ํ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ง์ ๋ฌธ์ ๊ฐ ์๋๋ฉฐ ์ญ ์ถ์ ์ด ํ์ํ์ง ์๊ฑฐ๋ ๋์ ๋๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํด์๋ ์๋ฉ๋๋ค.
@ PowerShell / powershell-committee๊ฐ ์ค๋ ์ด๊ฒ์ ๊ฒํ ํ์ผ๋ฉฐ ๋ช ๊ฐ์ง ์๊ฐ์ด ์์ต๋๋ค.
?
๋ฅผ ์ผ๋ง๋ ์์ฃผ ์ฌ์ฉํ๋์ง ์์๋ณด๊ธฐ ์ํด ์คํฌ๋ฆฝํธ ์ฝํผ์ค๋ฅผ ๋ถ์ ํ ๊ฒ์
๋๋ค.?
๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๊ฐ ๊ณ ๊ธ ์ฌ์ฉ์ ์ผ ์ ์๋ค๋ ๊ฐ์ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค (๋ค๋ฅธ ์ฌ๋์ด ํ์ธํ๊ณ ์ถ์ด ํจ). ๋ฐ์ํ ์์๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ). ๋ฐ๋ฉด์ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ ์ฝ๊ฐ ๋ ๋ณต์กํ ๊ตฌ๋ฌธ (์ ${foo}?.bar
)์ ์ดํดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฒฝํ์ด ๋ถ์กฑํ ์ฌ์ฉ์์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ ์ต์
3 ์ ์ ํธํฉ๋๋ค. (ํ์ง๋ง ๋ค์ ํ ๋ฒ ์ฒซ ๋ฒ์งธ ๊ธ ๋จธ๋ฆฌ ๊ธฐํธ์ ๋ฐ๋ผ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.)$foo
๋ฐ ${foo}
์ฌ์ฉ์ ํผํฉ ํ ๋ ๋ชจ๋ ๋ณ์ ์ฐธ์กฐ๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํด ์ข์ ์ง์ ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋์ด ๋ฌธ์ ๋ฅผ ๋๊ตฌ (์ : VS Code PowerShell ํ์ฅ)์์ ์์ ํ ์ ์์ผ๋ฉฐ Vim๊ณผ ๊ฐ์ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํฐ๊ฐ $ foo ๋ฐ $ {foo} ์ฌ์ฉ์ ํผํฉ ํ ๋ ๋ชจ๋ ๋ณ์ ์ฐธ์กฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
AST๊ฐ ์ค๊ดํธ๋ฅผ ๋ณด์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ณ์ ์ด๋ฆ์ ๊ตฌ๋ณํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. PowerShell AST๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋๊ตฌ๋ ์ฌ๊ธฐ์์ ์ค๊ดํธ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ๊ท์์ ๊ฒฝ์ฐ ํ์คํ ๋ ์๊ณ ์์ด์ผํฉ๋๋ค. varname
-> \{?varname\}?
@rjmholt ์ฌ๊ธฐ ์์ ๋ถ์ ?
๋๋๋ ๊ณ ์ ๋ณ์๋ ~ 70 ๊ฐ๋ฟ์ด์์ต๋๋ค.
๊ณ ๋ง์์, @mburszley- ์ ์๊ฒ Bucket 3 : ํฌ๋ฐํ ํ์ ์์ญ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ฉฐ {...}
๊ฐ ํ์ํ ์ฌ์ฉ์์๊ฒ ๋ถ๋ด์ ์ฃผ๋ ๊ฒ์ $(...)
์ฃผ๋ณ exit
$(...)
๋ํ ๋ถํํ ํ์์ฑ ๊ณผ ๋ณํ exit
&&
๋ฐ ||
์ปจํ
์คํธ์์ exit
/ return
/ throw
๋ฌธ .
๊ทธ ๋ฌธ์ ์์ ์ถ๋ก ์ ๋น๋ฆฌ๋ ค๋ฉด :
๋ณ์ ์ด๋ฆ ์ฃผ์์ {...}
์ฌ์ฉ์ ๊ฐ์ ํ๋ฉด ?.
์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๊ท ์ฌ์ฉ์๋ {...}
๋ํ ํ์์ฑ์ ๊ธฐ๋ํ์ง ์์ผ๋ฉฐ ๋ค์์ด ์คํจ ํ ๋ _it_์ด ํ์ํ๋ค๋ ๊ฒ์ ๋ฐ๋์ ์์ง ๋ชปํ ๊ฒ์
๋๋ค ( Set-StrictMode -Version 2
์ด์์ด ์ ์ฉ๋์ง ์๋ ํ _undetected_ ์ผ ์ ์์) : $o = [pscustomobject] @{ one = 1 }; $o?.one
์ฌ์ฉ์๊ฐ {...}
์ ํ์์ฑ์ ๋ํด _ ์๊ณ ๋ _ :
{...}
๋ฅผ ์
๋ ฅํ๊ธฐ ์ด๋ ต ๊ธฐ ๋๋ฌธ์ ์ง์์ ์ธ ์ข์ ์ ์์ฒ์ด ๋ ๊ฒ์
๋๋ค.์ด ๋ฌธ์ ๋ ํด๊ฒฐ ๋ ๊ฒ์ผ๋ก ํ์๋์์ผ๋ฉฐ 1 ์ผ ๋์ ํ๋์ด ์์์ต๋๋ค. ํ์ฐ์ค ํคํ ๋ชฉ์ ์ผ๋ก ํ์๋์์ต๋๋ค.
@rjmholt , https://github.com/PowerShell/PowerShell/issues/10967#issuecomment -561843650์์ ์ธ์ฉ :
๊ธฐ์กด์ ์ ํจํ ๊ตฌ๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ์์ ๊นจ์ง ์๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์์์ ์ผ์ ํ๋ก๊ทธ๋จ์ ์ง์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ์๋ง ๋ณํ๊ฐ์๋ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ์ ๋ฌธ๊ฐ๊ฐ ๋จ์ ์ ๋ฅ๊ฐํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝ์ฐ์ ์๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ต๋๋ค. ๊ทธ๋ค ๋ชจ๋์ ํจ๊ป ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ ๋นํํ๊ฑฐ๋ ์ ๋นํํ์ง ์์ต๋๋ค). ๋ฌธ์ ๋ ํ ํฌ ๋์ด์ ๋๋ ํ์์ ์ผ๋ถ ์ธก๋ฉด์ ๋ณ๊ฒฝํ๋ฉด ๋ ๊ฐ์ PowerShell ๋ฒ์ ์ด ๋ ์ด์ ์ผ๋ถ ์คํฌ๋ฆฝํธ์ ๋ํด ๋์ผํ AST๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก ๋ ๊ฐ์ PowerShell์ด โโ๋์ผํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฅด๊ฒ "๋ณผ"์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ๋ฌธ์ ์ฝ์ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฅํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฑํ ์์๋ PSScriptAnalyzer ๊ท์น์ด ์์ต๋๋ค. PSScriptAnalyzer๋ PowerShell ๋ฒ์ ๋ง๋ค ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋ณด๊ฒ๋ฉ๋๋ค.
C #๊ณผ ๋ฌ๋ฆฌ PowerShell์ ๋์ค์ ์คํํ๊ธฐ ์ํด ํธํ๋๋ ํ์์ผ๋ก ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋ฏธ๋ฆฌ ์ปดํ์ผ ํ ์ ์์ต๋๋ค. ์ฆ, ๊ตฌ๋ฌธ ๋ณ๊ฒฝ์ด ๋ฐํ์์ ์ฐ๊ฒฐ๋จ์ ์๋ฏธํฉ๋๋ค. PowerShell์ด โโ๊ตฌ๋ฌธ์ ์ค๋จํ๋ฉด ๋ค๋ฅธ ๋ฒ์ ์ ๋ํด ์๋ ํ ์์๋ ์คํฌ๋ฆฝํธ์ ์๋ฅผ ์ค์ ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ๋ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผํ๋ฏ๋ก ์ ธ๊ณผ ์คํฌ๋ฆฝํ ์ธ์ด์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ๋ฉ๋๋ค. PowerShell์ ํ๋์ ์คํฌ๋ฆฝํธ ๋ด์์ ๋ ผ๋ฆฌ์ ๋ชจ๋ ์ฐจ์ด์ ์ ๊ทน๋ณต ํ ์์์๋งํผ ๋์ ์ด์ด์ผํ์ง๋ง ๊ตฌ๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ํํ ํ ์์๋ ์ ์ ์ธ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ณผ ์ดํ๊ฐ ๋ชจ๋ ์ ํจํ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํนํ ์ํํฉ๋๋ค.์ด๋ฅผ ๊ฐ์งํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๊ณ ๊ฐ ์์ผ๋ฉฐ ๋ ํ๊ฒฝ์์ ์คํ ํ ํ์๋ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋์์ด ๋ฐ์ํ์์ ์์ง ๋ชปํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๋ณ๊ฒฝ์ ๋งค์ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฉฐ ์ ๋ฌธ๊ฐ๊ฐ ๋จ์ ์ ๋ฅ๊ฐํ๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฃจ์ด์ ธ์ผํ๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค. ์ค์ํ ์์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์ผ๋ง๋ ๋ง์ด ์ค๋จ๋๋์ง์ ๋๋ค.
๋ค๋ฅธ ๋ฒ์ ์ ๋ํด ์๋ ํ ์์๋ ์คํฌ๋ฆฝํธ์ ์๋ฅผ ์ค์ ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์ฌ๊ธฐ์๋ _new_ ๊ตฌ๋ฌธ ๊ธฐ๋ฅ ( ?.
)์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ผ๋ฏ๋ก์ด๋ฅผ ์ฌ์ฉํ๋ ์ ์ ์คํฌ๋ฆฝํธ๋ ๊ธฐ์กด ๋ฒ์ ๊ณผ ํธํ๋๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ์กฐ๊ฑด์ ํน๋ณํ ์ถ๊ฐํ์ง ์๋ ํ ์ด์ ๋ฒ์ ์์ ์คํํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ด ๊ฐ์น๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๊ฑฐ์ ๊ธฐ๋ฅ ๋ง ๊ณ ์ ํ ์ ์์ต๋๋ค.
์, $var?
๋ฅผ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ด์ ์คํฌ๋ฆฝํธ์์ $var?.foo
์ ํด์์ ๊นจ์ง ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
?
๋ {...}
_๋ก ๋ฌถ์ง ์๊ณ _ ์๋ณ์์ ์ผ๋ถ๋ก ํ์ฉ๋์ง ์์์ผํฉ๋๋ค.
๊ทธ๋ ๊ฒ ํ ์ ์๋ค๋ ๊ฒ์ ์์์น ๋ชปํ ์ผ์ด๊ณ ์๋ง๋ ๋ง์ ์ฌ๋๋ค์๊ฒ _ ์๋ ค์ง์ง ์์ _ ๊ฒ์ด๋ฏ๋ก, ๊ทธ๋ฌํ ๋ณ์ ์ด๋ฆ์ ๊ฐ์ธ์ ์ธ ๊ฒฝํ์ผ๋ก ๋งํ๋ฉด ์ผ์์์ ๋งค์ฐ ๋๋ฌผ์ง๋ง @mburszley ์ ๋ถ์์ ๋ ํ์คํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํฉ๋๋ค .
?
(๋ฐ !
) ๋ง ํ์ฉํ๊ณ _method_ ์๋ณ์ ๋ง ์์ต๋๋ค. ๋๋ถ๋ถ์ Ruby ์ฌ์ฉ์๋ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ง์ํ๋ค๊ณ ๊ฐ์ ํ์ง _ ์์์ผํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๊ฐ์ ๊ฒ.๊ทธ๋์ ์ค์ฉ์ ์ผ๋ก ๋งํ๋ฉด :
๋๋ถ๋ถ์ ๊ธฐ์กด ์ฝ๋๋ ์ํฅ์๋ฐ์ง ์์ต๋๋ค. $var?.foo
์ ๊ฐ์ ํ ํฐ์ ๋ฐ์ํ์ง ์์ต๋๋ค.
์๋ก์ด ์๋ฏธ ์ฒด๊ณ๋ก $var?.foo
๋ฅผ ์์ฑํ๋ฉด ์, ์ด์ ๋ฒ์ ์์ ์คํํ๋ฉด ์๊ฒฉ ๋ชจ๋๊ฐ ์ ์ฉ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค (๋ช
๋ฐฑํ ๋ฐฉ์์ผ๋ก ์ค๋จ๋์ง ์์).ํ์ง๋ง _ ํญ์ํด์ผํฉ๋๋ค. ์ด์จ๋ ์๋ ํ๋๋ก ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ต์ ๋ฒ์ ์ ์ ์ฉํฉ๋๋ค _ ( #requires -Version
, ๋ชจ๋ ๋งค๋ํ์คํธ ํค).
๋์ฒด๋ก ์ ์๊ฒ ์ด๊ฒ์ ๋ฒํท 3 ๋ณ๊ฒฝ์ ๋ถ๋ช ํ ๊ฒฝ์ฐ์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋งค์ฐ ์ ์ ๋ณ๊ฒฝ์ผ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑฐ์ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ์ค์ง์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค (๋๋ ๋ฐ๋๋ก ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ธํ ์ง์์ ์ธ ๋ํต ๋ฐฉ์ง).
@ mklement0 ์ฐ๋ฆฌ๋
@ SteveL-MSFT-# 11379๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฌ๊ธฐ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๋ค์ ๊ฑฐ๊ธฐ์์ ์ง์ (๋๋ ํ๋ก์ด๋ฉฐ, ๋น ์ง์)์ ๋ณด์ฌ ์ฃผ๊ธธ ๋ฐ๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@rjmholt ์ฌ๊ธฐ ์์ ๋ถ์
?
๋๋๋ ๊ณ ์ ๋ณ์๋ ~ 70 ๊ฐ๋ฟ์ด์์ต๋๋ค.