8000 동적 바인딩 · Issue #11 · daadaadaah/my-java · GitHub
[go: up one dir, main page]

Skip to content
{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fdaadaadaah%2Fmy-java%2Fissues%2F11","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout\u0026source=header-repo\u0026source_repo=daadaadaah%2Fmy-java","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/daadaadaah/my-java/issues/11\",\"user_id\":null}}","auth_hydro_click_hmac":"2fe433cc3ffd0c6223825634427ec9c5268c557763e48c70c263109cf4d0c8c8"}}

동적 바인딩 #11

Open
Open

Description

@daadaadaah

바인딩

  • 변수에 구체적인 값을 할당하거나 메소드를 호출할 때 그 메소드가 위치한 메모리 주소로 연결하는 과정
  • 프로그래밍에서 바인딩은 값들이 할당되어 변경할 수 없는 상태가 되는 것을 의미한다.
  • 즉, 코드가 메모리 상의 어떤 주소를 참조해야되는 것인지 매핑하는 것이다.

바인딩의 종류

  • 변수의 값이나 메소드를 호출할 메모리 주소 결정 시기에 따라 정적 바인딩/동적 바인딩으로 구분한다.

  • 종류 1. 정적 바인딩 : 컴파일러에 의해 컴파일 타임에 결정

    • java 관점에서 자바 컴파일러에 의해 자바 소스 파일(.java)을 자바 바이트 코드(.class)로 변환되는 시점에 바인딩 되는 것이 정적 바인딩
  • 종류 2. 동적 바인딩 : 런타임에 결정

    • java 관점에서 자바 바이트 코드(.class)가 JVM에 올라가서 Class Loader가 Runtime Data Area에 적재시키는 시점에 바인딩되는 것

정적 바인딩

  • Static Binding(정적 바인딩)은 컴파일 시점에 이미 확정된 바인딩을 의미한다.
  • static, private, final 키워드 등을 가진 변수나 메소드 등이 컴파일 시점이 확정된다.
  • Static Binding이 적용되는 값들은 런타임 시점에 바인딩이 될 이유가 없기 때문에 컴파일 시점에 바인딩된다.
  • 왜냐하면, 이런 키워드는 그 값이 사용된 시점에서 고정되어 런타임 시점 이후에 변하지 않기 때문에 컴파일 시점에 바인딩하여 처리할 수 있다.
  • static의 경우 main 메소드 실행과 동시에 메모리에 올라가고, private는 다른 곳에서 참조할 수 없다. 그리고 final은 초기화 이후에 값이 변할 수 없기 때문에 컴파일 단계에서 바인딩한다.
  • 성능 상으로도 컴파일 시점에 바인딩을 끝내는 것이 유리하다.

동적 바인딩

  • Dynamic Binding(동적 바인딩)은 런타임 시점에 바인딩된 것을 말한다.
  • Java에서 객체는 런타임 시점에 바인딩되는데 어찌보면 이것은 당연한 이유라 할 수 있다. 왜냐면 객체는 런타임 시에 메모리에 로드되기 때문에 런타임 시점에서 바인딩이 되는 것이다.
  • 메모리에 객체가 로드 되면 객체 안의 가상 테이블안의 정의 된 주소를 토대로 바인딩 되는 것이고, 이것을 동적 바인딩이라 부른다.
  • Method Overriding을 예로 들수 있는데, 부모클래스와 자식클래스에 같은 메소드가 존재할때 런타임 시점에 값이 바인딩된다. 이유는 컴파일 시점에 어떤 메소드를 참조해야할지 알 수가 없기 때문이다.
  • Java에서 객체는 객체 데이터 저장을 위한 메모리 외에 테이블 주소를 저장하기 위한 메모리 4byte를 추가로 할당받는다.
  • 이 가상 테이블은 클래스에 대한 정보(자신의 클래스 정보, 상속받은 부모 클래스 정보)를 저장한 테이블이다.
  • 오버라이딩을 통해 메소드를 재정의 했을 때, 가상테이블에서 부모 클래스의 메소드 주소를 재정의한 메서드 주소로 매핑된다. 부모타입에 자식객체를 초기화하고 메소드를 호출하면 오버라이딩된 메소드가 호출되는 이유가 바로 이것이다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0