패키지 이름의 프리픽스를 지정하는 방법

이름 매핑

자바는 패키지를 사용하여 비공식적으로 네임스페이스를 정의합니다. Objective C++에는 C++ 네임스페이스가 있지만 Objective C에는 없습니다. 여러 패키지의 클래스를 사용할 때 이름 고유성을 유지하기 위해 J2ObjC는 패키지의 이름에 카멜 표기법을 사용합니다. 예를 들어 java.util.Map의 이름은 JavaUtilMap로 변경됩니다.

안타깝게도 카멜 표기법을 사용하면 패키지 이름이 특히 패키지 이름이 길 때 생성된 코드의 가독성이 저하될 수 있습니다. 예를 들어 Google Guava의 베타 주석com.google.common.annotations 패키지에 있고 ComGoogleCommonAnnotationsBetaBeta보다 읽기가 어렵습니다.

패키지 접두사 정의

비공식 네임스페이스를 정의하는 Objective-C 규칙은 일반적으로 두 개의 대문자를 공유하는 공유 접두사를 사용하는 것입니다. 예를 들어 iOS Foundation Framework는 NeXTStep의 'NS'를 사용합니다. Google Guava의 베타 이름을 간소화하기 위해 'GG'와 같은 접두사는 BetaGGBeta로 참조하여 가독성을 개선합니다.

J2ObjC는 패키지 이름에 매핑되는 자체 접두사를 지정하는 개발자를 지원합니다. 이 작업은 명령줄에서 --prefix package=prefix를 사용하여 실행됩니다. Beta의 패키지에 있는 모든 클래스 이름을 단축하려면 '--prefix com.google.common.annotations=GG'을 사용합니다. 각 패키지에 별도의 프리픽스 선언이 필요합니다.

여러 패키지의 단일 접두사 정의

작은 라이브러리에는 충돌하지 않는 자바 클래스 이름이 포함되어 있는 경우 단일 접두사를 와일드 카드 패키지 사양과 공유할 수 있습니다. 예를 들어 모든 Joda-Time 패키지는 --prefix 'org.joda.time.*=JT'를 사용하여 동일한 JT 접두사를 공유할 수 있습니다. 유일하게 지원되는 와일드 카드 문자는 '*'이며, 이는 명령줄 셸이 파일 이름을 지정하는 방식과 동일합니다.

여러 패키지 접두어 정의

여러 프리픽스 정의를 간단하게 지정하기 위해 속성 파일을 '--prefixes file' 인수와 함께 사용할 수 있습니다.

cat prefixes.properties
com.google.common.annotations: GG
com.google.common.base: GG

# While GG can be used for all packages, let's mix it up.
com.google.common.collect: GC
com.google.common.io: GIO        # A prefix can be more than two characters,
com.google.common.net: GuavaNet  # a lot more!
...
j2objc --prefixes prefixes.properties <args>

런타임 시 접두사 클래스

완성된 앱에는 접두사가 있는 클래스가 있으므로 기본적으로는 원래 자바 클래스 이름을 사용하여 찾을 수 없습니다. 그러나 앱의 리소스 번들에 번역에 사용되는 프리픽스가 포함된 prefixes.properties라는 파일이 있으면 Class.forName(javaName)가 매핑된 클래스를 찾습니다.

Xcode에서 위의 prefixes.properties를 iOS의 빌드 단계에 추가하려면 빌드 대상의 빌드 단계 탭을 열고 번들 리소스 복사 섹션을 펼친 다음 prefixes.properties 파일을 목록에 추가합니다. 자바 리소스에서는 자바 리소스 개념이 iOS 리소스에 어떻게 매핑되는지 자세히 확인할 수 있습니다.