본문 바로가기
캠퍼스/Java

40. 동적 바인딩 (2)

by Sylar 2022. 8. 4.

 

해당 코드의 출력은 어떻게 될까?

 

햄버거를 포인팅 하고 더블치즈햄버거를 불렀다.

 

현재 heap 에는 햄버거와 더블치즈햄버거가 같이 떠있다.

 

s.name을 출력한 값은 햄버거가 나오고 s.getName을 출력한 값에는 더블치즈햄버거가 나올것이다.

 

왜냐? s.name은 name이라는 변수를 부른거고 s.getName은 스트링 타입의 메서드를 부른 것이기 때문에 

 

부모의 메서드는 무효화 되고 자식의 s.getName메서드를 부를것이다.

 

예측이 맞았다.

 

그럼 이런 문제는 어떻게 해결할까?

 

package ex10;

class 라면 {
   String getName() {return "";}
   int getPrice() {return 0;}
   void setPrice(int price) {}
}

class 삼양라면 extends 라면{
   String name = "삼양라면";
   int price = 1000;
}

class 신라면 extends 라면{
   String name = "신라면";
   int price = 1500;
}


public class Extends05 {
   
   static void print(라면 lamun) {
      System.out.println(lamun.getName());
      System.out.println(lamun.getPrice());
      lamun.setPrice(3000);
      System.out.println(lamun.getPrice());
   }

   public static void main(String[] args) {
      삼양라면 samyang = new 삼양라면();
      신라면 sin = new 신라면();
      
      print(samyang);
      print(sin);
   }

}

 

해당값을 출력하면 아무것도 나오지 않는다.

 

해당 코드를 분석해보면 라면이라는 클래스가 삼양라면,신라면을 자식 클래스로 두고있고

 

라면 클래스에는 빈값, 삼양라면과 신라면에는 이름과 가격이 적혀있다.

 

static에 떠있는 print 메서드는 이름과 가격을 불러오고 가격을 3000으로 바꾼다음 다시 출력시킨다는 뜻으로 보이고

 

main에는 삼양라면과 신라면을 호출하여 print메서드를 실행시킨다.

 

하지만 print를하면 이름은 출력하지 않고 가격은0을 출력할 뿐이다.

 

왜그럴까? 

 

바로 주소가 지정되지 않았기 때문이다.

 

햄버거와 더블치즈버거 때 처럼 메서드 들을 자식에게 모두 똑같이 적어주자.

 

package ex10;

class 라면 {
   String getName() {return "";}
   int getPrice() {return 0;}
   void setPrice(int price) {}
}

class 삼양라면 extends 라면{
   String name = "삼양라면";
   int price = 1000;
   String getName() {return name;}
   int getPrice() {return price;}
   void setPrice(int price) {}
}

class 신라면 extends 라면{
   String name = "신라면";
   int price = 1500;
   String getName() {return name;}
   int getPrice() {return price;}
   void setPrice(int price) {}
}

 

저렇게 바꾸고 출력시키면 값이 어떻게 나올까?

 

 

정확하게 불러오긴 하였으나 가격에 변동이 없다.

 

즉 setPrice의 값을 입력받지 못한 것이다.

 

왜 그럴까? 

 

바로 void setPrice(int price) 의 내부에 받아줄 수 있는 코드가 안적혀있기 때문이다.

 

그럼 저 3000이라는 값을 어떻게 받아 낼 수 있을까?

 

바로 this를 이용하는 것이다.

 

this.price = price 를 설명하자면

 

price는 print 메서드에서 3000값을 받아서 저장 하고 그 값을 this.price에 대입시킨다.

 

그럼 3000의 값을 삼양라면의 price에 대입 시킬 수 있다는 소리다.

 

 

수정한 삼양라면은 값을 받아냈지만, 신라면은 받아내지 못하였다.

 

 

 

 

'캠퍼스 > Java' 카테고리의 다른 글

42. 컨버팅  (0) 2022.08.06
41. 동적 바인딩 (3)  (0) 2022.08.04
39.동적 바인딩 (1)  (0) 2022.08.04
38.상속  (0) 2022.08.03
37. 오버로딩  (0) 2022.08.02