programing tip

Java에서 "표준 형식"또는 "표준 표현"이라는 용어는 무엇을 의미합니까?

itbloger 2020. 10. 7. 07:26
반응형

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()메소드) 과 반대로 참조 ID (==)를 가진 값 .

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

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


"표준 형식 / 표현"을 이해하기위한 좋은 예는 "부울"의 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)있는 메소드 호출하고 오버 헤드 포함한다.


Another good example might be: you have a class that supports the use of cartesian (x, y, z), spherical (r, theta, phi) and cylindrical coordinates (r, phi, z). For purposes of establishing equality (equals method), you would probably want to convert all representations to one "canonical" representation of your choosing, e.g. spherical coordinates. (Or maybe you would want to do this in general - i.e. use one internal representation.) I am not an expert, but this did occur to me as maybe a good concrete example.


canonical representation means view the character in different style for example if I write a letter A means another person may write the letter A in different style:)

This is according to OPTICAL CHARACTER RECOGNITION FIELD


A canonical form means a naturally unique representation of the element


The OP's questions about canonical form and how it can improve performance of the equals method can both be answered by extending the example provided in Effective Java.

Consider the following class:

public final class CaseInsensitiveString {

  private final String s;

  public CaseInsensitiveString(String s) {
    this.s = Objects.requireNonNull(s);
  }

  @Override 
  public boolean equals(Object o) {
    return o instanceof CaseInsensitiveString && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
  }
}

The equals method in this example has added cost by using String's equalsIgnoreCase method. As mentioned in the text

you may want to store a canonical form of the field so the equals method can do a cheap exact comparison on canonical forms rather than a more costly nonstandard comparison.

What does Joshua Bloch mean when he says canonical form? Well, I think Dónal's concise answer is very appropriate. We can store the underlying String field in the CaseInsensitiveString example in a standard way, perhaps the uppercase form of the String. Now, you can reference this canonical form of the CaseInsensitiveString, its uppercase variant, and perform cheap evaluations in your equals and hashcode methods.

참고URL : https://stackoverflow.com/questions/280107/what-does-the-term-canonical-form-or-canonical-representation-in-java-mean

반응형