Skip to content

Latest commit

ย 

History

History
524 lines (361 loc) ยท 25.1 KB

Property.md

File metadata and controls

524 lines (361 loc) ยท 25.1 KB

ํ”„๋กœํผํ‹ฐ(Property)์™€ ๋ฉ”์„œ๋“œ(Method)

1. ํ”„๋กœํผํ‹ฐ (Property)

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ(Property)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ๊ธ€๋กœ '์†์„ฑ'์ด๋ผ๋Š” ๋œป์œผ๋กœ, ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋‚ด์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ํ”„๋กœํผํ‹ฐ์˜ ์—ญํ•  ์ค‘ ์ผ๋ถ€์— ๋ถˆ๊ณผํ•˜๊ณ , ํ”„๋กœํผํ‹ฐ๊ฐ€ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์—์„œ ํ•˜๋Š” ์ •ํ™•ํ•œ ์—ญํ• ์€ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ”„๋กœํผํ‹ฐ(Property)๋Š” ๊ฐ’์— ๋Œ€ํ•œ ์ €์žฅ ์—ฌ๋ถ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์ €์žฅ ํ”„๋กœํผํ‹ฐ

  • ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ €์žฅ๋œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• 
  • ์ƒ์ˆ˜ ๋ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‚˜, ์—ด๊ฑฐํ˜•์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ

  • ํŠน์ • ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ฐ’์„ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•˜๋Š” ์—ญํ• 
  • ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ๋Œ€์ฒด๋กœ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค์— ์†Œ์†๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ธ์Šคํ„ด์Šค์— ์†Œ์†๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ์™ธ์ ์œผ๋กœ ์ผ๋ถ€ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด ์ž์ฒด์— ์†Œ์†๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฐ ํ”„๋กœํผํ‹ฐ๋“ค์„ **ํƒ€์ž… ํ”„๋กœํผํ‹ฐ(Type Property)**๋ผ๊ณ  ํ•œ๋‹ค. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ์œ„์น˜๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ํด๋ž˜์Šค ์ •์˜ ๊ตฌ๋ฌธ ๋‚ด๋ถ€์— ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ์ž‘์„ฑ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ๋„ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ๋ณ€์ˆ˜์— ๋ถˆ๊ณผํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์—, ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์†Œ๋“œ์˜ ์™ธ๋ถ€์— ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋”๋ถˆ์–ด ์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด **ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„(Property Observer)**๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํŠน์ • ์•ก์…˜๊ณผ ๋ฐ˜์‘ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์‹œํ•˜๊ณ , ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.


1.1 ์ €์žฅ ํ”„๋กœํผํ‹ฐ (Stored Property)

**์ €์žฅ ํ”„๋กœํผํ‹ฐ(Stored Property)**๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ด€๋œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฐœ๋…์˜ ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ, letํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์ˆ˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.

์ผ๋ฐ˜ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ• ๋•Œ์—๋„ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์„ ์–ธํ•˜๋Š” ์‹œ์ ์—์„œ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์„ค์ •ํ•ด๋„ ๋œ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„์™€์ด์ฆˆ ๊ตฌ๋ฌธ์ด ์ด๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ํ•จ๊ป˜ ํ•จ๊ป˜ ํ• ๋‹นํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์‹ ๊ฒฝ์จ์•ผ ํ•  ๊ฒƒ๋“ค์ด ์žˆ์–ด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ ์„ ์–ธ์‹œ ์ดˆ๊ธฐ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ์Šค์œ„ํ”„ํŠธ์—์„œ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฌด์กฐ๊ฑด nil๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ์—๋Š” ์ผ๋ฐ˜ ์˜ต์…”๋„ ํƒ€์ž…๊ณผ ๋ฌต์‹œ์  ์˜ต์…”๋„ ํ•ด์ œ ํƒ€์ž… ์ค‘์—์„œ ์„ ํƒํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌต์‹œ์  ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•ด๋‘๋ฉด ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜ต์…”๋„ ํ•ด์ œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š” ์—†์ด ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜๋Š” ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์„ ์–ธ๊ณผ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ์ด๋‹ค.

// ์ขŒํ‘œ
struct CoordinatePoint {
    var x: Int      // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var y: Int      // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
}

// ๊ตฌ์กฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์žˆ๋‹ค.
let averyPoint: CoordinatePoint = CoordinatePoint(x: 20, y: 10)


// ์‚ฌ๋žŒ์˜ ์œ„์น˜์ •๋ณด
class Position {
    var point: CoordinatePoint  // ์ €์žฅ ํ”„๋กœํผํ‹ฐ (๋ณ€์ˆ˜) โ€“ ์œ„์น˜(point)๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ.
    let name: String            // ์ €์žฅ ํ”„๋กœํผํ‹ฐ (์ƒ์ˆ˜)
    
    // ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    init(name: String, currentPoint: CoordinatePoint) {
        self.name = name
        self.point = currentPoint
    }
}

// ์‚ฌ์šฉ์ž์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
// ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœํผํ‹ฐ ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
let averyPosition: Position = Position(name: "avery", currentPoint: averyPoint)

์œ„์—์„œ ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ์— ๋งž๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ ํด๋ž˜์Šค๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ๋”ฐ๋กœ ์ง€์ •ํ•ด์•ผ ๋‚˜์ค‘์— ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

// ์ขŒํ‘œ
struct CoordinatePoint {
    var x: Int = 0      // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var y: Int = 0      // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
}

// ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ–ˆ๋‹ค๋ฉด ๊ตณ์ด ์ „๋‹ฌ์ธ์ž๋กœ ์ดˆ๊นƒ๊ฐ’์„ ๋„˜๊ธธ ํ•„์š”๊ฐ€ ์—†๋‹ค.
let averyPoint: CoordinatePoint = CoordinatePoint()
// ๋ฌผ๋ก  ๊ธฐ์กด์— ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
let oliviaPoint: CoordinatePoint = CoordinatePoint(x: 30, y: 15)

print("avery's point : \(averyPoint.x), \(averyPoint.y)")       // avery's point : 0, 0
print("olivia's point : \(oliviaPoint.x), \(oliviaPoint.y)") // wizplan's point : 30, 15


// ์‚ฌ๋žŒ์˜ ์œ„์น˜์ •๋ณด
class Position {
    var point: CoordinatePoint = CoordinatePoint()  // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var name: String = "Unknown"                    // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
}

// ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์คฌ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
let averyPosition: Position = Position()

averyPosition.point = averyPoint
averyPosition.name = "avery"

๋‹ค์Œ์€ ์˜ต์…”๋„๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ผํ•ฉํ•œ ์˜ˆ์ œ์ด๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ, ๋‚ด๊ฐ€ ์ฒ˜์Œ ์˜๋„ํ•œ ๋Œ€๋กœ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ขŒํ‘œ
struct CoordinatePoint {
    // ์œ„์น˜๋Š” x, y ๊ฐ’์„ ๋ชจ๋‘ ๊ฐ€์ ธ์•ผ ํ•˜๋ฏ€๋กœ ์˜ต์…”๋„์ด๋ฉด ์•ˆ๋œ๋‹ค.
    var x: Int
    var y: Int
}

// ์‚ฌ๋žŒ์˜ ์œ„์น˜์ •๋ณด
class Position {
    var point: CoordinatePoint?     // ํ˜„์žฌ ์‚ฌ๋žŒ์˜ ์œ„์น˜๋ฅผ ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค -> ์˜ต์…”๋„
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

// ์ด๋ฆ„์€ ํ•„์ˆ˜์ง€๋งŒ ์œ„์น˜๋Š” ๋ชจ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
let averyPosition: Position = Position(name: "avery")

// ์œ„์น˜๋ฅผ ์•Œ๊ฒŒ๋˜๋ฉด ๊ทธ ๋•Œ ์œ„์น˜ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.
averyPosition.point = CoordinatePoint(x: 20, y: 10)

1.1.1 ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ (Lazy Stored Property)

์ผ๋ฐ˜์ ์œผ๋กœ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”๋˜์ง€๋งŒ, ์ €์žฅ ํ”„๋กœํผํ‹ฐ ์ •์˜ ์•ž์— Lazy๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋œ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์—ฐ์‹œํ‚จ๋‹ค.

ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋”๋ผ๋„ Lazy ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ํ”„๋กœํผํ‹ฐ๋Š” ์„ ์–ธ๋งŒ ๋  ๋ฟ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„์— ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์ƒ์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์™„์ „ํžˆ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•  ๋•Œ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€๋Š” ๋งž์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ์ฃผ๋กœ ๋ณต์žกํ•œ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

struct CoordinatePoint {
    var x: Int = 0
    var y: Int = 0
}

class Position {
    lazy var point: CoordinatePoint = CoordinatePoint()
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

let averyPosition: Position = Position(name: "avery")

// ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด point ํ”„๋กœํผํ‹ฐ๋กœ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ point ํ”„๋กœํผํ‹ฐ์˜ CoordinatePoint๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
print(averyPosition.point)  // x: 0, y: 0

1.2 ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ (Compute Property)

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐCompute Property)๋Š” ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ํŠน์ • ์ƒํƒœ์— ๋”ฐ๋ฅธ ๊ฐ’์„ ์—ฐ์‚ฐํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ํ•„์š”ํ•œ ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์—์„œ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š๊ณ  ๋Œ€์‹  ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค.

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

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์—ด๊ฑฐํ˜• ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ์ž์™€ ์„ค์ •์ž๊ฐ€ ๋ชจ๋‘ ๋ชจ์—ฌ์žˆ๊ณ , ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š” ์ง€ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

struct CoordinatePoint {
    var x: Int  // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var y: Int  // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    
    // ๋Œ€์นญ ์ขŒํ‘œ
    var oppositePoint: CoordinatePoint {    // ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ
        // ์ ‘๊ทผ์ž
        get {
            return CoordinatePoint(x: -x, y: -y)
        }
        
        // ์„ค์ •์ž
        set(opposite) {
            x = -opposite.x
            y = -opposite.y
        }
    }
}

var averyPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)

// ํ˜„์žฌ ์ขŒํ‘œ
print(averyPosition)    // 10, 20

// ๋Œ€์นญ ์ขŒํ‘œ
print(averyPosition.oppositePoint)  // -10, -20

// ๋Œ€์นญ ์ขŒํ‘œ๋ฅผ (15, 10)์œผ๋กœ ์„ค์ •ํ•˜๋ฉด
averyPosition.oppositePoint = CoordinatePoint(x: 15, y: 10)

// ํ˜„์žฌ ์ขŒํ‘œ๋Š” -15, -10๊ฐ€ ๋œ๋‹ค.
print(averyPosition)    // -15, -10

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์‚ฌ์‹ค ๋ฉ”์„œ๋“œ ํ˜•์‹์œผ๋กœ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์„œ๋“œ ์„ค๋ช…์€ ๋ฐ‘์— ์žˆ์Œ

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

๊ทธ๋Ÿฌ๋‚˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ ‘๊ทผ์ž์ธ get ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•ด๋‘” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์“ฐ๊ธฐ ์ „์šฉ ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฉ”์„œ๋“œ๋กœ๋Š” ์„ค์ •์ž ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•˜์—ฌ ์“ฐ๊ธฐ ์ „์šฉ ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.


1.3 ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„ (Property Observer)

ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ณ„์† ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋‹ค ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ๊ณ  ํ˜ธ์ถœ๋˜๋Š” ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค. ์ด๋ฅผ **ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„ (Property Observer)**๋ผ ํ•œ๋‹ค.

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

์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ตฌ๋ฌธ์ด ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์— set๊ตฌ๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„์—๋Š” ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • willSet : ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ์˜ต์ €๋ฒ„
  • didSet : ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„์— ํ˜ธ์ถœ๋˜๋Š” ์˜ต์ €๋ฒ„

willSet์—์„œ๋Š” ์ƒˆ ๊ฐ’์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ newValue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. didSet์—์„œ๋Š” ๋ฐ”๋€Œ๊ธฐ ์ „์˜ ๊ฐ’์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ oldValue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ์ด๋‹ค.

  class Account {
    var credit: Int = 0 {
        willSet {
            print("์ž”์•ก์ด \(credit)์›์—์„œ \(newValue)์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.")
        }
        
        didSet {
            print("์ž”์•ก์ด \(oldValue)์›์—์„œ \(credit)์›์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        }
    }
}

let myAccount: Account = Account()
// ์ž”์•ก์ด 0์›์—์„œ 1000์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
myAccount.credit = 1000
// ์ž”์•ก์ด 0์›์—์„œ 1000์›์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1.4 ํƒ€์ž… ํ”„๋กœํผํ‹ฐ (Type Property)

์•ž์—์„œ ๋ณธ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋‚˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ(Instance Property)์ด๋‹ค.

์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ดˆ๊นƒ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋˜๊ณ , ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ์ง€๋‹ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค์— ๊ด€๋ จ๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด, ๋˜๋Š” ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ์ž์ฒด์— ๊ด€๋ จ๋œ ๊ฐ’์„ ๋‹ค๋ฃจ์–ด์•ผ ํ•  ๋•Œ๋„ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด ์ž์ฒด์— ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉฐ ํƒ€์ž… ์ž์ฒด์— ์†ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ **ํƒ€์ž… ํ”„๋กœํผํ‹ฐ(Type Property)**๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์•„๋ž˜๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์™€ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

class AClass {
    
    // ์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
    static var typeProperty: Int = 0
    
    // ์ €์žฅ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ
    var instanceProperty: Int = 0 {
        didSet {
            AClass.typeProperty = instanceProperty + 100
        }
    }
    
    // ์—ฐ์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
    static var typeComputedProperty: Int {
        get {
            return typeProperty
        }
        
        set {
            typeProperty = newValue
        }
    }
}

AClass.typeProperty = 123

let classInstance: AClass = AClass()
classInstance.instanceProperty = 100

print(AClass.typeProperty)  // 200
print(AClass.typeComputedProperty)  // 200

ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ํŠน์ • ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด, ๊ทธ๋ฆฌ๊ณ  ์—ด๊ฑฐํ˜•์—์„œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋“ค์ด ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์„ ์ •์˜ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๋Š” ์š”๋ น์€ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ ๋ชจ๋‘ ๊ฐ™๋‹ค. ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ์ •์˜ ๋ธ”๋ก ๋‚ด์—์„œ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ ์•ž์— static ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค์— ๊ด€๊ณ„์—†์ด ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์— ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค ํƒ€์ž…์—์„œ ์„ ์–ธ๋œ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ ์ผ๋ถ€์—๋Š” classํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฐ์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€์ˆ˜๋กœ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

class Account {
    
    static let dollarExchangeRate: Double = 1000.0  // ํƒ€์ž… ์ƒ์ˆ˜
    
    var credit: Int = 0         // ์ €์žฅ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ
    
    var dollarValue: Double {   // ์—ฐ์‚ฐ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ
        get {
            return Double(credit) / Self.dollarExchangeRate
            // Self.dollarExchangeRate๋Š” Account.dollarExchangeRate์™€ ๊ฐ™์€ ํ‘œํ˜„์ด๋‹ค.
        }
        
        set {
            // Self.dollarExchangeRate๋Š” Account.dollarExchangeRate์™€ ๊ฐ™์€ ํ‘œํ˜„์ด๋‹ค.
            credit = Int(newValue * Self.dollarExchangeRate)
            print("์ž”์•ก์„ \(newValue)๋‹ฌ๋Ÿฌ๋กœ ๋ณ€๊ฒฝ ์ค‘์ž…๋‹ˆ๋‹ค.")
        }
    }
}

2. ๋ฉ”์„œ๋“œ (Method)

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

ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์€ ๊ตฌํ˜„ ๋ชฉ์ ์ด ๊ฐ€์ง€๋Š” ๋…๋ฆฝ์„ฑ๊ณผ ์—ฐ๊ด€์„ฑ์— ์žˆ๋‹ค. ํ•จ์ˆ˜๋Š” ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๋‚ด์— ์ •์˜๋œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค๊ณผ ์„œ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ํ•จ์ˆ˜์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ๋Š” ํฌ๊ฒŒ **์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ(Instance Method)**์™€ **ํƒ€์ž… ๋ฉ”์„œ๋“œ (Type Method)**๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ, ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ, ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋‹ค.


2.1 ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ (Instance Method)

**์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ (Instance Method)**๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ํƒ€์ž…์ด ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์ธ์Šคํ„ด์Šค์— ์†Œ์†๋œ ํ•จ์ˆ˜์ด๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ ๋ชฉ์ ์— ๋”ฐ๋ฅธ ํ•จ์ˆ˜์  ๊ด€๊ณ„์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์  ์ธก๋ฉด์„ ์ œ๊ณตํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด ํƒ€์ž… ๋‚ด๋ถ€์— ์„ ์–ธ๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์„ ์–ธํ•˜๋Š” ํ˜•์‹์ด ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ, ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ๋งค์„œ๋“œ๊ฐ€ ์†ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ์ด๋‹ค.

class LevelClass {
    // ํ˜„์žฌ ๋ ˆ๋ฒจ์„ ์ €์žฅํ•˜๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var level: Int = 0 {
        // ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„
        didSet {
            print("Level \(level)")
        }
    }

    // ๋ ˆ๋ฒจ์ด ์˜ฌ๋ž์„ ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func levelUp() {
        print("Level Up!")
        level += 1
    }

    // ๋ ˆ๋ฒจ์ด ๊ฐ์†Œํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func levelDown() {
        print("Level Down")
        level -= 1
        if level < 0 {
            reset()
        }
    }

    // ํŠน์ • ๋ ˆ๋ฒจ๋กœ ์ด๋™ํ•  ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func jumpLevel(to: Int) {
        print("Jump to \(to)")
        level = to
    }
    
    // ๋ ˆ๋ฒจ์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func reset() {
        print("Reset!")
        level = 0
    }
}

var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp()         // Level Up!
levelClassInstance.levelDown()       // Level Down
levelClassInstance.levelDown()       // Level Down
// Level -1
// Reset!
// Level 0
levelClassInstance.jumpLevel(to: 3)  // Jump to 3
// Level 3

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์„ ์–ธ ํ˜•์‹์ด ๊ฐ™์ง€๋งŒ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ํ•ญ๋ชฉ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  1. ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์†Œ์†๋œ๋‹ค๋Š” ์ 
  2. ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๋ฒ”์œ„์—์„œ ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋„ ๋ชจ๋‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 
  3. self ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 

self ํ”„๋กœํผํ‹ฐ๋ž€?

self.ํ”„๋กœํผํ‹ฐ

๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋œ self ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ž๋ฐ”์˜ this์™€ ๋น„์Šทํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค. self ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋” ๋ช…ํ™•ํžˆ ์ง€์นญํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ํ”„๋กœํผํ‹ฐ์— ๋ฐ˜๋“œ์‹œ self ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋”๋ผ๋„, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ๋ณ€์ˆ˜๊ฐ€ ํ”„๋กœํผํ‹ฐ์˜ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋Œ€๋ถ€๋ถ„ ์ž˜ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ด ๋•Œ๋ฌธ์— self ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์€๋ฐ, ๋ฐ˜๋“œ์‹œ self ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ํ”„๋กœํผํ‹ฐ์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ์ด๋‹ค.

ํ”„๋กœํผํ‹ฐ์™€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ์ถฉ๋Œํ•  ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœํผํ‹ฐ ์•ž์— ๋ฐ˜๋“œ์‹œ self ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์˜ˆ์‹œ ์ฝ”๋“œ ์ฒ˜๋Ÿผ level ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์Šค์œ„ํ”„ํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ทธ ๋‹ค์Œ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ์•„ level์ด ๋ฌด์—‡์„ ์ง€์นญํ•˜๋Š”์ง€ ์œ ์ถ”ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด level์ธ๋ฐ, ์ด level ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์˜ level์„ ์ง€์นญํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋•Œ self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์˜ˆ์‹œ ์ฝ”๋“œ์˜ jumpLevel(to:) ๋ฉ”์„œ๋“œ๋ฅผ ์กฐ๊ธˆ ๋ณ€๊ฒฝํ•ด์„œ ์•Œ์•„๋ณด์ž.

class LevelClass {
    var level: Int = 0

    func jumpLevel(to level: Int) {
        print("Jump to \(level)")
        self.level = level // ์—ฌ๊ธฐ ์ฃผ๋ชฉ
    }
}

level = level์ด๋ผ๊ณ  ์ ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ขŒ์ธก์˜ level์€ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์ธ level์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜์–ด์˜จ level์„ ์ง€์นญํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿด ๋•Œ ์ขŒ์ธก์— level ๋Œ€์‹  self.level์ด๋ผ๊ณ  ์ ์–ด์ฃผ๋ฉด ์ขŒ์ธก์˜ level์ด ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋ผ๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€๋กœ, self ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’ ํƒ€์ž… ์ธ์Šคํ„ด์Šค ์ž์ฒด์˜ ๊ฐ’์„ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ self ํ”„๋กœํผํ‹ฐ์— ๋‹ค๋ฅธ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ๊ตฌ์กฐ์ฒด๋‚˜ ์—ด๊ฑฐํ˜• ๋“ฑ์˜ self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹  ์ž์ฒด๋ฅผ ์น˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ ์ƒ๋žต


2.2 ํƒ€์ž… ๋ฉ”์„œ๋“œ (Type Method)

ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ์˜ฎ๊ธด ๊ฒŒ ํƒ€์ž… ๋ฉ”์„œ๋“œ(Type Method)์ด๋‹ค. ์ฆ‰, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด ํƒ€์ž…(ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด) ์ž์ฒด์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ **ํƒ€์ž… ๋ฉ”์„œ๋“œ (Type Method)**๋ผ๊ณ  ํ•œ๋‹ค.

ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ํƒ€์ž…์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ ์„ ์–ธ ์•ž์— static ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋˜ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ๊ฐ€๋Šฅํ•œ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ๋•Œ์—๋Š” class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ ์–ธ๋œ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์  ๊ตฌ๋ฌธ์„ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ self ํ”„๋กœํผํ‹ฐ๊ฐ€ ํƒ€์ž… ๊ทธ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ๋Š” self๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด ํƒ€์ž… ๋ฉ”์„œ๋“œ์˜ self๋Š” ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ทธ๋ž˜์„œ ํƒ€์ž… ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ํƒ€์ž… ์ด๋ฆ„๊ณผ self๊ฐ€ ๊ฐ™์€ ๋œป์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ณ , ํƒ€์ž… ๋ฉ”์„œ๋“œ์—์„œ self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ํ”„๋กœํผํ‹ฐ ๋ฐ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž

// ์‹œ์Šคํ…œ ์Œ๋Ÿ‰์€ ํ•œ ๊ธฐ๊ธฐ์—์„œ ์œ ์ผํ•œ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
struct SystemVolume {
    // ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ์ œ๋‚˜ ์œ ์ผํ•œ ๊ฐ’์ด ๋œ๋‹ค.
    static var volume: Int = 5

    // ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    static func mute() {
        self.volume = 0
        // SystemVolume.volume = 0 ๊ทธ๋ฆฌ๊ณ  Self.volume = 0๊ณผ ๊ฐ™์€ ํ‘œํ˜„์ด๋‹ค.
    }
}

// ๋‚ด๋น„๊ฒŒ์ด์…˜ ์—ญํ• ์€ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
class Navigation {
    // ๋„ค๋น„๊ฒŒ์ด์…˜ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ์Œ๋Ÿ‰์„ ๋”ฐ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    var volume: Int = 556
    
    // ๊ธธ ์•ˆ๋‚ด ์Œ์„ฑ ์žฌ์ƒ
    func guideWay() {
        // ๋‚ด๋น„๊ฒŒ์ด์…˜ ์™ธ ๋‹ค๋ฅธ ์žฌ์ƒ์› ์Œ์†Œ๊ฑฐ
        SystemVolume.mute()
    }

    // ๊ธธ ์•ˆ๋‚ด ์Œ์„ฑ ์ข…๋ฃŒ
    func finishGuideWay () {
        // ๊ธฐ์กด ์žฌ์ƒ์› ์Œ๋Ÿ‰ ๋ณต๊ตฌ
        SystemVolume.volume = self.volume
    }
}

SystemVolume.volume = 10

let myNavi: Navigation = Navigation()

myNavi.guideWay()
print(SystemVolume.volume)  // 0

myNavi.finishGuideWay()
print(SystemVolume.volume)  // 5


์ฐธ๊ณ  ์ž๋ฃŒ

๋„์„œ : ๊ผผ๊ผผํ•œ ์žฌ์€ ์”จ์˜ Swift ๋ฌธ๋ฒ•ํŽธ

ํ”„๋กœํผํ‹ฐ (Properties)

๋งค์†Œ๋“œ (Methods)

ํ”„๋กœํผํ‹ฐ โ€“ Property