상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[ Swift 기초 문법 ] Property - μ €μž₯ 속성 / 계산 속성 / ν˜•μ‹ 속성

🍎 iOS/Swift

by AHN.Jihyeon 2024. 6. 24. 09:04

λ³Έλ¬Έ


 

 

πŸ”Ž  1 . μ €μž₯ 속성(Stored Property)


ν΄λž˜μŠ€μ™€ ꡬ쑰체에 μΆ”κ°€ν•  μˆ˜μžˆλ‹€.   

λ³€μˆ˜/μƒμˆ˜  μ €μž₯ 속성

//λ³€μˆ˜ μ €μž₯ 속성 μ„ μ–Έ 
var name: Type = DefaultValue

//μƒμˆ˜ μ €μž₯ 속성 μ„ μ–Έ
let name: Type = DefaultValue


class Person {
	let name: String = "swift"
    var age: Int = 20
}

let p = Person()
//μΈμŠ€ν„΄μŠ€λͺ….ν”„λ‘œνΌν‹°λͺ…
p.name
p.age

p.age = 30
p.name = "apple"  // μ—λŸ¬


//Struct Person이라면 
//p.age = 20 일 λ•Œ μ—λŸ¬ λ°œμƒ
//ꡬ쑰체 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμˆ˜μ— μ €μž₯ν•˜λ©΄ ꡬ쑰체 μžμ²΄λŠ” μƒμˆ˜κ°€ λœλ‹€. 
//이떄 ꡬ쑰체에 ν¬ν•¨λœ λͺ¨λ“  속성이 μƒμˆ˜κ°€ λœλ‹€.(값을 λ°”κΏ€ 수 μ—†κ²Œ λœλ‹€)

 

 

 

지연 μ €μž₯ 속성(Lazy Stroed Property)

μ €μž₯ 속성이 μ΄ˆκΈ°ν™” λ˜λŠ” μ‹œμ μ€ μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§€λŠ” μ‹œμ μ΄λ‹€. 

지연 μ €μž₯속성은 μ΄ˆκΈ°ν™”λ₯Ό μ§€μ—°μ‹œν‚€λŠ” 것이닀. 즉, 속성에 처음 μ ‘κ·Όν•˜λŠ” μ‹œμ μ— μ΄ˆκΈ°ν™” λœλ‹€. 

 

μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™” 되고 λ‚˜μ„œ κ°œλ³„μ μœΌλ‘œ μ΄ˆκΈ°ν™” λ˜λ―€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” lazy var 둜 μ„ μ–Έν•œλ‹€. 

μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™” ν•˜μ§€ μ•Šκ³  μ„ μ–Έν•  λ•Œ κΈ°λ³Έ 값을 μ €μž₯ν•΄μ•Ό ν•œλ‹€. 

struct Image {
    init() {
        print("μ‹€ν–‰ 둜그")
    }
}

struct BlogPost {
    let title: String = "Title"
    lazy var attachment: Image = Image()
}

var post = BlogPost() //μ—¬κΈ°κΉŒμ§€λŠ” μ‹€ν–‰λ‘œκ·Έκ°€ 좜λ ₯λ˜μ§€ μ•ŠμŒ
post.attachment       //속성에 μ ‘κ·Όν•˜λŠ” μ‹œμ μ— μƒμ„±μžκ°€ 호좜되고 print() μ‹€ν–‰

 

지연저μž₯μ†μ„±μ˜ ν΄λ‘œμ € μ‚¬μš©λ²• 곡뢀 ν›„ λ‚΄μš© μΆ”κ°€!!!!!!!!!!!!!!!!!!!!!!1

 

 

 

 

πŸ”Ž  2. 계산 속성(Computed Property)


클래슀, ꡬ쑰체뿐만 μ•„λ‹ˆλΌ μ—΄κ±°ν˜•μ—μ„œλ„ μ„ μ–Έν•  수 있고 μ‹€μ œ 값을 μ €μž₯ν•˜κ³  μžˆλŠ” 것이 μ•„λ‹ˆλΌ

getterλ‚˜ setterλ₯Ό 톡해 값을 νƒμƒ‰ν•˜κ³  κ°„μ ‘μ μœΌλ‘œ λ‹€λ₯Έ ν”„λ‘œνΌν‹° 값을 μ„€μ •ν•  수 μžˆλ‹€. 

 

μ €μž₯ 속성은 λ©”λͺ¨λ¦¬ 곡간을 가지고 μžˆμ§€λ§Œ κ³„μ‚°μ†μ„±μ—λŠ” λ©”λͺ¨λ¦¬ 곡간이 μ—†λ‹€. 

κ·Έλž˜μ„œ λ‹€λ₯Έ μ €μž₯ 속성을 μ½μ–΄μ„œ ν•„μš”ν•œ 계산을 μ‹€ν–‰ ν›„ λ‹€λ₯Έ 속성에 λ„˜κ²¨μ£ΌλŠ” 방식이닀. 

λ”°λΌμ„œ 항상 var둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

 

μ €μž₯속성은 ν΄λž˜μŠ€μ™€ ꡬ쑰체에 μΆ”κ°€ν•  수 μžˆλŠ”λ°, 계산속성은 ν΄λž˜μŠ€μ™€ ꡬ쑰체, μ—΄κ±°ν˜•μ—λ„ μΆ”κ°€ν•  수 μžˆλ‹€. 

var name: Type {
    get {              //get블둝은 속성값을 읽을 λ•Œ μ‹€ν–‰
        return         //λ°˜λ“œμ‹œ return ν‚€μ›Œλ“œλ‘œ λ‹€λ₯Έ 속성에 μžˆλŠ” 값을 리턴 or λ¦¬ν„΄νƒ€μž…κ³Ό λ™μΌν•œ 값을 리턴
    }
    set(νŒŒλΌλ―Έν„°λͺ…) {     //set블둝은 값을 μ €μž₯ν•  λ•Œ μ‹€ν–‰, 속성에 μ €μž₯된 값이 νŒŒλΌλ―Έν„°λͺ…μœΌλ‘œ 전달됨
    }
}

 

 

계산 속성 예제 

struct Point { 
    var x = 0.0, y = 0.0
}

struct Size {
    var width = 0.0, height = 0.0
}

//μ’Œν‘œμ™€ 크기λ₯Ό κ°–κ³  μžˆλŠ” μ‚¬κ°ν˜•μ„ ν‘œν˜„ν•˜λŠ” ꡬ쑰체
struct Rect {
    var origin = Point()
    var size = Size()
    
    //μ‚¬κ°ν˜•μ˜ 쀑점을 ν‘œν˜„ν•˜λŠ” center 계산속성 
    var center: Point {
    	//getter : λ‹€λ₯Έ μ €μž₯μ†μ„±μ˜ 값을 μ—°μ‚°ν•˜κ³  κ²°κ³Όκ°’ λ°˜ν™˜ μ—­ν•  
        get {                   //origin μΈμŠ€ν„΄μŠ€μ˜ μ €μž₯속성을 톡해 μ‚¬κ°ν˜• 쀑심 μ’Œν‘œ κ΅¬ν•˜κΈ°
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)       //μ‚¬κ°ν˜• 쀑심에 ν•΄λ‹Ήν•˜λŠ” μ’Œν‘œκ°’μ„ Point ꡬ쑰체λ₯Ό 톡해 λ°˜ν™˜
        }
        
        //setter : νŒŒλΌλ―Έν„°λ‘œ 받은 값을 λ‹€λ₯Έ μ €μž₯속성(origin property)에 μ €μž₯ -> μ‚¬κ°ν˜•μ˜ μœ„μΉ˜ 이동
        set(newCenter) { 
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}


var square = Rect(origin: Point(x: 0.0, y: 0.0),
                  size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)

print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// "square.origin is now at (10.0, 10.0)" 좜λ ₯

 

 

 

setter의 μΆ•μ•½

μƒˆλ‘œμš΄ 값을 λ°›μ•„ 올 λ•Œ, set λ©”μ„œλ“œ μ•ˆμ— νŒŒλΌλ―Έν„° 이름을 μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ newValueλ₯Ό μ‚¬μš©ν•΄ μƒˆλ‘œ μ„€μ •λœ 값을 뢈러 올 수 μžˆλ‹€.   

//μΆ•μ•½ μ „
set(newCenter) {     
    origin.x = newCenter.x - (size.width / 2)
    origin.y = newCenter.y - (size.height / 2)
}

//μΆ•μ•½ ν›„ 
set {
    origin.x = newValue.x - (size.width / 2)
    origin.y = newValue.y - (size.height / 2)
}

 

 

getter의 μΆ•μ•½

ν•œμ€„μ˜ expression으둜 μ„ μ–Έλ˜μ—ˆλ‹€λ©΄ return ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯

//μΆ•μ•½ μ „
get {
    let centerX = origin.x + (size.width / 2)
    let centerY = origin.y + (size.height / 2)
    return Point(x: centerX, y: centerY)
}

//μΆ•μ•½ ν›„
get {
    Point(x: origin.x + (size.width / 2)
          y: origin.y + (size.height / 2))
}

 

 

읽기 μ „μš© 계산 속성(Read Only)

값을 읽고 λ°˜ν™˜ν•˜μ§€λ§Œ λ‹€λ₯Έ 값을 지정할 수 μ—†λŠ” ν”„λ‘œνΌν‹°λ₯Ό μ˜λ―Έν•œλ‹€.

μ΄λ•Œ set이 ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ getκ³Ό { }λ₯Ό μ—†μ•  μΆ•μ•½ν•  수 μžˆλ‹€. μ΄λ•Œ, 읽기 μ „μš© 계산속성은 var둜만 μ„ μ–Έ κ°€λŠ₯ν•˜λ‹€. 

struct Cuboid { //ν΄λ‘œμ €λž‘ ν—·κ°ˆλ¦΄ 수 μžˆλŠ”λ°, μ΄λ•Œ ν• λ‹Ήμ—°μ‚°μž(=)κ°€ μžˆλŠ”μ§€ 확인(Cuboid = {} λŠ” ν΄λ‘œμ €)
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)

print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// "the volume of fourByFiveByTwo is 40.0" 좜λ ₯

 

 

 

 

 

πŸ”Ž  3. ν˜•μ‹ 속성(Type Property)


https://dkswlgus0314.tistory.com/76

 

  • 값에 λŒ€ν•œ μ €μž₯ μ—¬λΆ€λ₯Ό κΈ°μ€€μœΌλ‘œ μ €μž₯ 속성과 μ—°μ‚° μ†μ„±μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€. 
  • μΈμŠ€ν„΄μŠ€μ— μ†Œμ† μ—¬λΆ€λ₯Ό κΈ°μ€€μœΌλ‘œ μΈμŠ€ν„΄μŠ€ 속성과 ν˜•μ‹ μ†μ„±μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€.

 

μ €μž₯ ν˜•μ‹ 속성 

기본값을 μƒλž΅ν•  수 μ—†κ³  λ°˜λ“œμ‹œ κ°’ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 것이고 νƒ€μž… μžμ²΄λŠ” μ΄ˆκΈ°ν™”ν•˜μ§€ λͺ»ν•œλ‹€. λ”°λΌμ„œ ν˜•μ‹ 속성은 μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•  수 μ—†λ‹€. 

 

μ €μž₯속성은 μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ ν•¨κ»˜ μ΄ˆκΈ°ν™” λ˜μ§€λ§Œ, ν˜•μ‹μ†μ„±μ€ ν˜•μ‹μ— 졜초둜 μ ‘κ·Όν•  λ•Œ 값이 μ΄ˆκΈ°ν™”λœλ‹€.

속성에 μ ‘κ·Όν•  λ•Œλ„ μΈμŠ€ν„΄μŠ€ μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•˜μ§€ μ•Šκ³ , λ°˜λ“œμ‹œ νƒ€μž…μ˜ μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•΄μ•Όν•œλ‹€. 

 

클래슀 / ꡬ쑰체 / μ—΄κ±°ν˜•μ˜ 객체에 값을 μ €μž₯ν•œλ‹€. 

μ €μž₯된 값은 λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 

  • static : 클래슀 / ꡬ쑰체 / μ—΄κ±°ν˜• νƒ€μž…μ—μ„œ ν”„λ‘œνΌν‹° μ„ μ–Έ
  • class : 클래슀 νƒ€μž…μ—μ„œ μ„ μ–Έν•œ μ—°μ‚° ν”„λ‘œνΌν‹° 일뢀

 

ν˜•μ‹μ†μ„±μ€ 기본적으둜 지연 속성이닀. λ”°λΌμ„œ 속성에 처음 μ ‘κ·Όν•˜λŠ” μ‹œμ μ— μ΄ˆκΈ°ν™” λœλ‹€. 

class Math {
    static let pi = 3.14
}

let m = Math()   //아직 μ΄ˆκΈ°ν™” μ•ˆλ¨
m.pi   // 였λ₯˜
Math.pi          //μ΄λ•Œ μ΄ˆκΈ°ν™” 됨

 

 

 

 

계산 ν˜•μ‹ 속성

enum Weekday: Int {
    case Sunday = 1, monday, tuesday, wednesday, thursday, friday, saturday
    
    static var today: Weekday {
        let cal = Calendar.current
        let today = Date()
        let weekday = cal.component(.weekday, from: today)
        return Weekday(rawValue: weekday)!
    }
}

Weekday.today  //였늘이 μ›”μš”μΌμ΄λΌμ„œ monday 리턴

 

 

 

 

 

πŸ”— Reference 
https://velog.io/@niro/Swift-Property-Computed-Property-%EA%B3%84%EC%82%B0-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0
https://singularis7.tistory.com/56

 

κ΄€λ ¨κΈ€ 더보기