바인딩이란 ?
실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것
| 정적 바인딩 | 동적 바인딩 |
| 프로그램이 실행되기 전 컴파일 단계에서 메소드와 메소드 호출부를 연결 |
프 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것 |
※동적 바인딩 성립 조건
상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행
업캐스팅 상태에서는 오버라이딩한 메서드가 우선권을 갖는다


#예제
[Parent]
package pkg1.dto;
public class Parent {
// 필드
private String lastName = "김";
private int money = 50000;
// 기본 생성자
public Parent() {
super(); // 부모(Object) 생성자 호출
}
// 매개 변수 생성자
public Parent(String lastName, int money) {
super();
this.lastName = lastName;
this.money = money;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
// toString() 오버라이딩
@Override
public String toString() {
return "Parent : " + lastName + "/" + money;
}
}
[Child]
package pkg1.dto;
// Parent 상속
public class Child extends Parent {
private String car;
public Child() {
super(); // 안쓰면 컴파이러가 추가해줌 !!
}
// 자식 객체 생성 시
// 자식 + 부모 필드 한번에 초기화
public Child(String lastName, int money, String car) {
super(lastName, money);
this.car = car;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
// Parent의 toStrint() 오버라이딩 하기
@Override
public String toString() {
return "Child : " + getLastName() + "/"
+ getMoney() + "/"
+car;
}
}
[Service]
public void test3() {
Parent p1 = new Parent(); // 부모 = 부모
Child c2 = new Child(); // 자식 = 자식
Parent p3 = new Child(); // 부모 = 자식 (업캐스팅)
System.out.println(p1.toString()); // Parent.toString
System.out.println(c2.toString()); // Child.toString()
System.out.println(p3.toString());
}
정적 바인딩 : 프로그램 실행 "전"
Parent.toString()과 연결됨
-> 왜 Parent와 연결 되었는가?
참조 변수가 Parent 타입이라 업 캐스팅 적용
동적 바인딩 : 프로그램 실행 "중"
toString() 호출 구문이 Parent에서 Child로 변경되어짐!!
-> 왜?
Child가 Parent의 toString()을
오버라이딩을 하였기 때문에'
우선권을 갖게 됨
* 업 캐스팅 상태에서는 오버라이딩한 메서드가 우선권을 갖는다!!
#결과

<객체 배열의 다형성 + 바인딩 예제>
[Service]
public void test4() {
Object[] arr = new Object[4];
// 참조 변수 타입 == Object
// 대입되는 객체 주소 == Parent, Child(자식 타입)
// -> 업 캐스팅이 적용된 상태!!
arr[0] = new Parent();
arr[1] = new Parent("이", 30000);
arr[2] = new Child();
arr[3] = new Child("박", 60000, "캐스퍼");
for(Object obj : arr) {
System.out.println(obj.toString());
// 실행 전 : Object.toString() 연결 (정적 바인딩)
// 실행 중 :
// Parent.toString()
// Child.toString() 연결 (동적 바인딩)
// print() 관련 구문에
// 참조 변수명을 작성하면
// 자동으로 toString() 메서드를 호출
}
System.out.println("-------------------------------------");
System.out.println("[만약 동적 바인딩이 없었더라면...]");
for(Object obj : arr) {
if(obj instanceof Child) {
System.out.println( ((Child)obj).toString());
}
else if (obj instanceof Parent) {
System.out.println( ((Parent)obj).toString());
}
else {
System.out.println(obj.toString());
}
}
}
#결과

'BackEnd > Java' 카테고리의 다른 글
| [Java]상속(Inheritance) 오버라이딩 (0) | 2024.07.31 |
|---|---|
| [Java]상속(Inheritance) (0) | 2024.07.31 |
| [Java]반환형의 다형성(Polymorphism) (0) | 2024.07.30 |
| [Java]매개 변수의 다형성 (Polymorphism) (0) | 2024.07.30 |
| [Java]OOP 메서드(method) (0) | 2024.07.25 |