🔥 Extension으로 메서드 추가하기

309자
5분

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에서 매우 강력한 기능입니다. 기존 타입에 새로운 메서드를 추가하여 타입의 기능을 확장하고 향상시킬 수 있죠. 이는 코드의 모듈성, 재사용성, 가독성을 높이는데 크게 기여합니다.