λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] ν”„λ‘œνΌν‹°(Properties) - μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹°

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€ :)

μ§€λ‚œ κ²Œμ‹œκΈ€μ—μ„œ 지연 μ €μž₯ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄μ•˜λŠ”λ°μš”, μ‹œμž‘ν•œ 김에 ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œ μ­‰ 정리λ₯Ό 해보렀고 ν•©λ‹ˆλ‹€.

ν”„λ‘œνΌν‹°λŠ” 크게 μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹°, νƒ€μž… ν”„λ‘œνΌν‹° μ΄λ ‡κ²Œ μ„Έ κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλŠ”λ°μš”, 이번 κ²Œμ‹œκΈ€μ—μ„œλŠ” μ €μž₯ ν”„λ‘œνΌν‹°μ™€ μ—°μ‚° ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ •λ¦¬ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!

ν”„λ‘œνΌν‹° (Properties)

μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹°, νƒ€μž… ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ•Œμ•„λ³΄λ €λ©΄ λ¨Όμ € ν”„λ‘œνΌν‹°κ°€ 무엇인지뢀터 μ•Œμ•„μ•Όκ² μ£ ??

propertyλŠ” μž¬μ‚°, 속성 μ •λ„λ‘œ λ²ˆμ—­ν•  수 μžˆλŠ”λ°μš”, Swiftμ—μ„œμ˜ ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• 등에 κ΄€λ ¨λœ 값을 λœ»ν•©λ‹ˆλ‹€.

μ €μž₯ ν”„λ‘œνΌν‹° (Stored Properties)

μ €μž₯ ν”„λ‘œνΌν‹°λŠ” λ‹¨μˆœνžˆ 값을 μ €μž₯ν•˜κ³  μžˆλŠ” ν”„λ‘œνΌν‹° μž…λ‹ˆλ‹€.

클래슀 λ˜λŠ” ꡬ쑰체의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λœ 값을 μ €μž₯ν•˜λŠ” κ°€μž₯ λ‹¨μˆœν•œ κ°œλ…μ˜ ν”„λ‘œνΌν‹°λ‘œ, μΈμŠ€ν„΄μŠ€μ˜ μƒμˆ˜ λ˜λŠ” λ³€μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

let ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μƒμˆ˜ ν˜Ήμ€ var ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ λ³€μˆ˜λ‘œ μ„ μ–Έν•΄ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

struct Student {
    var studentID: Int
    var major: String
}

class Person {
    let name: String = "Jane"
    var age: Int = 20
    var nickname: String?
}

μ €μž₯ ν”„λ‘œνΌν‹°μ˜ μ„ μ–Έκ³Ό μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” 방법

ν΄λž˜μŠ€μ™€ κ΅¬μ‘°μ²΄μ—μ„œ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό μ§œλ³΄μ•˜λŠ”λ°μš”! μœ„μ˜ μ˜ˆμ‹œ μ½”λ“œλ₯Ό 보면, ꡬ쑰체와 ν΄λž˜μŠ€μ—μ„œ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•˜λŠ” 방법에 차이가 μžˆλ‹€λŠ” 것을 확인할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

 

κ΅¬μ‘°μ²΄λŠ” μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€. (νƒ€μž…μ΄ μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλ”λΌλ„)

ν•˜μ§€λ§Œ, 클래슀의 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„ νƒ€μž…μ΄ μ•„λ‹ˆλΌλ©΄ ν”„λ‘œνΌν‹° 기본값을 μ§€μ •ν•΄μ£Όκ±°λ‚˜ μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. κ°„λ‹¨ν•œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό 톡해 차이점을 μ‚΄νŽ΄λ΄…μ‹œλ‹€!

ꡬ쑰체의 μ €μž₯ ν”„λ‘œνΌν‹° μ„ μ–Έ 및 μΈμŠ€ν„΄μŠ€ 생성 

struct Student {
    var studentID: Int
    var major: String
}

// κ΅¬μ‘°μ²΄μ—λŠ” 기본적으둜 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μ‘΄μž¬ν•¨
let eunju: Student = Student(studentID: 2018111303, major: "디지털미디어학과")

 

struct Student {
    var studentID: Int = 2018111303
    var major: String = "디지털미디어학과"
}

// ν”„λ‘œνΌν‹°μ˜ μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν–ˆλ‹€λ©΄ μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ΄ˆκΈ°κ°’μ„ λ„˜κΈΈ ν•„μš”κ°€ μ—†μŒ
let eunju: Student = Student()
print(eunju) // Student(studentID: 2018111303, major: "디지털미디어학과")

// μƒˆλ‘œμš΄ μ΄ˆκΈ°κ°’ ν• λ‹Ήν•˜κ³  μ‹Άλ‹€λ©΄ μΈμŠ€ν„΄μŠ€ 생성 μ‹œ λ‹€λ₯Έ μ΄ˆκΈ°κ°’ ν• λ‹Ή κ°€λŠ₯
let jane: Student = Student(studentID: 2019111303, major: "컴퓨터곡학과")
print(jane) // Student(studentID: 2019111303, major: "컴퓨터곡학과")

클래슀의 μ €μž₯ ν”„λ‘œνΌν‹° μ„ μ–Έ 및 μΈμŠ€ν„΄μŠ€ 생성

class Person {
    let name: String
    var age: Int
    var nickname: String?
    
    // 클래슀의 경우 ν”„λ‘œνΌν‹° 기본값을 지정해주지 μ•ŠλŠ”λ‹€λ©΄ μ΄λ‹ˆμ…œλΌμ΄μ € λ”°λ‘œ μ •μ˜ν•΄μ£Όμ–΄μ•Ό 함
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ € ν˜ΈμΆœμ„ 톡해 ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’ ν• λ‹Ή
let eunju: Person = Person(name: "eunju", age: 20)

eunju.nickname = "jane"

 

class Person {
    let name: String = "eunju"
    var age: Int = 20
    var nickname: String?
}

// ν”„λ‘œνΌν‹° μ„ μ–Έ μ‹œ μ΄ˆκΈ°κ°’ μ§€μ •ν•΄μ£Όμ—ˆλ‹€λ©΄ μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ 됨
let eunju: Person = Person()

eunju.age = 25
eunju.nickname = "jane"

 

μ˜ˆμ‹œ μ½”λ“œλ₯Ό λ³΄λ‹ˆ ꡬ쑰체와 클래슀의 μ €μž₯ ν”„λ‘œνΌν‹° μ„ μ–Έ 및 μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ΄ˆκΈ°ν™” λ°©λ²•μ˜ 차이점이 λͺ…ν™•νžˆ 비ꡐ가 λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

차이점을 μš”μ•½ν•΄λ³΄μžλ©΄ λ‹€μŒκ³Ό 같이 정리할 수 μžˆμ„ 것 κ°™λ„€μš”!

ꡬ쑰체
- 기본적으둜 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œνΌν‹° μ„ μ–Έ μ‹œ μ΄ˆκΈ°κ°’ 지정이 ν•„μˆ˜κ°€ μ•„λ‹˜
- μ„ μ–Έ μ‹œ ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’ 지정도 λ‹Ήμ—°νžˆ κ°€λŠ₯

클래슀
- μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 μ΄ˆκΈ°ν™” or ν”„λ‘œνΌν‹° μ„ μ–Έ μ‹œ μ΄ˆκΈ°κ°’ 지정이 ν•„μˆ˜
- μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„ νƒ€μž…μ΄λΌλ©΄ μ΄ˆκΈ°κ°’ μ„€μ • ꡳ이 ν•„μš”μ—†μŒ

μ—°μ‚° ν”„λ‘œνΌν‹° (Computed Properties)

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ‹€μ œ 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλΌ, νŠΉμ • μƒνƒœμ— λ”°λ₯Έ 값을 μ—°μ‚°ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ, 

getter와 optionalν•œ setterλ₯Ό μ œκ³΅ν•΄ 값을 νƒμƒ‰ν•˜κ³  κ°„μ ‘μ μœΌλ‘œ λ‹€λ₯Έ ν”„λ‘œνΌν‹° 값을 μ„€μ •ν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

즉, μΈμŠ€ν„΄μŠ€ λ‚΄/μ™ΈλΆ€μ˜ 값을 μ—°μ‚°ν•˜μ—¬ μ μ ˆν•œ 값을 λŒλ €μ£ΌλŠ” μ ‘κ·Όμž(getter)의 역할을 ν•  μˆ˜λ„ 있으며 μ€λ‹‰ν™”λœ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹° 값을 κ°„μ ‘μ μœΌλ‘œ μ„€μ •ν•˜λŠ” μ„€μ •μž(setter)의 역할을 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, 그리고 μ—΄κ±°ν˜•μ—λ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ©”μ„œλ“œλ‘œ κ΅¬ν˜„ν•  수 μžˆλŠ”λ° μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό ꡳ이 μ™œ μ‚¬μš©ν• κΉŒ? λΌλŠ” 의문이 λ“€ 수 μžˆλŠ”λ°μš”!  μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œμ˜ μž₯점에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

μΈμŠ€ν„΄μŠ€ μ™ΈλΆ€μ—μ„œ λ©”μ„œλ“œλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 값에 μ ‘κ·Όν•˜λ €λ©΄ λ©”μ„œλ“œλ₯Ό 두 개(μ ‘κ·Όμž, μ„€μ •μž) κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ 이λ₯Ό κ°μˆ˜ν•˜κ³  λ©”μ„œλ“œλ‘œ κ΅¬ν˜„ν•œλ‹€ 해도 두 λ©”μ„œλ“œκ°€ λΆ„μ‚° κ΅¬ν˜„λ˜μ–΄ μ½”λ“œμ˜ 가독성이 λ–¨μ–΄μ§ˆ μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 훨씬 더 κ°„νŽΈν•˜κ³  직관적이기도 ν•©λ‹ˆλ‹€.

λ‹€λ§Œ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ ‘κ·ΌμžμΈ get λ©”μ„œλ“œλ§Œ κ΅¬ν˜„ν•˜μ—¬ 읽기 μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•˜κΈ° μ‰½μ§€λ§Œ, μ“°κΈ° μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•  μˆ˜λŠ” μ—†λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. (setter만 optional)

 

μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ–΄λ–»κ²Œ μ„ μ–Έν•˜κ³ , ν™œμš©ν•˜λŠ”μ§€ μ˜ˆμ‹œμ½”λ“œλ₯Ό 톡해 λ³΄κ² μŠ΅λ‹ˆλ‹€!

 

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 position: CoordinatePoint = CoordinatePoint(x: 10, y: 20)

// ν˜„μž¬ μ’Œν‘œ
print(position) // 10, 20

// μ ‘κ·Όμžλ₯Ό 톡해 λŒ€μΉ­μ’Œν‘œ get
print(position.oppositePoint) // -10, -20

// μ„€μ •μžλ₯Ό 톡해 λŒ€μΉ­ μ’Œν‘œλ₯Ό (15, 10)으둜 set
position.oppositePoint = CoordinatePoint(x: 15, y: 10)

// μƒˆλ‘œμš΄ ν˜„μž¬ μ’Œν‘œ
print(position) // -15, 10

 

ν•˜λ‚˜μ˜ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όμžμ™€ μ„€μ •μžκ°€ λͺ¨μ—¬μžˆκΈ° λ•Œλ¬Έμ— μ§κ΄€μ μœΌλ‘œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ˜ 역할을 νŒŒμ•…ν•  수 있고, ν”„λ‘œνΌν‹°μ˜ 값을 κ°€μ Έμ˜€κ±°λ‚˜ μƒˆλ‘œμš΄ 값을 μ„ΈνŒ…ν•˜λŠ” 것도 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 훨씬 κ°„λ‹¨ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

 

μœ„μ˜ μ½”λ“œλ₯Ό 보면 get λ©”μ„œλ“œ μ•ˆμ—μ„œ ν”„λ‘œνΌν‹°μ˜ νƒ€μž…κ³Ό 같은 νƒ€μž…μ˜ 결괏값을 returnν•˜κ³  μžˆλŠ” 것을 확인할 수 μžˆλŠ”λ°μš”, 이 κ²½μš°μ™€ 같이 μ ‘κ·Όμž λ‚΄λΆ€μ˜ μ½”λ“œκ°€ 단 ν•œ 쀄이고, κ·Έ κ²°κ΄κ°’μ˜ νƒ€μž…μ΄ ν”„λ‘œνΌν‹°μ˜ νƒ€μž…κ³Ό κ°™λ‹€λ©΄ return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μœ„μ˜ μ½”λ“œμ—μ„œ μ„€μ •μžμ˜ λ§€κ°œλ³€μˆ˜ 이름을 opposite으둜 λͺ…μ‹œν•˜μ—¬ set λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ ν•΄λ‹Ή μ΄λ¦„μœΌλ‘œ 인자λ₯Ό 전달받아 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μœ„μ™€ 같이 인자 이름을 μ§€μ •ν•˜μ§€ μ•Šμ„ 경우 인자 κΈ°λ³Έ 이름인 newValueλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μ μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μ“Έ 수 μžˆκ² λ„€μš”!

 

struct CoordinatePoint {
    var x: Int // μ €μž₯ ν”„λ‘œνΌν‹°
    var y: Int // μ €μž₯ ν”„λ‘œνΌν‹°
    
    // λŒ€μΉ­ μ’Œν‘œ
    var oppositePoint: CoordinatePoint {
        get { // μ ‘κ·Όμž
            CoordinatePoint(x: -x, y: -y)
        }
        
        set { // μ„€μ •μž
            x = -newValue.x
            y = -newValue.y
        }
    }
}

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

// ν˜„μž¬ μ’Œν‘œ
print(position) // 10, 20

// μ ‘κ·Όμžλ₯Ό 톡해 λŒ€μΉ­μ’Œν‘œ get
print(position.oppositePoint) // -10, -20

// μ„€μ •μžλ₯Ό 톡해 λŒ€μΉ­ μ’Œν‘œλ₯Ό (15, 10)으둜 set
position.oppositePoint = CoordinatePoint(x: 15, y: 10)

// μƒˆλ‘œμš΄ ν˜„μž¬ μ’Œν‘œ
print(position) // -15, 10

읽기 μ „μš© μ—°μ‚° ν”„λ‘œνΌν‹°

μœ„μ—μ„œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ“°κΈ° μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•  μˆ˜λŠ” μ—†μ§€λ§Œ 읽기 μ „μš© μƒνƒœλ‘œλŠ” κ΅¬ν˜„ν•  수 μžˆλ‹€κ³  μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€. 

ꡳ이 ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ˜ 값을 λ°”κΏ€ 일이 μ—†λ‹€λ©΄ 읽기 μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•΄μ£Όλ©΄ 되겠죠?? μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό 읽기 μ „μš©μœΌλ‘œ κ΅¬ν˜„ν•˜λ €λ©΄ get λ©”μ„œλ“œλ§Œ μ‚¬μš©ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€!

 

struct CoordinatePoint {
    var x: Int // μ €μž₯ ν”„λ‘œνΌν‹°
    var y: Int // μ €μž₯ ν”„λ‘œνΌν‹°
    
    // λŒ€μΉ­ μ’Œν‘œ
    var oppositePoint: CoordinatePoint {
        get { // μ ‘κ·Όμž
            CoordinatePoint(x: -x, y: -y)
        }
    }
}

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

// ν˜„μž¬ μ’Œν‘œ
print(position) // 10, 20

// μ ‘κ·Όμžλ₯Ό 톡해 λŒ€μΉ­μ’Œν‘œ get
print(position.oppositePoint) // -10, -20

// μ„€μ •μžλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 였λ₯˜ λ°œμƒ
position.oppositePoint = CoordinatePoint(x: 15, y: 10)

 


[참고 자료]

 

ν”„λ‘œνΌν‹° (Properties) - The Swift Language Guide (ν•œκ΅­μ–΄)

ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•κ³Ό κ΄€λ ¨ν•œ κ°’μž…λ‹ˆλ‹€. ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜μ—λŠ” μ €μž₯ ν”„λ‘œνΌν‹°(Stored Properties)와 κ³„μ‚°λœ ν”„λ‘œνΌν‹°(Computed Properties)κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ €μž₯ ν”„λ‘œνΌν‹°λŠ” 말 κ·ΈλŒ€λ‘œ 값을 μ €

jusung.gitbook.io

 

μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°: Swift 5 | μ•Όκ³° - ꡐ보문고

μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°: Swift 5 | 문법을 λ„˜μ–΄ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„λ„ μ΅νžˆλŠ” μŠ€μœ„ν”„νŠΈ 5μŠ€μœ„ν”„νŠΈ 5의 핡심 ν‚€μ›Œλ“œλŠ” ‘μ•ˆμ •ν™”’λ‹€. ABI μ•ˆμ •ν™” 덕뢄에 버전과 ν™˜κ²½μ— 크게 영ν–₯받지 μ•Šκ³  더 μœ μ—°ν•˜

product.kyobobook.co.kr