inlinable에 대한 설명에 앞서, Client <-> Framework 간 동작 방식에 대해서 설명할게요.
이해를 돕기 위해 MyFramework라는 framework 안에 Person이란 클래스를 만들어봤어요.
사용하는 곳(Client)에서는 아래처럼 쓰겠죠?
내부적으로는 런타임 때 아래처럼 동작해요.
1. (Client) MyFramework에서 Person이 가지고 있는 method 들 중에서 어떤 게 sayHello() method야? 2. (MyFramework) Person의 2번째 method 임. 호출해줄게. 3. (Client) ㅇㅋ. ㄱㅅ.. 4. (Client) 그럼 isGenerationZ() method는 어떤거야? 5. (MyFramework) 3번째 임. 호출해줄게.. 6. (Client) ㅇㅋ.. ㄱㅅㄱㅅ...
Client <-> Framework 간 상호작용을 하다 보니 간단한 method 일지라도 오버헤드가 생깁니다.
inlinable 속성은 public 또는 internal로 선언된 곳에서만 사용할 수 있습니다. (private, fileprivate에서는 사용할 수 없습니다.)
usableFromInline 속성은 internal로 선언된 곳에서만 사용할 수 있죠.
또한 inlinable 속성이 추가된 구현부에서 정의한 함수나 클로저의 경우 암묵적(implicitly)으로 inlinable로 정의된다고 해요.
inlinable로 선언한 이후에는, 최적화 등을 위해서 구현부를 수정하는 것은 괜찮지만 return 값을 바꾸는 행위는 지양 한다고 합니다.. client 쪽에서는 re-compile을 하지 않는 이상 이전의 return 값을 사용하게 되고 이 경우, client와 framework 간 특정 상황 & 특정 input에 의해서만 return 값이 달라지는 버그가 생길 수 있다고 해요.
(근데... client 쪽에서 모듈 업데이트를 하면 바뀐 return 값이 적용되는 거 아닌가요...? 이 부분은 잘 이해가 안 되네요..ㅠㅠㅠ 혹시 알고 계신 분 있으시면 알려주세요ㅠㅠ)