번역 참조

유형

  • 프리미티브 유형의 경우 J2ObjC는 JNI 스타일 typedef를 정의했습니다.
  • 일반적인 클래스 유형의 경우 패키지는 카멜 표기법을 사용하고 클래스 이름 앞에 추가됩니다.
  • 기본 객체 유형 및 모든 유형 변수의 경우 'id'가 사용됩니다.
  • 몇 가지 핵심 자바 유형이 기반 유형에 매핑됩니다. (예: String에서 NSString으로 변환)
  • 'volatile'로 선언된 필드의 경우 J2ObjC에 C11 _Atomic(...) 유형을 사용하는 typedef가 더 많이 있습니다.
  • 내부 유형에서는 내부 클래스 이름이 밑줄과 함께 외부 이름에 추가됩니다.
자바 유형 Objective-C 유형 Objective-C 휘발성 유형
boolean J부울 volatile_jboolean
char jchar volatile_jchar
byte J바이트 volatile_jbyte
short jshort volatile_jshort
int 젠트 volatile_jint
long jlong volatile_jlong
float Jfloat volatile_jfloat
double Jj volatile_jdouble
java.lang.Object id volatile_id
유형 변수 id volatile_id
java.lang.String NS 문자열* volatile_id
java.lang.Number NSNumber* volatile_id
java.lang.복제 가능 NS복사* volatile_id
foo.bar.중얼 FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

방법

Objective-C 메서드는 자바 메서드와 두 가지 중요한 차이점이 있습니다. 메서드 선택기의 구성요소 사이에 매개변수를 삽입하여 구문이 달라집니다. Objective-C 메서드는 자바처럼 오버로드를 지원하지 않습니다. 이러한 차이는 생성된 선택기에 매개변수 유형을 삽입하여 해결됩니다. 이는 오버로드된 자바 메서드 간의 이름 충돌을 방지하기 위해 필요합니다.

생성된 API에는 인스턴스 메서드, 정적 메서드, 생성자라는 세 가지 종류의 자바 메서드가 있습니다. 인스턴스 메서드는 Objective-C 인스턴스 메서드로 변환됩니다. 정적 메서드와 생성자는 C 스타일 함수로 변환되지만 Objective-C 래퍼를 추가하여 Objective-C 개발자에게 더 친숙한 API를 제공합니다.

인스턴스 메서드

메서드 이름은 다음과 같이 생성됩니다.

  • 0 매개변수 메서드는 변경되지 않습니다.
  • 하나 이상의 매개변수가 다음 패턴을 사용합니다.
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • 매개변수 키워드 규칙:
    • 프리미티브 유형의 경우 키워드는 자바 프리미티브의 대문자 이름입니다. (예: '차')
    • 프리미티브가 아닌 경우 키워드는 카멜 표기법을 적용한 정규화된 유형 이름입니다. (예: 'ComGoogleFoo')
    • 배열 유형의 경우 요소 유형의 키워드에 '배열'이 추가됩니다.
예시 자바
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Objective-C 예
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

정적 메서드

Objective-C 클래스 메서드는 인스턴스 메서드와 동일한 이름 지정 규칙에 따라 추가됩니다.

C 스타일 함수는 다음 이름 지정 규칙을 사용하여 추가됩니다.

  • 생성된 Objective-C 선택기로 시작합니다. (예: barWithInt:)
  • 콜론을 밑줄로 바꿉니다. (예: barWithInt_)
  • 클래스 이름 앞에 밑줄로 구분합니다. (예: ComGoogleFoo_barWithInt_)
예시 자바
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Objective-C 예
@interface Foo : NSObject

+ (jboolean)bar;

+ (jdouble)barWithIntArray:(IOSIntArray *)i;

+ (void)barWithNSString:(NSString *)s
            withBoolean:(jboolean)b;

@end

FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();

FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);

FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);

생성자

Objective-C 규칙에 따라 init 인스턴스 메서드가 추가됩니다. 생성자에 매개변수가 있으면 인스턴스 메서드와 동일한 이름 지정 규칙이 사용됩니다.

세 가지 C 스타일 함수가 추가되었습니다.

  • 첫 번째 함수는 새로 할당된 객체를 첫 번째 매개변수로 허용합니다. 이 함수는 일반적으로 서브클래스 생성자에서 호출하는 데 사용됩니다. 이는 정적 메서드와 동일한 이름 지정 규칙을 따릅니다. (여기서 'init'는 메서드 이름입니다.)
  • 새 객체를 할당하고 초기화하는 두 함수가 추가됩니다. 프리픽스로 구분됩니다.
    • create_ 함수는 자동 해제된 객체를 반환합니다.
    • new_ 함수는 보관된 객체를 반환합니다.
예시 자바
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Objective-C 예
@interface ComGoogleFoo : NSObject

- (instancetype)init;

- (instancetype)initWithId:(id)a
                    withId:(id)b;

@end

FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();

FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);

필드

인스턴스 필드 (비정적)

자바 인스턴스 변수는 Objective-C 인스턴스 변수가 됩니다. 이름은 밑줄과 동일합니다. '최종'으로 선언된 기본 필드는 특수한 경우이며 인스턴스 변수로 변환되지 않습니다.

  • '->' 구문을 사용하여 필드에 직접 액세스할 수 있습니다.
  • 기본 필드는 직접 설정할 수 있습니다.
    • 최종 프리미티브 (상수)는 정적 상수처럼 변환됩니다. (정적 필드 참고)
  • 기본이 아닌 필드는 제공된 setter 함수를 사용하여 설정해야 합니다.
    • ClassName_set_fieldName_(instance, value)
예시 자바
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Objective-C 예
Foo *foo = [[Foo alloc] init];

// Access a primitive field.
i = foo->myInt_;

// Set a primitive field.
foo->myInt_ = 5;

// Access a non-primitive field.
NSString *s = foo->myString_;

// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");

정적 필드

정적 변수는 제공된 getter 함수와 setter 함수를 사용하여 액세스해야 합니다. 이러한 접근자 함수는 변수에 액세스하기 전에 클래스 초기화가 발생했는지 확인합니다.

  • 정적 필드에 액세스
    • ClassName_get_fieldName()
  • 최종이 아닌 정적 필드 할당
    • ClassName_set_fieldName()
  • 기본 정적 필드 포인터를 가져옵니다.
    • ClassName_getRef_fieldName()
    • 최종 및 비휘발성 필드에만 사용할 수 있습니다.

최종 프리미티브 필드 (상수)는 값이 클래스 초기화에 종속되지 않으므로 직접 액세스하는 것이 안전합니다.

  • ClassName_fieldName
예시 자바
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Objective-C 예
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT;   // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT();  // Class initialization

// Access a primitive field.
i = ComGoogleFoo_get_myInt();

// Set a primitive field.
ComGoogleFoo_set_myInt(5);

// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();

// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");

열거형

J2ObjC는 각 자바 enum에 대해 두 가지 유형을 생성합니다. 자바 enum의 모든 기능을 제공하는 Objective-C 클래스 유형이 생성됩니다. 또한 C enum은 기초 프레임워크의 NS_ENUM 매크로를 사용하여 생성됩니다. Objective-C 클래스 유형은 생성된 모든 API에서 사용됩니다. C enum은 Switch 문의 상수 값 또는 스토리지 유형으로 유용합니다.

생성된 enum 유형의 이름은 다음과 같습니다.

  • Objective-C 클래스는 일반 자바 클래스와 동일한 규칙을 사용하여 이름이 지정됩니다. (유형 참고)
  • C enum에는 '_Enum' 접미사가 추가된 일반 자바 클래스로 이름이 지정됩니다.

enum 상수는 정적 필드처럼 액세스됩니다.

예시 자바
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Objective-C 헤더 예시
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
  ComGoogleColor_Enum_RED = 0;
  ComGoogleColor_Enum_GREEN = 1;
  ComGoogleColor_Enum_BLUE = 2;
};

@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end

inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();

// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);