Powershell: ์ œ์•ˆ : null ํ†ตํ•ฉ, null ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค (null-soaking), null ์กฐ๊ฑด๋ถ€ ํ• ๋‹น ๊ตฌํ˜„

์— ๋งŒ๋“  2017๋…„ 03์›” 02์ผ  ยท  71์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PowerShell/PowerShell

๋„ ํ†ตํ•ฉ ๋ฐ ๋„ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค (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 ์„ค์ •์—์„œ ์•”์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ธฐ์กด ๋™์ž‘์„ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค .


๊ด€๋ จ : ์‚ผํ•ญ ์กฐ๊ฑด๋ฌธ ๊ตฌํ˜„

Issue-Enhancement Resolution-Fixed WG-Language

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@rjmholt ์—ฌ๊ธฐ ์—์„œ ๋ถ„์„ ? ๋๋‚˜๋Š” ๊ณ ์œ  ๋ณ€์ˆ˜๋Š” ~ 70 ๊ฐœ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  71 ๋Œ“๊ธ€

@ 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_).

    • _personal_ ๋ฉ”๋ชจ์—์„œ : ์ €๋Š” _variable_ ์ด๋ฆ„์˜ ์˜คํƒ€๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Set-StrictMode -Version 1 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์ฃผ๋กœ # 2798๋กœ ์ธํ•ด -Version 2 ์ด์ƒ์ด ๋„ˆ๋ฌด ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ).
  • (a) ์†์„ฑ ์ด๋ฆ„์˜ ์ฒ ์ž๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋Š”์ง€ ๋ฐ / ๋˜๋Š” (b) ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์—์„œ ์‹ค์ˆ˜๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ๋ฒ„์ „ 2 ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. .

    • ์‹ค์ œ๋กœ, _ ํ˜„์žฌ _๋Š” ์ด๋Ÿฌํ•œ ์ˆ˜ํ‘œ๋ฅผ _ ์š”์ฒญ์‹œ _ _ ์„ ํƒ ํ•ด์ œ _ํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ ๋กญ์Šต๋‹ˆ๋‹ค.
    • ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—ฌ๊ธฐ์—์„œ null ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ฃผ๋ฌธํ˜• ์˜ตํŠธ ์•„์›ƒ์„ _ ์‰ฝ๊ฒŒ _ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฉค๋ฒ„์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ ์šฉ๋˜๋Š” ์—„๊ฒฉ ๋ชจ๋“œ์— ๊ด€๊ณ„์—†์ด ํ•„์ˆ˜์  ์ผ ์ˆ˜์žˆ๋Š” ๋ณ„๋„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

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 ๊ด€๋ จ :

    • ์•ก์„ธ์Šค์ค‘์ธ ๊ฐ’์ด _non- $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์„ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค.

  • _Null-value_- ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค - $obj _itself_๋Š” $null .

๊ตฌ์„ฑ | -์˜คํ”„ | -๋ฒ„์ „ 1 | -๋ฒ„์ „ 2 | -๋ฒ„์ „ 3+
---------- | ---- | ---------- | ---------- | ------------
$ obj | ๐Ÿ‘ | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ
$ obj.Prop | ๐Ÿ‘ | ๐Ÿ‘ | ๐Ÿšซ | ๐Ÿšซ
$ obj [42] | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ
$ obj.Method () | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ

-Off ๋ฐ -Version 1 , $obj.Prop ๋Š” ํ—ˆ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด $obj[42] ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • _Member-existence_-conditional access- $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 ๋กœ ์“ธ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๋œ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ณ€ํ™”๋Š” ์•„๋งˆ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

$ Safe์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฌธ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  $ IsSafe๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๋œ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‚˜๋Š” ๋ฐ˜๋Œ€์˜ ๊ฐ์ •์„ ํ‘œํ˜„ํ–ˆ๋‹ค. ๊ณ ์ „์ ์ธ Scheme / Ruby ์ „ํ†ต์ž…๋‹ˆ๋‹ค.

if ($questionMark?)
{
    Write-Host "That's silly!"
}

์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ? ๋๋‚˜๋Š” ๋ณ€์ˆ˜์™€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์ž ์ฃผ์œ„์— ๊ณต๋ฐฑ์ด๋‚˜ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ฃผ์œ„์— ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๊นŒ?

์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋„์ž…๋˜๋ฉด 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- ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ $? $$ ๋ฐ $^ ๋Š” ํŠน๋ณ„ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/8b9f4124cea30cfcd52693cb21bcd8100d39a796/src/System.Management.Automation/engine/parser/tokenizer.cs#L3001 -L3004

์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํฐ ๋ณ€ํ™”-๋ณ€์ˆ˜ ์ด๋ฆ„์— ? ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ?. ๋ฅผ ์—ฐ์‚ฐ์ž๋กœ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ? ๋๋‚˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ${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 ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฒซ ๋ฒˆ์งธ ๊ธ€ ๋จธ๋ฆฌ ๊ธฐํ˜ธ์— ๋”ฐ๋ผ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.)
  • @ daxian-dbw๋Š” ์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ $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 ์˜ ๋ถ„์„์€ ๋” ํ™•์‹คํ•œ ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค .

    • Ruby์กฐ์ฐจ๋„ _end_ ์‹๋ณ„์ž์—์„œ ? (๋ฐ ! ) ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  _method_ ์‹๋ณ„์ž ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ Ruby ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์ง€์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ _ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์€ ๊ฒƒ.

๊ทธ๋ž˜์„œ ์‹ค์šฉ์ ์œผ๋กœ ๋งํ•˜๋ฉด :

  • ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด ์ฝ”๋“œ๋Š” ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. $var?.foo ์™€ ๊ฐ™์€ ํ† ํฐ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์˜๋ฏธ ์ฒด๊ณ„๋กœ $var?.foo ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์˜ˆ, ์ด์ „ ๋ฒ„์ „์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์—„๊ฒฉ ๋ชจ๋“œ๊ฐ€ ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ช…๋ฐฑํ•œ ๋ฐฉ์‹์œผ๋กœ ์ค‘๋‹จ๋˜์ง€ ์•Š์Œ).ํ•˜์ง€๋งŒ _ ํ•ญ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์˜๋„ ํ•œ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋ฒ„์ „์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค _ ( #requires -Version , ๋ชจ๋“ˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ‚ค).

๋Œ€์ฒด๋กœ ์ €์—๊ฒŒ ์ด๊ฒƒ์€ ๋ฒ„ํ‚ท 3 ๋ณ€๊ฒฝ์˜ ๋ถ„๋ช…ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ๋งค์šฐ ์ ์€ ๋ณ€๊ฒฝ์œผ๋กœ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์‹ค์งˆ์ ์ธ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ๋ฐ˜๋Œ€๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์œผ๋กœ ์ธํ•œ ์ง€์†์ ์ธ ๋‘ํ†ต ๋ฐฉ์ง€).

@ mklement0 ์šฐ๋ฆฌ๋Š”

@ SteveL-MSFT-# 11379๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์‹œ ๊ฑฐ๊ธฐ์—์„œ ์ง€์› (๋˜๋Š” ํ—๋–ก์ด๋ฉฐ, ๋น„ ์ง€์›)์„ ๋ณด์—ฌ ์ฃผ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰