๐Ÿฆ… Swift

Basic Operators

Kiwi๐Ÿ’ป 2022. 5. 15. 23:58

์—ฐ์‚ฐ์ž(operator)๋Š” ๊ฐ’์„ ์ฒดํฌ,๋ณ€๊ฒฝ,๋˜๋Š” ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐํ˜ธ ๋˜๋Š” ๊ตฌ(ๅฅ)์ด๋‹ค.

์ˆ ์–ด (Terminology)

  • ๋‹จํ•ญ ์—ฐ์‚ฐ์ž: -a, !b
  • ์ดํ•ญ ์—ฐ์‚ฐ์ž: 2 + 3, 3 * 4
  • ์‚ผํ•ญ ์—ฐ์‚ฐ์ž: (a ? b : c) a๊ฐ€ ์ฐธ์ด๋ฉด b ์•„๋‹ˆ๋ฉด c

๋Œ€์ž… ์—ฐ์‚ฐ์ž (Assignment Operator)

(a = b) ๋Š” b ์˜ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

let b = 10  
var a = 5  
a = b  
// a is now equal to 10  

NOTEโ—๏ธ
if x = y ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Swift์—์„œ๋Š” ๋“ฑํ˜ธ ์—ฐ์‚ฐ์ž(==)๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•  ๊ณณ์— ์‹ค์ˆ˜๋กœ ํ• ๋‹น ์—ฐ์‚ฐ์ž(=)๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž (Arithmetic Operators)

Swift๋Š” ๋ชจ๋“  ์ˆซ์ž ํƒ€์ž…์— ๋Œ€ํ•ด 4๊ฐœ์˜ ๊ธฐ๋ณธ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž (arithmetic operators) ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ๋ง์…ˆ (+)
  • ๋บ„์…ˆ (-)
  • ๊ณฑ์…ˆ (*)
  • ๋‚˜๋ˆ—์…ˆ (/)

๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž (Remainder Operator)

(a % b)๋Š” a ์•ˆ์— ๋“ค์–ด๊ฐˆ b ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋ช‡์ธ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋‚จ์€ ๊ฐ’ (๋‚˜๋จธ์ง€)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ex) 9 % 4 ๋Š” ๋‚˜๋จธ์ง€ 1์„ ๋ฐ˜ํ™˜

๋‹จํ•ญ ๋นผ๊ธฐ ์—ฐ์‚ฐ์ž(Unary Minus Operator)

์ˆซ์ž ๊ฐ’์˜ ๋ถ€ํ˜ธ๋Š” - ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์„ ๋‹จํ•ญ ๋นผ๊ธฐ ์—ฐ์‚ฐ์ž (unary minus operator) ๋ผ๊ณ  ํ•œ๋‹ค.

let three = 3  
let minusThree = -three       // minusThree equals -3  
let plusThree = -minusThree   // plusThree equals 3, or "minus minus three"  

๋ณตํ•ฉ ๋Œ€์ž… ์—ฐ์‚ฐ์ž (Compound Assignment Operators)

var a = 1  
a += 2  
// a is now equal to 3  

ํ‘œํ˜„์‹ a += 2 ๋Š” a = a + 2 ์˜ ์งง์€ ํ‘œํ˜„์ด๋‹ค. ํšจ๊ณผ์ ์œผ๋กœ ๋ง์…ˆ๊ณผ ๋Œ€์ž…์€ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๊ณ  ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ž๋กœ ๊ฒฐํ•ฉ๋œ๋‹ค.

๋น„๊ต ์—ฐ์‚ฐ์ž (Comparison Operators)

  • ๊ฐ™์Œ (a == b)
  • ๋‹ค๋ฆ„ (a != b)
  • ๋ณด๋‹ค ํผ (a > b)
  • ๋ณด๋‹ค ์ž‘์Œ (a < b)
  • ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ (a >= b)
  • ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ (a <= b)

๊ฐ ๋น„๊ต ์—ฐ์‚ฐ์ž๋Š” Bool ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

1 == 1   // true because 1 is equal to 1  
2 != 1   // true because 2 is not equal to 1  
2 > 1    // true because 2 is greater than 1  
1 < 2    // true because 1 is less than 2  
1 >= 1   // true because 1 is greater than or equal to 1  
2 <= 1   // false because 2 is not less than or equal to 1  

๊ฐ™์€ ํƒ€์ž…๊ณผ ๊ฐ™์€ ๊ฐฏ์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” 2๊ฐœ์˜ ํŠœํ”Œ์€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ผ์ชฝ๋ถ€ํ„ฐ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋น„๊ต ํ•œ๋‹ค.

(1, "zebra") < (2, "apple")   // true because 1 is less than 2; "zebra" and "apple" are not compared  
(3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"  
(4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"  

๋ฒ”์œ„ ์—ฐ์‚ฐ์ž (Range Operators)

๋ฒ”์œ„๋ฅผ ์งง๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ซํžŒ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž (Closed Range Operator)

(a...b)๋Š” ๊ฐ’ a ์™€ b ๊ฐ€ ํฌํ•จ๋œ a ๋ถ€ํ„ฐ b ๊นŒ์ง€์˜ ๋ฒ”์œ„ ์‹คํ–‰์„ ์˜๋ฏธํ•œ๋‹ค. a ์˜ ๊ฐ’์€ b ๋ณด๋‹ค ํด ์ˆ˜ ์—†๋‹ค.

๋ฐ˜-์—ด๋ฆผ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž (Half-Open Range Operator)

(a..<b)๋Š” b ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ a ๋ถ€ํ„ฐ b ๊นŒ์ง€์˜ ๋ฒ”์œ„ ์‹คํ–‰์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ๊ฐ’์€ ํฌํ•จ๋˜์ง€ ์•Š์ง€๋งŒ ์ฒ˜์Œ ๊ฐ’์€ ํฌํ•จ๋˜๋ฏ€๋กœ ๋ฐ˜-์—ด๋ฆผ (half-open) ์ด๋ผ ํ•œ๋‹ค. ๋‹ซํžŒ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์ด a ์˜ ๊ฐ’์€ b ๋ณด๋‹ค ํด ์ˆ˜ ์—†๋‹ค.

๋‹จ-๋ฐฉํ–ฅ ๋ฒ”์œ„ (One-Sided Ranges)

๋‹ซํžŒ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž๋Š” ํ•œ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์†๋˜๋Š” ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋Œ€์ฒด ํ˜•์‹์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒ”์œ„์˜ ์ข…๋ฅ˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์˜ค์ง ํ•œ์ชฝ์˜ ๊ฐ’๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹จ-๋ฐฉํ–ฅ ๋ฒ”์œ„ (one-sided range) ๋ผ๊ณ  ํ•œ๋‹ค.

for name in names\[2...\] {  
    print(name)  
}  
// Brian  
// Jack  

for name in names\[...2\] {  
    print(name)  
}  
// Anna  
// Alex  
// Brian  

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž (Logical Operators)

  • ๋…ผ๋ฆฌ์  NOT (!a)
  • ๋…ผ๋ฆฌ์  AND (a && b)
  • ๋…ผ๋ฆฌ์  OR (a || b)

๋…ผ๋ฆฌ์  NOT ์—ฐ์‚ฐ์ž (Logical NOT Operator)

๋…ผ๋ฆฌ์  NOT ์—ฐ์‚ฐ์ž (logical NOT operator) (!a)๋Š” ๋ถ€์šธ ๊ฐ’์„ true ๋ฅผ false ๋กœ false ๋ฅผ true ์™€ ๊ฐ™์ด ๋ฐ˜๋Œ€๋กœ ๋งŒ๋“ ๋‹ค.

๋…ผ๋ฆฌ์  AND ์—ฐ์‚ฐ์ž (Logical AND Operator)

๋…ผ๋ฆฌ์  AND ์—ฐ์‚ฐ์ž (logical AND operator) (a && b)๋Š” ๋‘ ๊ฐ’์ด ๋ชจ๋‘ true ์—ฌ์•ผ true ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋…ผ๋ฆฌ์  ํ‘œํ˜„์‹์„ ๋งŒ๋“ ๋‹ค.

๋‘ ๊ฐ’์ค‘ ํ•˜๋‚˜๋ผ๋„ false ์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ๋ฒˆ์งธ ๊ฐ’์ด false ์ด๋ฉด true์˜ ๊ฐ’์„ ๋ณผ ํ•„์š”๋„ ์—†์ด ์–ป์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‘๋ฒˆ์งธ ๊ฐ’์€ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ฒฝ์šฐ๋ฅผ ์—ฐ์‚ฐ ์ƒ๋žต(short-circuit evaluation)์ด๋ผ ํ•œ๋‹ค.

๋…ผ๋ฆฌ์  OR ์—ฐ์‚ฐ์ž (Logical OR Operator)

๋…ผ๋ฆฌ์  OR ์—ฐ์‚ฐ์ž (logical OR operator) (a || b)๋Š” 2๊ฐœ์˜ ์ธ์ ‘ํ•œ ํŒŒ์ดํ”„ ๋ฌธ์ž๋กœ ๋งŒ๋“ค์–ด์ง„ ์‚ฝ์ž… ์—ฐ์‚ฐ์ž์ด๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ 2๊ฐœ์˜ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ผ๋„ true ์ด๋ฉด ํ‘œํ˜„์‹์ด true ๊ฐ€ ๋˜๋Š” ๋…ผ๋ฆฌ์  ํ‘œํ˜„์‹์„ ๋งŒ๋“ ๋‹ค.

์œ„์˜ AND ์—ฐ์‚ฐ์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋…ผ๋ฆฌ์  OR ์—ฐ์‚ฐ์ž๋Š” ์—ฐ์‚ฐ ์ƒ๋žต (short-circuit evaluation)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋…ผ๋ฆฌ์  OR ์—ฐ์‚ฐ์ž์˜ ์ขŒ๋ณ€์ด true ์ด๋ฉด ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฏ€๋กœ ์šฐ๋ณ€์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋…ผ๋ฆฌ์  ์—ฐ์‚ฐ์ž ๊ฒฐํ•ฉ (Combining Logical Operators)

๊ธด ๋ณตํ•ฉ ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ผ๋ฆฌ์  ์—ฐ์‚ฐ์ž๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {  
    print("Welcome!")  
} else {  
    print("ACCESS DENIED")  
}  
// Prints "Welcome!"  

NOTEโ—๏ธ
Swift ๋…ผ๋ฆฌ์  ์—ฐ์‚ฐ์ž && ์™€ || ์€ ์™ผ์ชฝ ์šฐ์„ ๊ฒฐํ•ฉ (left-associative) ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ผ๋ฆฌ์  ์—ฐ์‚ฐ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ณตํ•ฉ ํ‘œํ˜„์‹์€ ๊ฐ€์žฅ ์™ผ์ชฝ๋ถ€ํ„ฐ ํŒ๋‹จํ•œ๋‹ค.

๋ช…์‹œ์  ์†Œ๊ด„ํ˜ธ (Explicit Parentheses)

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {  
    print("Welcome!")  
} else {  
    print("ACCESS DENIED")  
}  
// Prints "Welcome!"  

์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์†Œ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋…์„ฑ ๋˜ํ•œ ์˜ฌ๋ผ๊ฐ„๋‹ค.