[Swift] @inlinable
안녕하세요 죽지도 않고 또 돌아왔습니다. 밀린 포스팅은 맞추지 않고 다시 주에 1개씩 작성할 수 있도록 노력해보겠습니다…
[Swift] @inlinable
Photo by Joao Viegas on Unsplash
안녕하세요 죽지도 않고 또 돌아왔습니다. 밀린 포스팅은 맞추지 않고 다시 주에 1개씩 작성할 수 있도록 노력해보겠습니다…
Foundation 프레임워크 정의를 살펴보면 @inlinable 이라는 어트리뷰트를 만나볼 수 있다.
그러면 inlinable에 대해 알아보기 전에 inline이라는 개념을 먼저 알아봐야할 것 같은데요
inline function
- Swift 뿐 아니라 일반적인 프로그래밍 언어에 있는 기능
- 컴파일러 최적화에서 사용
- 인라인이란, 메서드 호출을 해당 메서드의 본문으로 대체하는 컴파일러 최적화 방법
- 일반적인 메소드를 호출하는 작업: 스레드에 있는 스택 테스크(추적, 앱 상태 전송, 저장, 변경)하는 과정이 존재 (장점 — 디버깅 용이, 단점 — 오버헤드)
- 인라인을 사용한 경우, 메소드 호출: 스택을 따로 추적하지 않고 메소드의 본문을 바로 가져다가 사용 (장점 — 오버헤드 감소, 단점 — 함수 body가 재귀 호출과 같은 반복이 있는 경우에는 더 비효율적)
함수 호출 시 별도로 분리된 위치의 레이블로 점프하여 실행되는 일반 함수와는 달리 호출 부분을 함수 전체 코드로 치환하여 컴파일한다. 전처리기의 매크로와 달리 언어 차원에서 지원하기에 일반 함수와 별 다르지 않게 사용할 수 있다.
@inlinable
컴파일러가 함수 본문을 호출 지점에 인라인할 수 있게 허용하는 어트리뷰트입니다

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes/#inlinable
일반 함수 호출은 call → jump → execute → return 과정을 거치지만, 인라인되면 함수 본문이 호출 지점에 직접 삽입되어 함수 호출 오버헤드가 사라집니다.
주로 Swift 표준 라이브러리나 프레임워크 모듈에서 성능이 중요한 작은 함수에 사용합니다. 앱 코드에서는 컴파일러가 같은 모듈 내에서 알아서 인라인 최적화를 하기 때문에 직접 붙일 필요가 거의 없습니다.
모듈 경계를 넘어서 호출되는 작고 성능이 중요한 public 함수에 사용합니다.
핵심 이유
모듈이 분리되면 컴파일러가 다른 모듈의 함수 본문을 볼 수 없어서 인라인 최적화가 불가능합니다. @inlinable을 붙이면 함수 본문이 모듈의 .swiftinterface에 노출되어 호출 측 모듈에서 인라인할 수 있게 됩니다.
예제: +1을 하여 print하는 메소드
// 일반적인 메소드
func logPlusOn(number: Int) {
print("value is \(number + 1)")
}
// 재귀호출이 없고, body가 단순한 형태이므로 @inlinable 사용하여 컴파일러 최적화
@inlinable
func logPlusOn(number: Int) {
print("value is \(number + 1)")
}
참고
메타데이터
- post_id
- 0c3d40ccbc3a
- slug
- swift-inlinable-0c3d40ccbc3a
- url
- https://medium.com/@gaeng2y/swift-inlinable-0c3d40ccbc3a
- canonical_url
- https://medium.com/@gaeng2y/swift-inlinable-0c3d40ccbc3a
- author_url
- https://medium.com/@gaeng2y
- status
- ok
- fetched_at
- 2026-06-13 16:00:06