패키지 이름의 접두사를 지정하는 방법

이름 매핑

Java는 패키지를 사용하여 비공식적으로 네임스페이스를 정의합니다. Objective C++에는 C++ 네임스페이스가 있지만 Objective C에서는 그렇지 않습니다. 여러 패키지의 클래스를 사용할 때 이름 고유성을 유지하려면 J2ObjC는 유형 이름 앞에 카멜 표기법으로 된 패키지 버전을 추가합니다. 예를 들어 java.util.MapJavaUtilMap로 바뀝습니다.

안타깝게도 카멜 표기법을 사용한 패키지 이름은 특히 생성된 코드의 가독성을 떨어뜨릴 수 있습니다. 긴 패키지 이름이 있는 것을 볼 수 있습니다. 예를 들어 Google Guava의 베타 주석 이(가) com.google.common.annotations 패키지에 있으며, ComGoogleCommonAnnotationsBetaBeta보다 읽음

패키지 접두사 정의

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

J2ObjC는 개발자가 패키지 이름에 매핑할 자체 접두사를 지정할 수 있도록 지원합니다. 이 작업은 --prefix package=prefix를 사용하여 명령줄에서 실행됩니다. 모든 클래스 이름을 Beta님의 패키지, "--prefix com.google.common.annotations=GG" 사용됩니다. 패키지마다 별도의 접두사 선언이 필요합니다.

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

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

여러 패키지 접두사 정의

여러 접두사 정의를 간단하게 지정하기 위해 속성 파일은 "--prefixes 파일" 인수:

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>

런타임 시 접두사가 있는 클래스

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

Xcode에서 iOS 앱에 위의 prefixes.properties를 추가하려면 빌드 대상의 빌드 단계를 엽니다. 탭에서 번들 리소스 복사 섹션을 펼친 후 해당 목록에 prefixes.properties 파일을 추가합니다. 자바 리소스 개념이 iOS에 매핑되는 방식에 관한 자세한 내용은 자바 리소스를 참고하세요. 리소스를 배포합니다