iOS/Swift

[문법/키워드] Computed Property / Extension

태애니 2025. 5. 21. 00:39
728x90

 

 

1. Computed Property (계산 속성)

속성처럼 보이지만, 내부적으로 계산해서 값을 반환함.

보통 다른 속성을 기반으로 동작

get, set 블럭 사용 가능.

저장공간을 갖지 않음 (값을 "가지고 있는" 게 아니라 "계산"함)

읽기 전용도 가능, 읽기/쓰기 모두 가능.

 

struct 안에 있는 값을 활용하여 어떤 계산식을 통해 값을 리턴시켜줌.

 

struct Circle {
    var radius: Double
    
    // 계산 속성 (읽기 전용)
    var area: Double {
        return .pi * radius * radius
    }
    
    // 계산 속성 (읽기 & 쓰기)
    var diameter: Double {
        get {
            return radius * 2
        }
        set {
            radius = newValue / 2
        }
    }
}

var c = Circle(radius: 5)
print(c.area)     // 78.54...
print(c.diameter) // 10.0

c.diameter = 20
print(c.radius)   // 10.0

 

예시

 

1. 날짜 데이터를 자유롭게 포맷하고 싶어.

Date() 값만 들어오면 자동으로 yyyy년 mm월 dd일로 바꾸고 싶어.

 

2. 숫자가 들어오면 어떤 공식이나 계산으로 값을 받고 싶어.

3. 값을 display 용으로 보여주고 싶어. (struct 값이 바뀌지는 않지만 보여줄 때만 바꾸고 싶을 때)

 

 

 

2. Method (메서드)

특정 기능이나 동작을 수행하는 함수

파라미터를 받아서 연산을 수행하는 데 주로 사용

mutating 키워드를 통해 값 변경 가능 (struct, enum에서만 필요)

 

struct, enum에서는 내부 값을 변경할 수 없으나, mutating 을 이용해 self 값 또는 내부 속성을 바꿀 수 있다.

 

struct BankAccount {
    var balance: Double

    mutating func deposit(_ amount: Double) {
        balance += amount
    }

    mutating func withdraw(_ amount: Double) {
        balance -= amount
    }
    
    func isRich(threshold: Double) -> Bool {
        return balance > threshold
    }
}

var account = BankAccount(balance: 1000)
account.deposit(500)
account.withdraw(200)
print(account.balance) // 1300
print(account.isRich(threshold: 1000)) // true

 

 

 

 

 

3. Extension

기존 타입(내가 만든 struct/class뿐 아니라 Swift 내장 타입들까지)에 기능을 추가.

원래 코드를 수정하지 않고도 기능 추가 가능

코드 분리 및 모듈화 가능

실무에서 정말 자주 씀 (UIKit 커스터마이징, 공통 기능 분리 등)

 

확장 가능한 요소

  • method (메서드)
  • computed property
  • initializer
  • subscript
  • protocol 준수
extension String {
    var isEmail: Bool {
        return self.contains("@") && self.contains(".")
    }

    func repeated(count: Int) -> String {
        return String(repeating: self, count: count)
    }
}

let email = "test@example.com"
print(email.isEmail) // true
print("hi ".repeated(count: 3)) // hi hi hi

 

 

 

 

 

728x90