[java] Java 식별자에서 “연결 문자”란 무엇입니까?

SCJP를 읽고 있는데이 줄과 관련하여 질문이 있습니다.

식별자는 문자, 통화 문자 ($) 또는 밑줄 (_)과 같은 연결 문자로 시작해야합니다. 식별자는 숫자로 시작할 수 없습니다!

유효한 식별자 이름은 밑줄 과 같은 연결 문자로 시작할 수 있습니다 . 밑줄 만 유효한 옵션이라고 생각 했습니까? 다른 연결 문자 가 있습니까?



답변

연결 문자 목록은 다음과 같습니다. 이들은 단어를 연결하는 데 사용되는 문자입니다.

http://www.fileformat.info/info/unicode/category/Pc/list.htm

U+005F _ LOW LINE
U+203F  UNDERTIE
U+2040  CHARACTER TIE
U+2054  INVERTED UNDERTIE
U+FE33  PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34  PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D  DASHED LOW LINE
U+FE4E  CENTRELINE LOW LINE
U+FE4F  WAVY LOW LINE
U+FF3F _ FULLWIDTH LOW LINE

이것은 Java 7에서 컴파일됩니다.

int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;

예입니다. 이 경우 tp열 이름과 주어진 행의 값입니다.

Column<Double> tp = table.getColumn("tp", double.class);

double tp = row.getDouble(︴tp︴);

다음과 같은

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");
}

인쇄물

$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₧ ₣ ₤ ₥ ₫ € ₭ ₮ ₯ ₰ ₰ ₷ ₳ ₵ ₶ ₷ ︳ ︴ ﹍ ﹎ ﹏ ﹏ ﹩ $ _ ¢ £ ¥ ₩


답변

전체 65k 문자를 반복하고 물어보십시오 Character.isJavaIdentifierStart(c). 대답은 “undertie”10 진수 8255입니다.


답변

올바른 Java 식별자의 명확한 사양은 Java 언어 사양 에서 찾을 수 있습니다 .


답변

다음은 유니 코드로 된 커넥터 문자 목록 입니다. 키보드에서 찾을 수 없습니다.

U + 005F LOW LINE _
U + 203F UNDERTIE ‿
U + 2040 CHARACTER TIE ⁀
U + 2054 INVERTED UNDERTIE ⁔
U + FE33 프리젠 테이션 양식 VERTICAL LOW LINE _ U
+ FE34 프리젠 테이션 양식 VERTICAL Wavy를 LOW LINE ︴
U + FE4D 점선 LOW LINE ﹍
U + FE4E 중심선 LOW LINE ﹎
U + FE4F Wavy를 LOW LINE ﹏
U + FF3F 전각 LOW LINE _


답변

연결 문자는 두 문자를 연결하는 데 사용됩니다.

Java에서 연결 문자는 Character.getType (int codePoint) / Character.getType (char ch)Character.CONNECTOR_PUNCTUATION 과 동일한 값을 리턴하는 문자 입니다.

Java에서 문자 정보는 연결 문자를 일반 카테고리 Pc ( Connector_Punctuation 의 별명)에 지정하여 연결 문자를 식별하는 유니 코드 표준을 기반으로합니다 .

다음 코드 스 니펫

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
    if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
            && Character.isJavaIdentifierStart(i)) {
        System.out.println("character: " + String.valueOf(Character.toChars(i))
                + ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
    }
}

jdk1.6.0_45에서 식별자를 시작하는 데 사용할 수있는 연결 문자를 인쇄합니다.

character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65

다음은 jdk1.6.0_45에서 컴파일됩니다.

int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _,  = 0;

분명히, 위의 선언은 다음 두 개의 연결 문자 (역 호환성 … oops !!!)에 대해 jdk1.7.0_80 및 jdk1.8.0_51에서 컴파일하지 못합니다.

character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65

어쨌든 세부 사항은 제외 하고 시험은 기본 라틴 문자 세트에만 중점을 둡니다 .

또한 Java의 법적 식별자의 경우 사양이 여기 에 제공 됩니다 . 자세한 내용을 보려면 Character 클래스 API를 사용하십시오.


답변

Java 식별자에서 허용되는 가장 재미 있고 재미있는 문자 중 하나는 시작하지는 않지만 “Zero Width Non Joiner”라는 유니 코드 문자입니다 (& zwnj ;, U + 200C, https://en.wikipedia.org / wiki / Zero-width_non-joiner ).

나는 XML의 다른 조각에 대한 참조를 보유하는 속성 값 내부의 XML 조각에서 한 번 이것을 보냈습니다. ZWNJ는 “제로 폭”이므로 볼 수 없습니다 (커서를 따라 걷는 경우를 제외하고는 문자 바로 앞에 표시됩니다). 로그 파일 및 / 또는 콘솔 출력에서도 볼 수 없었습니다. 그러나 그것은 항상 거기에있었습니다 : 검색 필드에 복사하여 붙여 넣기하면 참조 위치를 찾지 못했습니다. 그러나 (보이는 부분) 문자열을 검색 필드에 입력하면 참조 위치가 발견되었습니다. 이것을 알아내는 데 시간이 걸렸습니다.

유럽 ​​키보드 레이아웃을 사용하는 경우 최소한 독일어 변형 (예 : “Europatastatur 2.02”)에서 유럽 키보드 레이아웃을 사용할 때 Zero-Width-Non-Joiner를 입력하는 것은 실제로 매우 쉽습니다 (너무 쉽습니다). 두 개의 키인 AltGr + “.” 불행히도 대부분의 키보드에서 서로 바로 옆에 있으며 실수로 쉽게 맞출 수 있습니다.

Java로 돌아 가기 : 다음과 같은 코드를 작성할 수 있다고 생각했습니다.

void foo() {
    int i = 1;
    int i = 2;
}

두 번째로 너비가 0이 아닌 조이너가 추가되었지만 (위의 코드에서는 스택 오버 플로우 편집기에서 스니핑 할 수 없음) 작동하지 않았습니다. IntelliJ (16.3.3)는 불평하지 않았지만 JavaC (Java 8)는 이미 정의 된 식별자에 대해 불평했습니다 .JavaC는 실제로 ZWNJ 문자를 식별자의 일부로 허용하지만 리플렉션을 사용하여 ZWNJ를 수행 할 때 ZWNJ를 허용합니다 is와 같은 문자가 아닌 문자가 식별자에서 제거됩니다.


답변

식별자 내에서 사용할 수있는 문자 목록은 시작 부분이 아니라 훨씬 더 재미 있습니다.

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");

목록은 다음과 같습니다.

I wanted to post the output, but it's forbidden by the SO spam filter. That's how fun it is!

대부분의 제어 문자가 포함되어 있습니다! 나는 종소리와 똥을 의미합니다! 소스 코드를 fn 종으로 울리게 할 수 있습니다! 또는 부드러운 하이픈처럼 가끔 만 표시되는 문자를 사용하십시오.