[java] Java에서 “표준 형식”또는 “표준 표현”이라는 용어는 무엇을 의미합니까?

이 용어가 사용되는 것을 자주 들었지만 실제로 이해하지 못했습니다.

그것은 무엇을 의미하며 누구든지 몇 가지 예를 제공하거나 링크를 가리킬 수 있습니까?

편집 : 답장을 보내 주신 모든 분들께 감사드립니다. 효과적인 Java에 명시된 것처럼 표준 표현이 equals () 성능에서 어떻게 유용한 지 말해 줄 수 있습니까?



답변

Wikipedia는 Canonicalization 이라는 용어를 가리 킵니다 .

둘 이상의 가능한 표현이있는 데이터를 “표준”표준 표현으로 변환하는 프로세스입니다. 이는 등가성에 대해 서로 다른 표현을 비교하고, 고유 한 데이터 구조의 수를 계산하고, 반복되는 계산을 제거하여 다양한 알고리즘의 효율성을 개선하거나, 의미있는 정렬 순서를 부과 할 수 있도록하기 위해 수행 될 수 있습니다.

유니 코드 예는 나에게 가장 적합한을했다 :

유니 코드 표준의 가변 길이 인코딩, 특히 UTF-8에는 가장 일반적인 문자에 대해 둘 이상의 가능한 인코딩이 있습니다. 각 문자열 문자의 가능한 모든 인코딩을 고려해야하기 때문에 문자열 유효성 검사가 더 복잡해집니다. 모든 문자 인코딩을 고려하지 않는 소프트웨어 구현은 응용 프로그램 설계에서 유효하지 않은 것으로 간주되는 문자열을 받아 들일 위험이 있으며, 이로 인해 버그가 발생하거나 공격이 허용 될 수 있습니다. 해결책은 각 문자에 대해 단일 인코딩을 허용하는 것입니다. 그런 다음 정규화는 모든 문자열 문자를 허용 된 단일 인코딩으로 변환하는 프로세스입니다. 대안은 소프트웨어가 문자열이 정규화되었는지 확인한 다음 그렇지 않은 경우 거부하는 것입니다. 이 경우 클라이언트 / 서버 컨텍스트에서 정규화는 클라이언트의 책임입니다.

요약하면 데이터에 대한 표준 표현 형식입니다. 이 양식에서 필요한 표현으로 변환 할 수 있습니다.


답변

나는 표준의 두 가지 관련 용도가 있다고 생각합니다 : 양식과 인스턴스.

정규형의 자원의 특정 유형의 값에 대해서 설명하거나 여러 가지 방법으로 표현하고, 그 방법 중 하나가 선호 정준 형태로 선택 될 수 있다는 것을 의미한다. (그 형태가되어 시성 성경에 그것을 만든 책처럼, 그리고 다른 형태가되지 않습니다.) 정규 형태의 전형적인 예는 하나의 파일을 여러 가지 방법으로 참조 할 수있는 계층 적 파일 시스템의 경로입니다 :

myFile.txt                                   # in current working dir
../conf/myFile.txt                           # relative to the CWD
/apps/tomcat/conf/myFile.txt                 # absolute path using symbolic links
/u1/local/apps/tomcat-5.5.1/conf/myFile.txt  # absolute path with no symlinks

해당 파일의 표준 표현에 대한 고전적인 정의가 마지막 경로가됩니다. 로컬 또는 상대 경로를 사용하면 컨텍스트 정보없이 리소스를 전역 적으로 식별 할 수 없습니다. 절대 경로를 사용하면 리소스를 식별 할 수 있지만 두 경로가 동일한 엔티티를 참조하는지 여부는 알 수 없습니다. 둘 이상의 경로를 표준 형식으로 변환하면 위의 모든 작업을 수행 할 수 있으며 두 리소스가 동일한 지 여부를 확인할 수 있습니다 (애플리케이션에 중요한 경우) ( 앨리어싱 문제 해결 ).

리소스의 표준 형식은 특정 형식 자체의 품질이 아닙니다. 파일 경로와 같은 주어진 유형에 대해 여러 가능한 표준 형식이있을 수 있습니다 (예 : 가능한 모든 절대 경로 중에서 사전 순으로 먼저). 하나의 양식은 특정 응용 프로그램 이유로 표준 양식으로 선택되거나 모든 사람이 동일한 언어를 사용하도록 임의로 선택됩니다.

객체를 표준 인스턴스 로 강제 하는 것은 동일한 기본 아이디어이지만 리소스의 “최상의”표현을 결정하는 대신 표준 참조와 동일한 “내용”을 가진 인스턴스 클래스의 인스턴스 하나를 임의로 선택한 다음 모든 참조를 변환합니다. 하나의 표준 인스턴스를 사용하는 등가 개체에.

이것은 시간과 공간을 최적화하기위한 기술로 사용할 수 있습니다. 응용 프로그램에 동일한 객체의 여러 인스턴스가있는 경우 모든 인스턴스가 특정 값의 단일 표준 인스턴스로 확인되도록 강제하여 각 값 중 하나를 제외하고 모두 제거 할 수 있으므로 이제 비교할 수 있으므로 공간과 시간을 절약 할 수 있습니다. 객체 동등성 ( equals()method) 과 반대로 참조 ID (==)를 가진 값 .

표준 인스턴스로 성능을 최적화하는 고전적인 예는 동일한 콘텐츠가있는 문자열을 축소하는 것입니다. String.intern()동일한 문자 시퀀스를 가진 두 문자열을 호출 하면 해당 텍스트에 대해 동일한 표준 String 객체를 반환합니다. 해당 캐 노니 컬 라이저를 통해 모든 문자열을 전달하면 동등한 문자열이 실제로 동일한 객체 참조, 즉 별칭임을 알 수 있습니다.

Java 5.0+의 열거 형 유형은 값이 직렬화되고 역 직렬화되는 경우에도 특정 열거 형 값의 모든 인스턴스가 VM 내에서 동일한 표준 인스턴스를 사용하도록합니다. 이것이 enum 유형 인 if (day == Days.SUNDAY)경우 java에서 impunity와 함께 사용할 수있는 이유 Days입니다. 자신의 수업을 위해 이것을하는 것은 확실히 가능하지만주의를 기울입니다. 읽기 효과적인 자바 정보와 조언을 조쉬 블로흐을.


답변

“표준 형식 / 표현”을 이해하는 좋은 예는 “부울”의 XML 스키마 데이터 유형 정의를 살펴 보는 것입니다.

  • 부울의 “어휘 표현은”중 하나가 될 수 {true, false, 1, 0}있는 반면
  • “표준 표현”은 다음 중 하나 일 수 있습니다. {true, false}

이것은 본질적으로

  • "true"그리고 "1"정식에 repr에 매핑 얻을. "true"
  • "false""0"canoncial에 repr에 매핑 얻을."false"

부울에 대한 w3 XML 스키마 데이터 유형 정의 참조


답변

“canonical”이라는 단어는 “standard”또는 “usual”의 동의어입니다. Java 고유의 ​​의미가 없습니다.


답변

일반성을 잃지 않고 가장 단순하고 중요한 형태로 축소


답변

그것을 기억하는 쉬운 방법은 신학계에서 “정경 적”이 사용되는 방식이고, 정경 적 진리는 진짜 진리이므로 두 사람이 그것을 발견하면 같은 진리를 찾은 것입니다. 표준 인스턴스와 동일합니다. 두 개 (예 :)를 찾았다 고 생각하면 a.equals(b)실제로는 한 개 (예 🙂 만 있습니다 a == b. 따라서 평등은 표준 객체의 경우 정체성을 의미합니다.

이제 비교를 위해. 이제 a==b or 를 사용할 수 있습니다. a.equals(b)표준 인스턴스의 경우 동일한 답변을 생성하지만 a == b는 참조의 비교입니다 (JVM은 두 개의 32 비트 패턴이 비교됨에 따라 매우 빠르게 비교할 수 있습니다. 에 a.equals(b)있는 메소드 호출하고 오버 헤드 포함한다.


답변

또 다른 좋은 예는 다음과 같습니다 : 데카르트 (x, y, z), 구형 (r, theta, phi) 및 원통형 좌표 (r, phi, z)의 사용을 지원하는 클래스가 있습니다. 동등성을 설정하기 위해 (equals 방법) 모든 표현을 선택한 하나의 “표준”표현 (예 : 구형 좌표)으로 변환 할 수 있습니다. (또는 일반적으로이 작업을 수행하고 싶을 수도 있습니다. 즉, 하나의 내부 표현을 사용합니다.) 저는 전문가는 아니지만 좋은 구체적인 예로서 제게 발생했습니다.