정적바인딩과 동적바인딩

서현서현·2023년 8월 6일
0

JAVA

목록 보기
22/27

Polymorphism(다형성)

다형성을 공부하고있었다,,,
다형성이란? 상속관계에서 조상클래스 타입으로 자식클래스 객체를 정의하는것
즉 다음과 같다

Idol aespa = new Aespa();

위와같이 형변환을 할 경우, 접근할 수 있는 내용이 달라진다.

어떻게?

참조형 객체의 형변환

| 하위타입을 상위타입으로 형변환 할 경우 (묵시적 캐스팅)

Idol aespa = new Aespa();

자손타입을 조상타입으로 참조 할 경우 형변환 생략이 가능하다.

| 상위타입을 하위타입으로 형변환 할 경우 (명시적 캐스팅)

Idol aespa = new Aespa();
Aespa aespa2 = (Aespa)aespa;

조상타입을 자손타입으로 참조할경우 형 변환 생략이 불가능하다.
또한 조상은 무작정 자손으로 바꿀 수 없다. 위처럼 조상타입으로 형변환 됐던 자손타입의 경우에나 가능하다...

그럼 이제 문제는 이렇게 형변환 했을때 내가 사용할 수 있는 멤버는 대체 누구의 멤버일까? 이다. 이때 정적바인딩과 동적바인딩이 등장한다.

정적바인딩

  • 컴파일 단계에서 참조변수의 타입에 따라 연결이 달라짐
  • 상속관계에서 객체의 멤버변수(static/instance)가 중복될 때 또는 static method

동적바인딩

  • 다형성을 이용해서 메소드 호출이 발생할 때 런타임에 메모리의 실제 객체의 타입으로 결정
  • 상속관계에서 객체의 instance method가 재정의 되었을때 마지막에 재정의 된 자식클래스의 메소드가 호출됨 (최대한 메모리에 생성된 실제 객체에 최적화된 메소드가 동작한다)
class Parent {
	private int id;
    protected int name;
    public void test(){
    	System.out.println("부모메소드");
    }
}

class Child extends Parent {
	private int id;
    protected int name;
    public void test(){
    	System.out.println("자식메소드");
    }
}

class Main{
	Parent p = new Child();
    p.id //private이라 불가능함
    p.name //부모메소드의 name 실행
    p.test(); //자식메소드의 test()실행 - 동적바인딩
}

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기