'자바 Study'에 해당되는 글 25건

  1. 2007.11.30 자바공부-12.protected 지정자 3
protected 지정자는 기본지정자와 마찬가지로 특별한 관계가 있는 객체에게는 읽고,쓰고,

호출하게 해주고려고 하는 것입니다.

하지만  이 특별한 관계가 기본지정자처럼 단순하지는 않습니다.

 

자바에서는 상속이라는 개념이 있는데 이것을 언뜻 들리는 의미로 부모와 자식간을 의미

하는 것처럼 생각하면 이해가 쉽지않고, 오히려 수학에서의 집합을 생각 하시는게 이해가

빠를 듯 합니다. 자연수 집합과 정수집합의 관계에서 정수집합은 자연수집합을 포함하는 것

처럼 기본적으로 A 를 상속한 B의 관계는 A는 자연수집합, B는 정수집합의 관계와 같습니다. , B A의 모든 것을 포함하고 있다고 생각하면 되겠습니다.

 

package burger;

public class KidsBurger {

             private int price;

             public KidsBurger(int price) {

                           this.price = price;

             }

             public KidsBurger() {

                           this(1500);

             }

             protected int getPrice() {

                           return price;

             }

}

예제 2 - 25 KidsBurger.java

 

예제 2 - 25 KidsBurger는 멤버변수는 private으로 생성자는 public으로 멤버변수는

protected로 선언했습니다.

KidsBurger설계자의 생각에 따르면 KidsBurger의 생성을 자유롭게 하되, 멤버변수인

price를 직접 읽고,쓰게는 절대 할 수 없으며, KidsBurger와 특별한 관계에 있는

객체에서는 getPrice()메소드를 호출할 수 있도록 해주는 것입니다.

이때 KidsBurger와 특별한 관계에 있고자 한다면 KidsBurger와 상속의 관계에 있어야

합니다.

 

 

그림 2 - 9 [compile (KidsBurger.java)]

 

예제 2 - 26 KidsBurger를 상속한 KidsBurgerSet 입니다.

package burger;

 

public class KidsBurgerSet extends KidsBurger {

             public KidsBurgerSet(int price) {

                           super(price);

             }

             public static void main(String[] args) {

                           KidsBurgerSet b = new KidsBurgerSet(3000);

                           System.out.println("KidsBurgerSet price " + b.getPrice());

//                        System.out.println("KidsBurgerSet price " + b.price); Oops! 컴파일안됨

             }

}

예제 2 - 26 KidsBurgerSet.java

 

KidsBurger클래스와 KidsBurgerSet클래스는 특별한 관계에 있습니다.

KidsBurgerSet클래스가 KidsBurger클래스를 상속했기 때문입니다.

KidsBurgerSet클래스의 선언 부분에 보면      KidsBurgerSet extends KidsBurger 라는 부분이

있는데 이 부분의 의미는 KidsBurgerSet 클래스는 KidsBurger클래스를 상속한다고 선언

하는 것입니다.

KidsBurgetSet클래스는 이 선언으로 서 KidsBurger와 아주 끈끈한 관계가 맺어졌는데

단순히 관계가 맺어진 것 뿐 아니라 KidsBurgerSet 객체가 KidsBurger객체를 내부적으로

갖고 있습니다. , KidsBurgerSet클래스는 KidsBurger클래스에서 정의한 멤버변수,

멤버메소드를 모두 가지고 있는 셈입니다. 다만 눈에 보이지 않는 것 뿐이지요.

 

KidsBurger클래스의 설계자는 멤버변수를 private으로 지정해서 절대로 공개하지 않기로 결정을 했습니다. KidsBurger클래스의 생성자는 public으로 지정해서 어떤 객체에서도

KidsBurger객체를 만들수 있도록 배려했고, 가격의 정보를 알려주는 멤버 메소드는

protected로 선언해서 아주 특별한 관계에 있는 객체에게만 공개하기로 했습니다.

KidsBurger클래스 설계자는 KidsBurger 객체를 만들 수는 있지만 만들어진 KidsBurger

객체의 가격정보를 직접 읽거나 쓸수는 절대 없고, 다만 가격을 알게 해주기 위해서

멤버 메소드를 제공하는데 이또한 특별한 관계에 있는 객체에게만 제공하게 했습니다.

이 특별한 관계는 상속의 관계입니다.

 

KidsBurger클래스를 상속한 KidsBurgerSet클래스는 기본적으로 KidsBurger 클래스가

갖고 있는 모든 것을 갖고 있습니다. 멤버변수 price도 갖고 있고 멤버메소드 getPrice()

도 갖고 있습니다. 물론 눈에는 보이지 않지요.

실제로 KidsBurgerSet 객체에 멤버변수 price가 명시적으로 없어도 존재하고 있는 셈이고

멤버 메소드 getPrice()가 명시적으로 없어도 존재하고 있습니다.

하지만 현재의 KidsBurgerSet객체는 멤버변수 price를 함부로 읽고 쓸수는 없습니다.

자신이 갖고 있는데도 불구하고 멤버변수 price를 함부로 읽고,쓸수 없다는 데에 이해하기

힘들지도 모르지만, KidsBurgerSet객체가 멤버변수 price와 멤버메소드 getPrice()를 갖고

있긴 한데 직접 자기가 만든 것이 아니어서 약간의 제한이 있기 때문입니다.

 

KidsBurgerSet의 멤버변수 price가 원래 정의된 곳은 KidsBurger이고 거기에서  private

으 로 선언했기 때문에 KidsBurgerSet 에서는 멤버변수 price를 읽고 쓸 수 없습니다. 

멤버메소드 getPrice()는 원래 정의된 곳 KidsBurger에서 protected로 선언했기 때문에

특별한 관계에 있는 KidsBurgerSet 입장에서는 마음껏 getPrice()를 호출할 수 있습니다.

그러니까 KidsBurger클래스에서는 가격정보를 얻고자 할 때 멤버변수를 직접 읽어서

알 수도 있고 멤버 메소드를 호출해서도 알 수 있지만,

KidsBurgerSet클래스에서는 멤버변수를 직접 읽을 수 없기 때문에 가격정보를 얻고자

한다면 멤버 메소드를 호출하는 수밖에 없습니다

Posted by
,