swift study 15. 확장 (Extension)

jess·2022년 7월 22일
0

Swift

목록 보기
15/19
post-thumbnail

🍃 출처 : 앨런 swift 문법 마스터 스쿨 수업을 듣고 제가 이해한대로 정리해서 올리는 포스팅입니다.

📓 확장 (Extension)

class SomeType {
    // 본체
}                  
extension SomeType {
     // 확장한 타입
}                
  • 기존 클래스, 구조체, 열거형 타입에 새로운 속성, 메서드, 생성자 등을 추가하는 것
  • 원본타입(소스 코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있다
    - ⭐️ 장점: 원본 소스 코드에 대한 액세스 권한이 없는 유형을 확장하는 기능 포함
    (소급-모델링)

1) 확장의 개념과 메모리 구조


- 수직확장 (클래스만)
: 본질적으로 성격이 비슷한 타입을 새로 만들어
1) 데이터(저장속성)을 추가하거나
2) 기능(메서드) 변형시켜 사용
- 수평확장
- 현재 존재하는 타입에 기능(메서드) 추가하여 사용
✔️ 메서드 종류만 추가 가능, 추가 메모리 공간이 필요한 저장속성을 확장하는 것은 불가
- 클래스 / 구조체 / 열거형
- 확장되기 전에 생성된 경우에도 기존 인스턴스에서 새 기능 사용가능

2) 확장가능 멤버 (속성과 메서드)

extension SomeType {
  // 새로운 기능을 추가
}

✏️ 확장 가능 멤버의 종류 (메서드 형태만 가능)

  1) (타입) 계산속성, (인스턴스) 계산속성
       - 속성 감시자 추가 안되는 이유 : 저장 속성 관찰하기 때문
  2) (타입) 메서드, (인스턴스) 메서드
  3) ⭐️ 새로운 생성자 
       - 다만, 클래스의 경우 편의 생성자만 추가가능 (구조체는 다ㅇㅋ)
       - 저장 속성은 확장을 할 수 없다 
  4) 서브스크립트
  5) 새로운 중첩타입 정의 및 사용
  6) 프로토콜 채택 및 프로토콜 관련 메서드 
  • 클래스 / 구조체 / 열거형 타입에 확장이 가능
  • 새로운 메서드(기능)를 추가할 수 있지만 (상속처럼) 본체에 대한 재정의는 불가


✏️ (확장에서) 새로운 생성자 구현 가능

extension Sometype {
    ,,,
    convenience init(...) {
        self.init(...)
    }
    ...
}
  • 새로운 생성자를 구현해도 됨 (새로운 인스턴스 초기화 방법을 제공)
  • 본체의 지정생성자 호출
    1) 클래스: 편의생성자만 구현 가능 (본래 본채의 지정 생성자를 호출하는 방법으로만 구현 가능)
    2) 구조체 등: [예외] 지정생성자의 형태로도 (자유롭게) 생성자 구현 가능 (상속관련없어서)


✏️ (확장에서) 프로토콜 채택 문법

extension SomeType: SomeProtocol {
    // 프로토콜이 원하는 내용 구현
}
  • 관습적으로 프로토콜의 채택은 확장(extension)에서 구현하는 것을 권장

0개의 댓글