-
[Swift] ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์ (Custom Operator)Swift 2023. 5. 3. 00:37
์๋ ํ์ธ์!
์ด๋ฒ ์๊ฐ์๋ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ ๊ฒ์.
C, C++๋ Java ๋ฑ์๋ ์ฆ๊ฐ์ฐ์ฐ์๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๊ฒ ++, -- ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด Swift์๋ ์ฆ๊ฐ์ฐ์ฐ์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. Swift 3์์ deprecated ๋์๊ธฐ ๋๋ฌธ์ด์ฃ ๐ฅฒ
ํ์ง๋ง ๊ด์ฐฎ์ต๋๋ค! Swift์์๋ ์ ํฌ๊ฐ ์ง์ ์ฐ์ฐ์ ๊ธฐํธ๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ฅผ ๋ง๋ค ์ ์๊ฑฐ๋ ์ใ ใ
์ ๋ 5++๋ฅผ ํ๋ฉด 1์ด ์ฆ๊ฐ๋์ด 6์ด ๋๋๋ก ํ๋ ํ์ ์ฆ๊ฐ ์ฐ์ฐ์ (++) ์
ํ๋ผ๋ฏธํฐ๋ก 2๊ฐ์ ์ซ์๋ฅผ ์ ๋ฌ๋ฐ์์ ๋ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ๊ฐ ๊ณฑํ๊ณ , ๋๋ ๊ฐ์ ๋ํ๋ ์ญํ ์ ํ๋ ์ค์ ์ฐ์ฐ์ (*+/)๋ฅผ ๋ง๋ค์ด๋ณผ๊ฑฐ์์!
์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
๋จผ์ ์ฐ์ฐ์์ ์์น์ ์ฐ์ฐ์๋ก ์ฌ์ฉํ ํน์๋ฌธ์๋ฅผ ์ ์ํด์ฃผ๊ณ , ์ฐ์ฐ์๋ฅผ ๊ตฌํํด์ฃผ๋ฉด ๋์ ๋๋ค. ๊ฐ๋จํ์ฃ ?
์ด์ ์์ํด๋ณด๊ฒ ์ต๋๋ค!
1. ํ์ ์ฆ๊ฐ ์ฐ์ฐ์ ๋ง๋ค๊ธฐ (++)
๋จผ์ ์ฐ์ฐ์์ ์์น์ ์ฐ์ฐ์๋ก ์ฌ์ฉํ ํน์๋ฌธ์๋ฅผ ์ ์ํด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
์ ๋ ++๋ผ๋ ์ฐ์ฐ์๋ฅผ ํ์ ์ฐ์ฐ์๋ก ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ postfix ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์ ์ํด์ฃผ์์ต๋๋ค.
postfix operator ++์ฐธ๊ณ ๋ก ์ ์, ์ค์ ์ฐ์ฐ์๋ ์๋์ ๊ฐ์ด prefix, infix ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์ ์ํฉ๋๋ค.
prefix operator customOperator // ํผ์ฐ์ฐ์์ ์์ ์ค๋ ์ ์ ์ฐ์ฐ์ ์ ์ postfix operator customOperator // ํผ์ฐ์ฐ์์ ๋ค์ ์ค๋ ํ์ ์ฐ์ฐ์ ์ ์ infix operator customOperator // ํผ์ฐ์ฐ์ ์ฌ์ด์ ์ค๋ ์ค์ ์ฐ์ฐ์ ์ ์๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์๋ ๋ชจ๋ Scope์์ ์ธ์ํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ Global Scope์์ ์ ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
ํน์๋ฌธ์๋ฅผ ์ ์ํ ๋ ์ฃผ์ํ ์ ์ด ์์ต๋๋ค.
Swift์ ์์ฝ์ด๋ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋ค๋ฅธ ๋ฌธ์์ ์กฐํฉํด์ ์ฌ์ฉํด์ผํฉ๋๋ค.
Swift์ ์์ฝ์ด๋ ๋ค์์ ๊ฐ์ต๋๋ค.
(, ), {, }, [, ], ., ,, :, ;, =, @, #, <(prefix operator), &(prefix operator), ->, `, ?, >(postfix operator), !(postfix operator), /*, */, //
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ ์์คํค ๋ฌธ์ /, =, -, +, !, *, %, <, >, &, |, ^, ?, ~๋ฅผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฌธ์๋ค์ ๋ฐ๋์ ์ฒซ๋ฒ์งธ์ ์์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์นจํ (.)๋ก ์์ํ๋ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ ์ ์ํ ์ ์๋๋ฐ์, .+.๋ ๋จ์ผ ์ฐ์ฐ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
ํ์ง๋ง ๋ง์ฝ ์ฐ์ฐ์๊ฐ ๋ง์นจํ (.)์ผ๋ก ์์ํ์ง ์๋๋ค๋ฉด ์ฐ์ฐ์์ ๋ง์นจํ (.)๋ฅผ ํฌํจ์ํฌ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด +.+์ ๊ฒฝ์ฐ, + ์ฐ์ฐ์์ .+ ์ฐ์ฐ์ 2๊ฐ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ด์ ์ฐ์ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ฐจ๋ก์ ๋๋ค!
์ฐ์ฐ์ ๋ฉ์๋๋ func ํค์๋ ์์ prefix ๋๋ postfix ํค์๋๋ฅผ ๋ถ์ฌ์ ๊ตฌํํฉ๋๋ค.
infix ์ฐ์ฐ์๋ฅผ ๊ตฌํํ ๋์๋ ์ด๋ค ํค์๋๋ ์ฐ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ customOperator ๋ถ๋ถ์๋ ์์ ์ ์ํ ์ฐ์ฐ์๋ฅผ ์จ์ฃผ๋ฉด ๋ฉ๋๋ค.
// prefix operator prefix func customOperator(parameters) -> ReturnType { // code } // postfix operator postfix func customOperator(parameters) -> ReturnType { // code } // infix operator func customOperator(parameters) -> ReturnType { // code }++ ์ฐ์ฐ์๋ ๊ฐ์ 1 ์ฆ๊ฐ์์ผ์ผํ๊ธฐ ๋๋ฌธ์ ์ ๋ฌ๋ฐ์ ์ธ์์ 1 ๋ํ ๊ฐ์ ๋ฆฌํดํด์ฃผ๋๋ก ํ ๊ฒ์.
postfix func ++ (num: Int) -> Int { return num + 1 }๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณผ๊น์?

์ ์์ ์ผ๋ก 4๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ง๋ฌธ!
์ค์ number์ ๊ฐ๋ ์ฆ๊ฐ๋์์๊น์?
์ ๋ต์ ์๋๋๋ค.

number์ ๊ฐ์ ๋ณํจ์์ด ๊ทธ๋๋ก 3์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฐ์ฐ์ ๋ฉ์๋์์ number์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ , ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ์ 1 ์ฆ๊ฐ์ํจ ํ ๋ฆฌํดํ๊ณ ์๊ธฐ ๋๋ฌธ์ด์์.
์ค์ number์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฉํด์ num์ 1 ์ฆ๊ฐ์ํค๋๋ก ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.

2. ์ค์ ์ฐ์ฐ์ (*+/) ๋ง๋ค๊ธฐ
์ด๋ฒ์๋ infix ํค์๋๋ฅผ ์ด์ฉํด์ ์ค์ ์ฐ์ฐ์ (*+/)๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ ๊ฒ์!
์ซ์ 10๊ณผ 5๋ฅผ ์ ๋ฌ๋ฐ์์ ๊ฒฝ์ฐ, ๋ ์ซ์๋ฅผ ๊ณฑํ๊ณ (10 * 5 = 50) ๋๋ ๊ฐ (10 / 5 = 2)์ ๋ํ ๊ฒฐ๊ณผ (50 + 2 = 52)๋ฅผ ์ป์ ์ ์๋๋ก ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ infix ํค์๋๋ฅผ ์ด์ฉํด์ ์ฐ์ฐ์๋ฅผ ์ ์ํด์ฃผ์ธ์.
infix operator *+/๊ทธ๋ฆฌ๊ณ ์ ์ํ ์ฐ์ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ฃผ์ธ์!
func *+/ (left: Int, right: Int) -> Int { return (left * right) + (left / right) }๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณผ๊น์?

์ ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค์!
์ด๋ฒ์๋ ์ ๊ฐ ์ ์ํ ์ฐ์ฐ์ *+/์ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ํจ๊ป ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค์.
Adajacent operators are in unordered precedence groups 'DefaultPrecedence' and 'AdditionPrecedence' ๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ธ์ ํ ์ฐ์ฐ์๋ค์ ์ฐ์ฐ ์์๊ฐ ์ง์ ๋์ง ์์๋ค๋ ๋ฉ์์ง์ธ๋ฐ์, ์์ ์ง์ ์ ์ํ ์ฐ์ฐ์์ ์ฐ์ ์์ ๊ทธ๋ฃน์ ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์ ์ฐ์ฐ์๋ ์ ์ ์ฐ์ฐ์์ ํ์ ์ฐ์ฐ์์ ๋ค๋ฅด๊ฒ ์ฐ์ ์์ ๊ทธ๋ฃน (Precedence Group)์ ๋ช ์ํ ์ ์์ต๋๋ค.
์ฐ์ ์์ ๊ทธ๋ฃน์ ๋ค๋ฅธ infix ์ฐ์ฐ์๋ค์ ๊ธฐ์ค์ผ๋ก ์ฐ์ฐ์์ ์ฐ์ ์์์ ์ฐ์ฐ์์ ์ฐ๊ด์ฑ์ ์ง์ ํ๊ณ , ๋์ ์ฐ์ ์์ ๊ทธ๋ฃน์ ์ํ ์ฐ์ฐ์๊ฐ ๋จผ์ ์คํ๋ฉ๋๋ค.
์ฐ์ ์์ ๊ทธ๋ฃน์ ์ฌ๊ธฐ์ ํ์ธํ ์ ์๊ณ , ๋ํ์ ์ธ ์ฐ์ ์์ ๊ทธ๋ฃน์ ์๋์ ๊ฐ์ต๋๋ค.
Operators Precedence Groups + - AdditionPrecedence * / MultiplicationPrecedence < <= > >= == != ComparisonPrecedence = += -= *= /= AssignmentPrecedence ์ฐ์ ์์ ๊ทธ๋ฃน์ ์ง์ ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ฐ์ ์์ ๊ทธ๋ฃน ์ด๋ฆ์ UpperCamelCase๋ก ์ง๊ณ , higherThan, lowerThan ์ค ํ๋๋ ๋ฐ๋์ ๋ช ์ํด์ฃผ์ด์ผํฉ๋๋ค.
higherThan์๋ ํ์ฌ ๊ทธ๋ฃน๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ทธ๋ฃน์, lowerThan์๋ ํ์ฌ ๊ทธ๋ฃน๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๊ทธ๋ฃน์ ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
associativity์๋ ์ฐ์ฐ์์ ๊ฒฐํฉ ๋ฐฉํฅ์ ์ง์ ํ๋๋ฐ, left, right, none ์ค ํ๋๋ฅผ ์ฐ๋ฉด ๋๊ณ ๊ธฐ๋ณธ ๊ฐ์ none ์ ๋๋ค.
๊ฒฐํฉ ๋ฐฉํฅ์ด left๋ผ๋ฉด, 1 + 2 + 3 + 4์ ์์์ (((1 + 2) + 3) + 4)์ฒ๋ผ ์ผ์ชฝ๋ถํฐ ์ฐ์ฐ์ด ๋๊ณ ,
๊ฒฐํฉ ๋ฐฉํฅ์ด right๋ผ๋ฉด, 1 + 2 + 3 + 4์ ์์์ (1 + (2 + (3 + 4)))์ฒ๋ผ ์ค๋ฅธ์ชฝ๋ถํฐ ์ฐ์ฐ์ด ๋ฉ๋๋ค.
precedencegroup MyPrecedence { higherThan: LowerGroupName // ํ์ฌ ๊ทธ๋ฃน๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ทธ๋ฃน ์ง์ lowerThan: HigherGroupName // ํ์ฌ ๊ทธ๋ฃน๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๊ทธ๋ฃน ์ง์ associativity: associativity // ์ฐ์ฐ์์ ๊ฒฐํฉ ๊ท์น ์ง์ }์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ฅผ ๋ง๋ค ๋ ์ฐ์ ์์ ๊ทธ๋ฃน์ ์ง์ ์ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด ์ฐ์ ์์ ๊ทธ๋ฃน์ด ๊ธฐ๋ณธ ๊ทธ๋ฃน์ธ DefaultPrecedence์ ์ถ๊ฐ๋ฉ๋๋ค.
DefaultPrecedence์ ์ํ ์ฐ์ฐ์๋ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ๋๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ค๋ฅธ ์ฐ์ฐ์์ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ง๊ธ ์ ๊ฐ ์ ์ํ *+/ ์ฐ์ฐ์๋ DefaultPrecedence์ ์ํด์๋๋ฐ์, ๊ณฑํ๊ธฐ ์ฐ์ฐ์์ ๋์ผํ ์ฐ์ ์์ ๊ทธ๋ฃน์ ์ง์ ํ๊ณ ๋ค๋ฅธ ์ฐ์ฐ์์ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ ์์ ๊ทธ๋ฃน์ ์ฐ์ฐ์ ์์ :์ ๋ถ์ฌ์ ์ ์ธํฉ๋๋ค.
infix operator *+/: MultiplePrecedence
์ฐ์ ์์ ๊ทธ๋ฃน์ ์ง์ ํ๋ ์ ์์ ์ผ๋ก ์คํ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ผ *+/ ์ฐ์ฐ์์ ์ฐ์ ์์ ๊ทธ๋ฃน์ AdditionPrecedence๋ก ์ง์ ํ๊ณ 2๋ฅผ ๊ณฑํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ ๊น์?
num2์ 2๋ฅผ ๋จผ์ ๊ณฑํ๊ณ (5 * 2 = 10), num1 (10)๊ณผ num2์ 2๋ฅผ ๊ณฑํ ๊ฒฐ๊ณผ (10)๋ฅผ *+/ ์ฐ์ฐ์๋ก ์คํํฉ๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ณผ๋ 10 * 10 + 10 / 10 = 101์ด ๋ฉ๋๋ค.

์ฌ๊ธฐ๊น์ง ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์์ ๋ํด์ ์์๋ณด์์ต๋๋ค!
์ค๋๋ ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค๐
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Wrapping existing asynchronous code in async/await in Swift (0) 2023.08.17 [Swift] Any and AnyObject (0) 2023.05.08 [Swift] [SceneConfiguration] Info.plist contained no UIScene configuration dictionary (looking for configuration named "(no name)") ์ด์ ํด๊ฒฐ (0) 2023.04.04 [๊ธฐํ] ์ ๊ท ํํ์ (Regex) (0) 2022.03.31 [Swift] Key Value Observing (KVO) (0) 2022.03.24