번역 참조

유형

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

메서드

Objective-C 메서드는 Java 메서드와 두 가지 중요한 차이점이 있습니다. 구문적으로 메서드 선택기의 구성 요소 사이에 매개변수를 삽입하는 것입니다. Objective-C 메서드는 Java처럼 오버로드를 지원하지 않습니다. 이러한 차이점은 매개변수 유형을 생성합니다. 이는 오버로드된 Java 메서드를 제공합니다.

생성된 API가 다른 Java 메서드에는 인스턴스 메서드, 정적 메서드, 메서드, 생성자가 포함됩니다. 인스턴스 메서드는 Objective-C 인스턴스 메서드로 변환됩니다. 정적 메서드와 생성자는 C 스타일 함수로 변환되지만 Objective-C 래퍼를 Objective-C 개발자에게 보다 익숙한 API를 제공할 수 있습니다.

인스턴스 메서드

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

  • 0 매개변수 메서드는 변경되지 않음
  • 하나 이상의 매개변수가 다음 패턴을 사용합니다. <ph type="x-smartling-placeholder">
      </ph>
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • 매개변수 키워드 규칙: <ph type="x-smartling-placeholder">
      </ph>
    • 프리미티브 유형의 경우 키워드는 Java 프리미티브의 대문자 이름입니다. (예: '문자')
    • 원시 유형이 아닌 경우 키워드는 카멜 표기법으로 된 정규화된 유형 이름입니다. (예: 'ComGoogleFoo')
    • 배열 유형의 경우 'Array' 요소 유형의 키워드에 추가됩니다.
Java 예시
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_)
Java 예시
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 스타일 함수가 추가되었습니다.

  • 첫 번째 함수는 새로 할당된 객체를 첫 번째 매개변수로 허용합니다. 이 함수는 일반적으로 서브클래스 생성자에서 호출하는 데 사용됩니다. static과 동일한 이름 지정 규칙을 따릅니다. 메서드를 참조하세요. (여기서 'init'는 메서드 이름입니다.)
  • 새 객체를 할당하고 초기화하는 함수 두 개가 추가되었습니다. 차별화됩니다. 를 붙여야 합니다. <ph type="x-smartling-placeholder">
      </ph>
    • create_ 함수는 자동 해제된 객체를 반환합니다.
    • new_ 함수는 보관된 객체를 반환합니다.
Java 예시
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);

필드

인스턴스 필드 (비정적)

Java 인스턴스 변수가 Objective-C 인스턴스 변수가 됩니다. 이름이 동일하며 뒤에 오는 밑줄로 표시됩니다. '최종'으로 선언된 기본 필드 특수한 경우이며 변수로 사용할 수 있습니다.

  • '->' 기호를 사용하여 필드에 직접 액세스할 수 있습니다. 구문을 사용합니다
  • 기본 필드는 직접 설정할 수 있습니다.
    • 최종 프리미티브 (상수)는 정적 상수처럼 변환됩니다. (정적 필드 참조)
  • 원시가 아닌 필드는 제공된 setter 함수를 사용하여 설정해야 합니다. <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_set_fieldName_(instance, value)
Java 예시
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 함수를 사용하여 액세스해야 합니다. 이러한 접근자 함수는 변수에 액세스하기 전에 클래스 초기화가 발생했는지 확인합니다.

  • 정적 필드에 액세스 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_get_fieldName()
  • 최종이 아닌 정적 필드 할당 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_set_fieldName()
  • 기본 정적 필드를 가리키는 포인터 가져오기 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_getRef_fieldName()
    • 최종이 아닌 필드 및 비휘발성 필드에만 사용할 수 있습니다.

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

  • ClassName_fieldName
Java 예시
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는 각 Java enum에 두 가지 유형을 생성합니다. Objective-C 클래스 유형이 생성되며, 이 유형은 Java enum의 전체 기능을 보여줍니다. 또한 C enum은 Foundation 코드를 사용하여 프레임워크의 NS_ENUM 매크로 Objective-C 클래스 유형은 생성된 모든 API에서 사용됩니다. C enum은 는 switch 문의 상수 값 또는 저장 유형으로 유용합니다.

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

  • Objective-C 클래스는 일반 Java 클래스와 동일한 규칙을 사용하여 이름이 지정됩니다. (유형 참고)
  • C enum은 '_Enum'이 추가된 일반 Java 클래스로 명명됩니다. 서픽스입니다.

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

Java 예시
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);