Java Module 동적 바인딩

4372 단어
카탈로그
  • Java 멀티태스킹 동적 바인딩
  • 인용 변수의 유형
  • 컴파일링 시 유형
  • 런타임 유형
  • 방법 귀속
  • 정적 바인딩
  • 동적 귀속
  • 방법표


  • Java Module 동적 바인딩


    상편 회고: 다중태는 대상을 대상으로 하는 프로그램 설계의 매우 중요한 특성으로 프로그램이 더욱 좋은 가독성과 확장성을 가지도록 한다.
  • 상속 관계에서 발생한다.
  • 부류를 다시 쓰는 방법이 필요합니다.
  • 부류 유형의 인용은 부류 유형의 대상을 가리킨다.처음부터 끝까지 다태는 모두 방법에 대해 말하자면 클래스의 구성원 변수에 대해 다태적인 견해가 없다.상편에서 말한 바와 같이 하나의 기본 클래스의 인용 변수가 서로 다른 하위 클래스를 수신하는 대상은 하위 클래스에 대응하는 방법을 호출하는데 이것은 사실 동적 귀속 과정이다.동적 귀속을 이해하기 전에 먼저 개념을 보충한다.

  • 참조 변수 유형


    인용 형식의 변수는 두 가지 종류가 있는데 그것이 바로 컴파일할 때와 실행할 때이다.(성명 유형과 실제 유형이라고도 부른다) 간단한 예를 들자.
    // Student Person 
    Person p = new Student();

    컴파일 시 유형

  • 도 성명 유형이라고 하는데 성명 변수를 성명할 때의 유형에 의해 결정된다.
  • 상식Person은 변수 p를 인용하는 컴파일링 시 유형이다.

  • 런타임 유형

  • 도 실제 유형이라고 하는데 대상을 가리키는 실제 유형에 의해 결정된다.
  • 상식Student은 인용 변수 p의 운행 시 유형이다.

  • 방법 바인딩


    방법을 같은 방법의 주체와 연결시키는 것을 귀속이라고 한다.

    정적 바인딩


    프로그램이 실행되기 전에 귀속을 하는 것을 정적 귀속이라고 하고 전기 귀속이라고도 한다.프로세스를 위한 언어에서는 기본 귀속 방식입니다.
    자바에서 private, static,final로 수식하는 방법 (static와final은 다음에 정리할 것) 이나 구조기가 컴파일러에게 어떤 방법을 호출할 수 있는지 정확하게 할 수 있는 것은 정적 연결 (static binding) 이다.

    동적 바인딩


    실행할 때 대상의 운행 시 유형에 따라 귀속을 하는데 동적 귀속이라고 하고 후기 귀속이라고도 한다.물론 자바에서 정적 귀속 방법을 제외하고 다른 방법의 호출 방식은 동적 귀속이다.
    public class DynamicBinding {
        //Object , , 
        public static void test(Object x) {
            System.out.println(x.toString());
        }
    
        public static void main(String[] args) {
            test(new PrimaryStudent());//Student
            test(new Student());//Student
            test(new Person());//Person
            test(new Object());//java.lang.Object@1b6d3586
        }
    }
    
    class Person extends Object {
        @Override
        public String toString() {
            return "Person";
        }
        public void run(){}
        public void count(int a){}
    }
    
    class Student extends Person {
        @Override
        public String toString() {
            return "Student";
        }
        public void jump(){}
    }
    
    class PrimaryStudent extends Student {
    }
  • 네 문장 호출 방법의 문장 중의 형상은 모두 Object이다.주의: 인용 변수는 컴파일할 때 형식이 가지고 있는 방법만 호출할 수 있습니다.
  • 실행할 때 종류가 다르기 때문에 실행기가 실행될 때 종류별로 다시 쓰는 방법을 설명합니다.
  • 같은 유형의 인용 변수는 같은 방법을 호출할 때 서로 다른 행위 특징을 나타낸다. 이것이 바로 다태적 가장 직관적인 표현이다.

  • 방법표


    우리는 test(new PrimaryStudent());의 운행 결과Student도 발견할 수 있다. 결과는 매우 뚜렷하다. PrimaryStudent클래스에 부류를 다시 쓰는 방법이 없기 때문이다. 만약에 동적 귀속 방식으로 호출하는 방법을 사용한다면 가상 기회는 우선 이 클래스에서 적합한 방법을 찾고 없으면 부류로 찾을 때까지 계속 찾을 것이다.
    그러면 매번 호출할 때마다 위로 찾아야 하기 때문에 시간적 비용이 많이 들 수밖에 없다.이 가상 기기는 모든 클래스에 방법표를 만들었는데 그 중에서 모든 방법 서명(반환값 유형은 포함되지 않음)과 실제 호출 방법을 열거했다. 그러면 호출 방법에 대해 직접 표를 찾으면 된다.(특히 슈퍼로 부류를 한정적으로 호출하면 실제 부류의 표에서 직접 찾을 수 있다)
  • 다음은 Person류의 방법표:
  • Person:
        // Object 
        //xxx()-> Object.xxx()
        // -> 
        toString()->Person.toString()
        run()->Person.run()
        count(int)->Person(int)
  • 다음은 Student류의 방법표:
  • Student:
        // Object 
        //xxx()-> Object.xxx()
        // -> 
        toString()->Student.toString()
        jump()->Student.jump()
        run()->Person.run()
        count(int)->Person(int)
  • 다음은 PrimaryStudent류의 방법표(PrimaryStudent류는 공, 직접 계승Student류):
  • PrimaryStudentt:
        // Object 
        //xxx()-> Object.xxx()
        // -> 
        toString()->Student.toString()
        jump()->Student.jump()
        run()->Person.run()
        count(int)->Person(int)
  • 따라서 test(new PrimaryStudent()); 문장을 실행할 때 가상 컴퓨터는 PrimaryStudent의 방법표를 추출할 것이다.
  • 가상 컴퓨터는 표에서 정의toString가 서명한 클래스를 검색할 것이다.이때 가상 컴퓨터는 Student 유형의 toString() 방법을 호출해야 한다는 것을 이미 알고 있었다.
  • 마지막으로 호출 방법, 완료.

  • 동적 귀속은 프로그램의 확장성을 크게 향상시켰다. 예를 들어 나는 지금 Teacher클래스를 추가하려고 한다. Teacher클래스를 Person클래스에 직접 계승하고 Object클래스의 인용 지향Teacher 대상을 사용하려고 한다. 다른 코드 조정을 하지 않아도 동적 귀속이 자동으로 해결되면 상당히 편안하다.
    참고서적: Thinking in Java, Java 핵심 기술 볼륨 I

    좋은 웹페이지 즐겨찾기