PublishedApi

HEETAE HEO·2024년 1월 15일
post-thumbnail

Kotlin에서 inline 함수는 함수 호출을 통해 발생할 수 있는 성능 비용을 줄이기 위해 사용합니다. inline 함수는 그 내부에 작성된 코드를 호출 시점에 직접 삽입합니다. 그러나 inline 함수 내부에서 internal 가시성을 가진 멤버나 클래스에 접근할 때, 문제가 발생할 수 있습니다. 이는 inline 함수가 다른 모듈에서 호출되면, 그 모듈은 원래 internal로 접근할 수 없는 멤버를 사용할 수 없기 때문입니다.

이때 @PublishedApi 어노테이션이 중요한 역할을 합니다. internal로 정의된 멤버나 클래스에 이 어노테이션이 적용하면, 그 멤버는 inline 함수가 다른 모듈에서 호출되더라도 접근할 수 있게 됩니다. 이 어노테이션은 internal 가시성을 가진 선언을 inline 함수에서 안전하게 사용할 수 있도록 하며, 그 선언은 사실상 공개 API처럼 동작하게 됩니다.

단 @PublishedApi로 공개된 멤버는 바이너리 호환성에 영향을 줄 수 있으므로, 이후 변경할 때 주의해야합니다.

class ExampleClass {
	// Internal 가시성의 멤버 함수
	@PublishedApi
	internal fun internalFuntion(){
		...
	}
	
	// 공개적으로 사용 가능한 inline 함수
	inline fun useInternalFunction(){
		internalFuntion()
	}
}

fun main(){
	val exampleClass = ExampleClass()
	exampleClass.useInternalFunction()
}

위에 internalFunction으로 선언된 함수의 경우 같은 모듈 내에서만 접근(호출)이 가능합니다. 하지만 @PublishedApi를 사용한다면 이 internalFunction은 inline 함수인 useInternalFunction 내부에서도 사용할 수 있게 됩니다.


바이너리 호환성

바이너리 호환성이란 기존에 컴파일된 코드와 새롭게 수정된 버전의 코드가 서로 호환되어 함께 실행될 수 있는지를 의미합니다. 특히 라이브러리나 모듈을 배포할 때, 이전 버전의 라이브러리로 컴파일된 코드가 새로운 버전의 라이브러리로도 정상적으로 동작하는지 여부를 의미합니다.

해결 방법

  • 참조하는 코드 전체 제거
  • @Deprecated와 바이너리 호환성 kotlin에서는 @Deprecated 어노테이션을 사용하여 점진적으로 기능을 제거하는 방법을 많이 사용합니다. 이를 통해 바이너리 호환성을 유지하면서도 사용자에게 기존 API의 사용을 피하도록 권장해야합니다.
    @Deprecated("Use thisFunction instead", ReplaceWith( "newFunction()")
    fun thisFunction(){
    	...
    }
    
    fun newFunction(){
    	...
    }
profile
Android 개발 잘하고 싶어요!!!

0개의 댓글