BackEnd/Java

[Java]다형성(Polymorphism) 바인딩

Hojung7 2024. 7. 31. 06:16

바인딩이란 ?

실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것

 

정적 바인딩 동적 바인딩
프로그램이 실행되기 전 컴파일 단계에서

 메소드와 메소드 호출부를 연결
프 정적 바인딩된 메소드를 

실행할 당시의 객체 타입을 기준으로 바인딩 되는 것

 

※동적 바인딩 성립 조건

상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행

업캐스팅 상태에서는 오버라이딩한 메서드가 우선권을 갖는다

 

#예제

[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