itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • crud
  • 점주
  • mongodb
  • POSTECH
  • CS
  • nosql
  • SwiftUI
  • SWIFT
  • 생활코딩
  • binding
  • 독립서점
  • ios
  • 세그멘테이션
  • AppleDevloperAcademy
  • CoreData
  • 연결리스트
  • 개발자
  • 어플
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 킨디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 27. 익스텐션
iOS/Swift

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 27. 익스텐션

2021. 7. 30. 14:55

익스텐션 (Extension)

- 익스텐션은 스위프트의 강력한 기능 중 하나

- 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능

- 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없다 해도, 타입만 알고 있다면 그 타입의 기능을 확장할 수도 있음

 

스위프트의 익스텐션이 타입에 추가할 수 있는 기능

- 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티

- 타입 메소드 / 인스턴스 메소드

- 이니셜라이저

- 서브스크립트

- 중첩 타입

- 특정 프로토콜을 준수할 수 있도록 기능 추가

 

*익스텐션은 타입에 새로운 기능을 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수는 없음

 

클래스의 상속 vs 익스텐션

이 둘은 비슷해보이나 실제 성격은 많이 다름

 

클래스의 상속 : 클래스 타입에서만 가능, 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현하는 수직 확장, 상속 받으면 기존 기능 재정의 가능

 

익스텐션 : 구조체, 클래스, 프로토콜 등에 적용 가능, 기존의 타입에 기능을 추가하는 수평확장, 기존 기능 재정의 불가능

 

익스텐션 활용

익스텐션을 사용하는 대신 원래 타입을 정의한 소스에 기능을 추가하는 방법도 있으나, 이는 외부 라이브러리나 프레임워크를 가져다 썼다면 원본 소스를 수정하지 못함. 이처럼 외부에서 가져온 타입에 내가 원하는 기능을 추가하조가 할 때 익스텐션을 사용. 따로 상속을 받지 않아도 되며, 구조체와 열거형에도 기능을 추가할 수 있으므로 익스텐션은 매우 편리한 기능.

익스텐션은 모든 타입(구조체, 열거형, 클래스, 프로토콜, 제네릭 타입 등)에 적용 가능. 익스텐션을 통해 연산 프로퍼티, 메소드, 이니셜라이저, 서브스크립트, 중첩 데이터 타입 등 추가 가능. 더불어 익스텐션은 프로토콜과 함께 사용하면 굉장히 강력한 기능을 선사함. 이 부분과 관련해 프로토콜 중심 프로그래밍(Protocol Oriented Programming)에 대해 알아보는 것도 좋음

 

 

정의

extension 확장할 타입 이름 {
	타입에 추가될 새로운 기능 구현
}

 

기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수도 있음. 이때는 클래스나 구조체에서 사용하던 것과 같은 방법으로 프로토콜 이름 나열

extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 ... {
	프로토콜 요구사항 구현
}

그렇다고 한다

 

 

 

구현

extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
    var isOdd: Bool {
        return self % 2 == 1
    }
}

print(1.isEven) //false
print(1.isOdd)  //true
print(2.isEven) //true
print(2.isOdd)  //false

var number: Int = 3
print(number.isOdd) //true
print(number.isEven) //false

number = 2
print(number.isOdd) //false
print(number.isEven) //true

 

메소드 추가

- 메소드 익스텐션을 통해 Int 타입에 인스턴스 메소드를 추가해보자

- 여러 기능을 여러 익스텐션 블록으로 나눠서 구현해도 문제 없음

- 관련된 기능별로 하나의 익스텐션 블록에 묶어주는 것도 좋음

extension Int {
    func multiply(by n: Int) -> Int {
        return self*n
    }
}

print(3.multiply(by: 2)) //6
print(4.multiply(by: 5)) //20

number = 5
print(number.multiply(by: 2)) //10

 

 

 

이니셜라이저 추가

인스턴스를 초기화(이니셜라이즈)할 때 초기화에 필요한 다양한 데이터를 전달받을 수 있도록 여러 종류의 이니셜라이저를 만들 수 있음. 타입의 정의부에 이니셜라이저를 추가하지 않더라도 익스텐션을 통해 이니셜라이저를 추가할 수 있음. 익스텐션으로 클래스 타입에 편의 이니셜라이저는 추가할 수 있으나, 지정 이니셜라이저는 추가할 수 없음. 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 함 (값 타입은 상관없음)

extension String {
    init(int: Int) {
        self = "\(int)"
    }
    
    init(double: Double) {
        self = "\(double)"
    }
}

let stringFromInt: String = String(int: 100) //"100"
let stringFromDouble: String = String(double: 100.0) //"100.0"

 

'iOS > Swift' 카테고리의 다른 글

[iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 29. 고차함수  (0) 2021.08.01
[iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 28. 오류 처리  (0) 2021.07.30
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜  (0) 2021.07.29
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard  (0) 2021.07.29
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 24. 타입 캐스팅  (0) 2021.07.27
    'iOS/Swift' 카테고리의 다른 글
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 29. 고차함수
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 28. 오류 처리
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard
    itisjustK
    itisjustK

    티스토리툴바