λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍏 Today I Learned/Swift 문법

[Swift] ν™•μž₯ (Extension)

by Joseph Seong 2023. 12. 13.

 

 

ν™•μž₯

 

ν™•μž₯(Extension)

  • ν™•μž₯을 μ΄μš©ν•˜μ—¬ structure, class, enum, protocol νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ‹€.
  • κΈ°μ‘΄ νƒ€μž…μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” μˆ˜ν‰ ν™•μž₯ν•˜λŠ” κ°œλ…μ΄λ‹€.
  • ν™•μž₯은 νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, 기쑴에 μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯을 μž¬μ •μ˜ν•  μˆ˜λŠ” μ—†λ‹€.
  • μ™ΈλΆ€μ—μ„œ κ°€μ Έμ˜¨ νƒ€μž…μ— λ‚΄κ°€ μ›ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³ μž ν•  λ•Œ ν™•μž₯을 μ‚¬μš©ν•  수 μžˆλ‹€.
extension ν™•μž₯ν•  νƒ€μž… 이름 {
	 //νƒ€μž…μ— 좔가될 μƒˆλ‘œμš΄ κΈ°λŠ₯ κ΅¬ν˜„
}

extension ν™•μž₯ν•  νƒ€μž… 이름: ν”„λ‘œν† μ½œ1, ν”„λ‘œν† μ½œ2, ν”„λ‘œν† μ½œ3 {
	//ν”„λ‘œν† μ½œ μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„
}

 

 

ν™•μž₯(Extension)이 κ°€λŠ₯ν•œ κ²½μš°μ™€ λΆˆκ°€λŠ₯ν•œ 경우

 

Extension으둜 κ΅¬ν˜„ κ°€λŠ₯ν•œ 것듀:

  1. μƒˆλ‘œμš΄ κ³„μ‚°λœ 속성(Computed Property) μΆ”κ°€
  2. μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€/νƒ€μž… λ©”μ„œλ“œ μΆ”κ°€
  3. μƒˆλ‘œμš΄ μ΄ˆκΈ°ν™”(Initializer) μΆ”κ°€
  4. ν”„λ‘œν† μ½œ 채택(Protocol Conformance)
  5. μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μΆ”κ°€(Subscripting)
  6. 쀑첩 νƒ€μž…(Nested Type) μΆ”κ°€
// 1. μƒˆλ‘œμš΄ κ³„μ‚°λœ 속성(Computed Property) μΆ”κ°€
// String νƒ€μž…μ— ν™•μž₯ν•˜μ—¬ λ¬Έμžμ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•˜λŠ” 속성 μΆ”κ°€
extension String {
    var length: Int {
        return self.count
    }
}

let str = "Hello"
print(str.length) // 좜λ ₯: 5   (μœ„μ— selfλŠ” str이 λœλ‹€.)

// 2. μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€/νƒ€μž… λ©”μ„œλ“œ μΆ”κ°€
// Int νƒ€μž…μ— ν™•μž₯ν•˜μ—¬ 제곱 값을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ μΆ”κ°€
extension Int {
    func squared() -> Int {
        return self * self
    }
}

let number = 3
print(number.squared()) // 좜λ ₯: 9

// 3. μƒˆλ‘œμš΄ μ΄ˆκΈ°ν™”(Initializer) μΆ”κ°€
// Double νƒ€μž…μ— ν™•μž₯ν•˜μ—¬ νŠΉμ • 숫자둜 μ΄ˆκΈ°ν™”ν•˜λŠ” μ΄ˆκΈ°ν™” λ©”μ„œλ“œ μΆ”κ°€
extension Double {
    init(fromString str: String) {
        self = Double(str) ?? 0.0 // selfμžμ²΄μ— double둜 ν˜•λ³€ν™˜μ„ ν•˜κ³  μ‹€νŒ¨ν–ˆμ„ λ•ŒλŠ” 0.0이 λ“€μ–΄κ°€κ²Œ λ§Œλ“¦.
    }
}

let value = Double(fromString: "3.14")
print(value) // 좜λ ₯: 3.14


// 4. ν”„λ‘œν† μ½œ 채택(Protocol Conformance)
protocol Printable {
    func printDescription()
}

struct MyStruct {}

// Extension을 μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ νƒ€μž…μ— ν”„λ‘œν† μ½œ 채택
extension MyStruct: Printable {
    func printDescription() {
        print("Printing description of MyStruct")
    }
}

let myInstance = MyStruct()
myInstance.printDescription() // 좜λ ₯: Printing description of MyStruct


// 5. μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μΆ”κ°€(Subscripting)
struct Matrix {
    private var data: [[Int]]	// 이쀑 λ°°μ—΄
    
    init(rows: Int, columns: Int) {
        data = Array(repeating: Array(repeating: 0, count: columns), count: rows)
    }
}

extension Matrix {
		// Extension을 μ‚¬μš©ν•˜μ—¬ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μΆ”κ°€
    subscript(row: Int, column: Int) -> Int {	// row, column을 νŒŒλΌλ―Έν„°λ‘œ λ°›κ³  Intλ₯Ό λ¦¬ν„΄ν•΄μ€Œ.
        get {
            return data[row][column]	// data에 μ ‘κ·Όν•΄μ„œ λ°›μ•„μ˜΄.
        }
        set {
            data[row][column] = newValue
        }
    }
}
    


var matrix = Matrix(rows: 3, columns: 3)
matrix[0, 0] = 1
matrix[1, 1] = 2

print(matrix[0, 0]) // 좜λ ₯: 1
print(matrix[1, 1]) // 좜λ ₯: 2

// 6. 쀑첩 νƒ€μž…(Nested Type) μΆ”κ°€
struct Container {
    // κΈ°μ‘΄ νƒ€μž… λ‚΄μ—μ„œ μ€‘μ²©λœ νƒ€μž…
    struct NestedType {
        var value: Int
    }
}

// Extension을 μ‚¬μš©ν•˜μ—¬ 쀑첩 νƒ€μž… μΆ”κ°€
extension Container {
    struct AnotherNestedType {
        var name: String
    }
}

let nested = Container.NestedType(value: 5)
print(nested.value) // 좜λ ₯: 5

let anotherNested = Container.AnotherNestedType(name: "NestedType")
print(anotherNested.name) // 좜λ ₯: NestedType

 

Extension으둜 κ΅¬ν˜„ λΆˆκ°€λŠ₯ν•œ 것듀:

  1. μ €μž₯ ν”„λ‘œνΌν‹°(Stored Property) μΆ”κ°€: ExtensionμœΌλ‘œλŠ” μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 였직 κ³„μ‚°λœ ν”„λ‘œνΌν‹°λ§Œ μΆ”κ°€ν•  수 μžˆλ‹€.
  2. κΈ°μ‘΄ κΈ°λŠ₯의 μž¬μ •μ˜(Override): 이미 μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯을 Extensionμ—μ„œ μž¬μ •μ˜(Override)ν•  수 μ—†λ‹€. 상속과 μž¬μ •μ˜λŠ” ν΄λž˜μŠ€μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€.
  3. μ΄ˆκΈ°ν™” λ©”μ„œλ“œ(Initializer)의 μž¬μ •μ˜: ExtensionμœΌλ‘œλŠ” μƒˆλ‘œμš΄ 편의 μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆμ§€λ§Œ, κΈ°λ³Έ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ λ˜λŠ” μ§€μ • μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  μˆ˜λŠ” μ—†λ‹€.
  4. κΈ°μ‘΄ νƒ€μž…μ˜ μ €μž₯된 ν”„λ‘œνΌν‹°μ— κΈ°λ³Έκ°’ μ„€μ •: Extensionμ—μ„œλŠ” κΈ°μ‘΄ νƒ€μž…μ— μ €μž₯된 ν”„λ‘œνΌν‹°μ— 기본값을 μ„€μ •ν•  수 μ—†λ‹€.
// 1. μ €μž₯ ν”„λ‘œνΌν‹°(Stored Property) μΆ”κ°€
// Extension으둜 μ €μž₯ ν”„λ‘œνΌν‹° μΆ”κ°€ μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
extension Int {
    var newProperty: Int = 5 // 컴파일 μ—λŸ¬ λ°œμƒ
}


// 2. κΈ°μ‘΄ κΈ°λŠ₯의 μž¬μ •μ˜(Override)
// Extension으둜 κΈ°μ‘΄ λ©”μ„œλ“œ μž¬μ •μ˜ μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
extension Int {
    func description() -> String { // 컴파일 μ—λŸ¬ λ°œμƒ
        return "This is an extension method"
    }
}


// 3. μ΄ˆκΈ°ν™” λ©”μ„œλ“œ(Initializer)의 μž¬μ •μ˜
// Extension으둜 κΈ°μ‘΄ νƒ€μž…μ˜ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ μž¬μ •μ˜ μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
extension String {
    init() { // 컴파일 μ—λŸ¬ λ°œμƒ
        self = "Default Value"
    }
}


// 4. κΈ°μ‘΄ νƒ€μž…μ˜ μ €μž₯된 ν”„λ‘œνΌν‹°μ— κΈ°λ³Έκ°’ μ„€μ •
// Extension으둜 κΈ°μ‘΄ νƒ€μž…μ˜ μ €μž₯된 ν”„λ‘œνΌν‹°μ— κΈ°λ³Έκ°’ μ„€μ • μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
extension Double {
    var defaultValue: Double = 10.0 // 컴파일 μ—λŸ¬ λ°œμƒ
}

 

 

 

 

 

 

'🍏 Today I Learned > Swift 문법' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Swift] Combine  (0) 2023.12.15
[Swift] μ œλ„€λ¦­ (Generic)  (0) 2023.12.13
[Swift] ν”„λ‘œν† μ½œ  (0) 2023.12.13
[Swift] ARC와 λ©”λͺ¨λ¦¬ λˆ„μˆ˜  (0) 2023.12.13
[Swift] μ˜ˆμ™Έμ²˜λ¦¬  (0) 2023.12.12