3개의 클래스가 정의 되어 있습니다.












BigRib
클래스와 CheeseBurger클래스,BurgerOrder클래스입니다.

 

package burger;

public class BigRibBurger {

             int price;

             public BigRibBurger(int price) {

                           this.price = price;

             }

             int getPrice() {

                           return price;

             }

}

예제 2 - 19 BigRibBurger.java

 

package burger;

public class CheeseBurger {

             int price;

             public CheeseBurger(int price) {

                           this.price = price;

             }

}

예제 2 - 20 CheeseBurger.java

 

package burger;

public class BurgerOrder {

             public static void main(String[] args) {

                           CheeseBurger c = new CheeseBurger(1400);   // 치즈버거

                           BigRibBurger b = new BigRibBurger(2500);       // BigRib버거 생성자 호출

                           System.out.println(“CheeseBurger “ + c.price); // 치즈버거 멤버변수 읽기

                           System.out.println(“BigRibBurger “ + b.getPrice());// BigRib버거 멤버메소드 호출

             }

}

예제 2 - 21 BurgerOrder.java

 

3개의 클래스 설계는 3개의 클래스 모두를 burger 패키지에 속하게 했습니다.

이로써 BigRibBurger CheeseBurger BurgerOrder 객체들간에는 특별한 관계가

성립 되었는데 같은 패키지에 속해있다는 관계입니다. 머 별로 대단한 것 같지는 않은

관계입니다만, 앞서 말씀 드렸듯이 같은 패키지에 속해 있다는 것은 논리적으로, 연관관계

가 있고 해당 패키지를 담당하고 있는 조직이 동일한 경우가 대부분이므로 이런 관점에서

본다면 특별하다고 해야겠습니다.

예제 2 - 21 BurgerOrder클래스에서 CheeseBurger클래스의 생성자를 호출하고 있고,

BigRibBurger 의 생성자를 호출하고 있습니다. 예제 2 - 20 CheeseBurger클래스와

예제 2 - 19 BigRibBurger의 생성자는 public 이라는 지정자가 있으므로 얼마든지 호출할

수 있습니다. 당연히 Cheese버거와  BigRib버거가 만들집니다.

다음에는 치즈버거의 가격을 의미하는 변수 price를 직접 참조해서 읽고 있습니다.

c.price 보이시죠?  CheeseBurger클래스의 멤버변수 price앞에는 어떤 지정자도 붙어있지

않습니다. 기본지정자인 셈인데요. 다른말로하면 CheeseBurger클래스를 만든 클래스 설계

자는 CheeseBurger의 멤버변수 price를 읽고,쓰고하는 것을 함부로 못하게 했습니다.

다만 특별한 관계에 있는 객체들은 마음껏 읽고,쓰고 하는 것을 허락했습니다.

그 특별한 관계라고하는 것은 같은 패키지에 속한 객체들입니다. 왜 그렇게 하냐구요?

그건 그 프로그래머가 고의적으로 뚜렷한 이유가 있기 때문입니다.

 

 그림 2 - 5 [ compile run (BurgerOrder) ]

 

예제 2 - 22는 예제 2 - 21의 내용과 꼭 같은 내용을 갖고 있는 클래스입니다.

다만 패키지가 burger 패키지가 아니라 statistic 패키지에 속해 있는 클래스입니다.

 

package statistics;

import burger.*;

public class BurgerStatistics {

             public static void main(String[] args) {

                           CheeseBurger c = new CheeseBurger(1400);   // 치즈버거

                           BigRibBurger b = new BigRibBurger(2500);       // BigRib버거 생성자 호출

                           System.out.println(“CheeseBurger “ + c.price); // 치즈버거 멤버변수 읽기

                           System.out.println(“BigRibBurger “ + b.getPrice());// BigRib버거 멤버메소드 호출

             }

}

예제 2 - 22 BurgerStatistic.java

 

BurgerOrder클래스와 똑 같은 내용을 수행해 보려고 하는데요. 컴파일도 되지 않습니다.

CheeseBurger BigRibBurger는 만들수 있습니다. 왜냐하면 두개의 생성자의 지정자

public 이기 때문입니다. 하지만 CheeseBuger의 멤버변수인 c.price를 참조할 수 없고,

BigRibBurger의 멤버함수인 b.getPrice() 메소드를 호출할 수 없습니다.

왜냐하면 CheeseBurger 객체입장에서 보면 자신과는 아무 관계없는 BurgerStatistics

객체가 자신의 멤버변수 price를 읽으려고 했기 때문이고, BigRibBurger 객체 또한 자신과는

관계없는 BurgerStatistics 객체가 자신의 멤버함수 getPrice()를 호출하려고 하기 때문

입니다.  CheeseBurger 클래스 설계자, BigRib 클래스 설계자는 price 멤버변수,getPrice()

멤버메소드의 지정자를 기본지정자 (패키지 지정자)로 설정해 놓았으므로 statistics 패키지

에 속한 BurgerStatistics객체에서는 CheeseBurgerprice멤버변수를 읽고,쓸수 없으며

BigRib getPrice()멤버함수를 호출할 수 없습니다.

 

그림 2 - 6 [ compile (BurgerStatistics.java) ]

 

Posted by
,