🔥 Extension으로 메서드 추가하기
Extension을 사용하면 기존 타입에 새로운 인스턴스 메서드와 타입 메서드를 추가할 수 있습니다. 다음 예제는 Int
타입에 repetitions
이라는 새로운 인스턴스 메서드를 추가합니다:
extension Int { func repetitions(task: () -> Void) { for _ in 0..<self { task() } } }
swift
repetitions(task:)
메서드는 () -> Void
타입의 단일 인자를 받습니다. 이는 매개변수가 없고 값을 반환하지 않는 함수를 나타내죠.
이 Extension을 정의한 후에는 어떤 정수에서든 repetitions(task:)
메서드를 호출하여 해당 횟수만큼 작업을 수행할 수 있습니다:
3.repetitions { print("Hello!") } // Hello! // Hello! // Hello!
swift
이렇게 Extension을 통해 기존 타입에 새로운 기능을 추가할 수 있습니다. 이는 특히 라이브러리나 프레임워크에서 제공하는 타입을 확장할 때 유용하죠. 소스 코드에 접근할 수 없더라도 원하는 기능을 추가할 수 있습니다.
또한 이 기법은 코드의 모듈성과 재사용성을 향상시킵니다. 관련된 기능을 Extension으로 그룹화하여 기존 타입과 분리할 수 있기 때문이죠. 이렇게 하면 타입의 핵심 기능과 추가적인 기능을 깔끔하게 구분할 수 있습니다.
인스턴스를 변경하는 메서드 (Mutating Instance Methods)
Extension으로 추가된 인스턴스 메서드는 인스턴스 자체를 수정(또는 변경
)할 수도 있습니다. 구조체와 열거형 메서드가 self
나 그 속성을 수정하려면 원본 구현에서의 변경 메서드와 마찬가지로 인스턴스 메서드를 mutating
으로 표시해야 합니다.
아래 예제는 Swift의 Int
타입에 원래 값을 제곱하는 square
라는 새로운 변경 메서드를 추가합니다:
extension Int { mutating func square() { self = self * self } } var someInt = 3 someInt.square() // someInt는 이제 9입니다.
swift
이 예제에서 square()
메서드는 mutating
으로 표시되어 있습니다. 이는 메서드가 self
의 값을 변경할 것임을 나타내죠. 메서드 내부에서 self
에 새로운 값을 할당하여 someInt
의 값을 제곱합니다.
변경 메서드는 값 타입(구조체와 열거형)에서만 사용할 수 있습니다. 클래스의 인스턴스 메서드는 항상 인스턴스 자체를 변경할 수 있기 때문에 mutating
으로 표시할 필요가 없죠.
Extension으로 추가된 변경 메서드를 통해 기존 타입의 인스턴스를 다양한 방식으로 수정할 수 있습니다. 이는 타입의 기능을 확장하면서도 원본 구현을 깨끗하게 유지하는데 도움이 됩니다.
이처럼 Extension은 Swift에서 매우 강력한 기능입니다. 기존 타입에 새로운 메서드를 추가하여 타입의 기능을 확장하고 향상시킬 수 있죠. 이는 코드의 모듈성, 재사용성, 가독성을 높이는데 크게 기여합니다.