seong_hye, the developer

Swift) 문법정리 - 확장(Extension) 본문

IOS

Swift) 문법정리 - 확장(Extension)

seong_hye 2022. 10. 18.

확장(Extension)이란?

기존 클래스, 구조체, 열거형 타입에 새로운 Property, Method, Initializer 등을 추가하는 것으로,

원본 타입(소스 코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있음

extension이란 키워드를 사용하여 확장함

 

사용하는 이유?

 원본 소스 코드에 대한 액세스 권한이없는 유형을 확장하는 기능이 포함 (소급-모델링 retroactive modeling)

예) Int, String, Double 등 애플이 미리 만들어 놓은 타입에 확장도 가능

[ Struct에선 self를 사용할 때 mutating 키워드 필요 ]

class Person {
    var id = 0
    var name = "이름"
    var email = "1234@gmail.com"
    
    func walk() {
        print("사람이 걷는다.")
    }
}

class Student: Person {
    var studentId = 1
    
    override func walk() {
        print("학생이 걷는다.")
    }
    
    func study() {
        print("학생이 공부한다.")
    }
}

extension Student {
    func play() {
        print("학생이 논다.")
    }
}

확장 가능한 멤버의 종류

클래스 / 구조체/ 열거형 타입에 확장이 가능

새로운 메서드(기능)을 추가할 수 있지만 (상속처럼) 본체에 대한 재정의는 불가

메서드 형태만 가능!! 저장속성은 정의할 수 없음!!

~> .(점)문법을 사용하여 접근

 

1) (타입) 계산 속성, (인스턴스) 계산 속성

속성을 확장하여 값을 좀 더 다양하게 활용 가능

// (타입)계산 속성
extension Double {
    static var zero: Double { return 0.0 }
}

Double.zero


// (인스턴스)계산 속성
extension Double {
    var km: Double { return self * 1_000.0 }   // 인스턴스 자신에 1000 곱하기
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1_000.0 }
    var ft: Double { return self / 3.28084 }
}


let oneInch = 25.4.mm
print("1인치는 \(oneInch) 미터")       // 1인치는 0.0254 미터"

 

2) (타입) 메서드, (인스턴스) 메서드

// (타입)메서드
extension Int {
    static func printNumbersFrom1to5() {
        for i in 1...5 {
            print(i)
        }
    }
}

Int.printNumbersFrom1to5()


//(인스턴스)메서드
extension String {
    func printHelloRepetitions(of times: Int) {
        for _ in 0..<times {
            print("Hello \(self)!")
        }
    }
}

"Steve".printHelloRepetitions(of: 4)

 

 3) 새로운 생성자 

클래스

 편의 생성자만 추가 가능

 지정생성자 추가 불가 / 소멸자 추가 불가

(항상 본래의 클래스에서 정의해야 함)

extension UIColor { 
   
    convenience init(color: CGFloat) {   // Float   / Double
        self.init(red: color/255, green: color/255, blue: color/255, alpha: 1)
    }

}

  구조체

원래 편의 생성자가 존재하지 않고, 상속과 관련이 없기 때문에

   지정생성자의 형태로도 자유롭게 생성자 구현 가능

struct Rect {     // 기본값 제공/생성자 구현안함  ===> 기본 생성자 / 멤버와이즈 생성자가 자동 제공 중
    var origin = Point()
    var size = Size()
}

extension Rect {
   init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        
        // (1) 본체의 멤버와이즈 생성자 호출 방식으로 구현 가능
        self.init(origin: Point(x: originX, y: originY), size: size)
        
        // (2) 직접 값을 설정하는 방식으로도 구현 가능
        //self.origin = Point(x: originX, y: originY)
        //self.size = size
    }
}

 

4) 서브스크립트

extension Int {
    subscript(num: Int) -> Int {
        
        var decimalBase = 1
        
        for _ in 0..<num {
            decimalBase *= 10
        }
        
        return (self / decimalBase) % 10
        
    }
}

// 123456789[0]    // 9
// 123456789[1]    // 8
// 123456789[2]    // 7

 

5) 새로운 중첩 타입 정의 및 사용

클래스, 구조체 및 열거형에 새 중첩 유형을 추가 가능

extension Int {
    
    enum Kind {       // 음수인지, 0인지, 양수인지
        case negative, zero, positive
    }
    
    var kind: Kind {    // 계산 속성으로 구현
        switch self {
        case 0:                   // 0인 경우
            return Kind.zero
        case let x where x > 0:   // 0보다 큰경우
            return Kind.positive
        default:                  // 나머지 (0보다 작은 경우)
            return Kind.negative
        }
    }
}

 


상속과 확장의 차이는?

상속 확장
수직적 개념 수평적 개념
성격이 비슷한 "타입을 새로"만들어, 데이터를 추가하고, 기능(메서드)을 변형시켜 사용하려는 것  "현재 존재하는 타입"에 기능(메서드)을 추가하여 사용하려는 것

참고자료)

https://www.inflearn.com/course/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EB%AC%B8%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0-%EC%8A%A4%EC%BF%A8/dashboard

'IOS' 카테고리의 다른 글

URLSession  (0) 2022.10.27
Swift) 문법 정리 - @attribute 키워드  (0) 2022.10.22
Swift) 문법 정리 - COW(Copy-On-Write)  (0) 2022.08.02
Swift) 문법 정리 - 싱글톤(Singleton) 패턴  (0) 2022.07.26
Swift) 문법 정리 - self vs Self  (0) 2022.07.19
Comments