일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- mapstruct
- 몰입학습 #몰입
- 에러해결
- 사용자계정 #WSL2
- Java환경
- 코드스테이츠 #
- 코드스테이츠 #회고록
- 코딩테스트
- OOP
- WSL #Linux #ubuntu
- 정리글 작성법
- 네트워크 기초
- 피드백
- Git #회고록
- 회고록_코드스테이츠
- 회고 #주간회고
- 회고
- git #intellij
- 인터넷 #ISP
- 공부방식
- String
- 글 foramt
- 롤중독
- 호스트주소 #Host주소
- jvm
- JAVA기본
- 백엔드로드맵
- WSL2 #권한
- 시작 #꾸준히 #과하지않게
- 회고록
- Today
- Total
느리더라도 꾸준히
[JVM]정적 바인딩과 동적 바인딩 본문
목표
static 을 공부하다보니, 정적바인딩과 동적 바인딩이란 개념을 알게되었다. 이 둘을 확실하게 구분하고 이해하자.
본문
바인딩 이란?
컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것. 프로그램 내에서 변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자(identifier)가 그 대상인 메모리 주소, 데이터형 또는 실제값으로 배정되는 것이 이에 해당되며, 원시 프로그램의 컴파일링 또는 링크 시에 확정되는 바인딩을 정적 바인딩(static binding) 이라 하고, 프로그램의 실행되는 과정에서 바인딩되는 것을 동적 바인딩(dynamic binding) 이라고 한다. 프로그래밍에서는 바인딩을 가급적 뒤로 미루도록 권고하고 있다.
[네이버 지식백과] [binding] (IT용어사전, 한국정보통신기술협회)
네이버 사전에서는 위와 같이 말하고 있다. 조금 더 쉽게 표현하자면 아래와 같다.
" Association of method call to the method body "
- 메서드 호출과 메서드 본문의 연결
Static Binding
정의
컴파일러에 의해 컴파일시점에 바인딩이 완료 되면 Static Binding 이라고 부른다.
static, private and final 이 붙은 메서드 들은 모두 컴파일 시점에 바인딩 된다.
왜일까?
위의 제어자가 붙은 메서드들은 Overriding이 될 수 없는 상태 이다.
그러므로 컴파일 시점에 메서드가 클래스 영역에서 바인딩 된다.
예시
class Human{
public static void walk()
{
System.out.println("Human walks");
}
}
class Boy extends Human{
public static void walk(){
System.out.println("Boy walks");
}
public static void main( String args[]) {
/* Reference is of Human type and object is
* Boy type
*/
Human obj = new Boy();
/* Reference is of HUman type and object is
* of Human type.
*/
Human obj2 = new Human();
obj.walk();
obj2.walk();
}
}
/* 출력 결과
Human walks
Human walks
*/
walk()는 static 메서드이며, 하위 클래스인 Boy 인스턴스를 상위 클래스인 Human 타입으로 선언한 참조변수에 할당했을시 오버라이딩 될수 없기때문에, "Human walks" 이 출력 되는 모습을 볼 수 있다.
Dynamic Binding
정의
컴파일 시점에 호출/바인딩 되지 않는 경우를 제외하면 모두 동적 바인딩 이라고 부른다.
메서드 오버라이딩은 프로그램이 실행되는 런타임 시점 메서드가 실행될때 동작한다.
- 오버라이딩은 상위, 하위클래스가 같은 메서드를 가지고 있을때, 해당 메서드를 재정의 하는 것을 말한다.
그러므로 대표적인 동적 바인딩의 예시라고 볼 수 있다.
예시
class Human{
//Overridden Method
public void walk()
{
System.out.println("Human walks");
}
}
class Demo extends Human{
//Overriding Method
public void walk(){
System.out.println("Boy walks");
}
public static void main( String args[]) {
/* Reference is of Human type and object is
* Boy type
*/
Human obj = new Demo();
/* Reference is of HUman type and object is
* of Human type.
*/
Human obj2 = new Human();
obj.walk();
obj2.walk();
}
}
/*
Boy walks
Human walks
*/
obj는 하위 클래스의 인스턴스를 상위 클래스의 타입에 할당하고 있다.(이는 다형성의 참조변환 가능한 것이다.) 그 출력 결과는 메서드 오버라이딩으로 인해 walk()가 재정의 되어 "Boy walks"가 출력되고 있다.
오버라이딩의 정확한 동작 방식은 알지 못하겠지만, 추상적으로 생각해보자.
Runtime 시점에는 객체의 타입이 결정 된다. 그러므로 재정의된 메서드가 있는 경우, JVM이 참조변수의 타입이 아닌 객체의 타입에 존재하는 메서드를 호출해 오는 것이다. 그러므로 객체의 타입인 하위클래스의 메서드가 호출된다.
Static Binding vs Dynamic Binding
- 정적 바인딩은 컴파이 시점에 동적 바인딩은 런타임 시점에 일어난다.
- private, static and final methods의 제어자를 가진 메서드들은 오버라이딩 될수 없다. 그러므로 정적 바인딩이 일어난다.
- 반대로 private, static and final methods 제어자를 가지지 않는 메서드들은 오버라이딩이 될수 있으므로, 오버라이딩을 통해 동적 바인딩이 일어날 수 있다.
- Overloading 된 메서드들은 정적 바인딩을 Overriding된 메서드는 동적 바인딩으로 동작한다.
- Overloading은 컴파일 과정에서 매개변수의 개수와 타입으로 어떤 메서드를 호출할지 결정하기 때문에 정적 바인딩으로 동작한다.
출처
'Java' 카테고리의 다른 글
[OOP]객체 지향 프로그래밍(OOP) - (1) 상속 (0) | 2022.11.16 |
---|---|
[Java기본]가상 함수(메서드)란? (0) | 2022.11.15 |
[OOP]캡슐화에 대해서 세부적으로 알아보자. (0) | 2022.11.08 |
[Java기본]static 메서드는 왜 필요할까? (0) | 2022.11.06 |
[JVM]변수 선언과 할당시 관점으로 JVM 동작 이해하기 (0) | 2022.11.04 |