JAVA Programming for Beginners...

JAVA, 초보

상속, 숨은 이야기...

인스턴스 변수의 접근 범위

 

Object o = new MyPuppy("GGamdol"); 될까요? 됩니다...

상위클래스를 객체로 갖는 변수들은 하위클래스의 객체를 가리킬 수 있습니다..

(요 가리킨다는 용어 포인터 냄새가 나서 싫어하시는 분들이 계실지 모르겠습니다..)

하지만 하위클래스의 인스턴스를 직접 접근하는 것은 아닙니다.

하위클래스의 상위클래스 부분을 접근하는 것이기 때문에..

 위의 o라는 변수는 MyPuppy라는 객체의 Object부분만을 볼 수 있습니다. (이런~ 골치아픈 상속~) 

따라서 o.eat(); 같은 것은 안됩니다.

MyPuppy의 객체가 만들어 지기는 하나, MyPuppy가 상속받는 Object부분에만 접근이 가능하다는 이야기가 됩니다.

그럼 이걸 어디에 사용할까요???

만약 동물(Animal)을 상속받은 개(Dog), 고양이(Cat), 토끼(Rabbit) 클래스가 있다고 칩시다.

만약 애완동물샵(PetShop)클래스에서 Dog객체, Cat객체, Rabbit객체를 사용하고 있다가 이 모든 객체를 인자로 받아 먹이를 주는 메소드인 feed()라는 메소드를 만들어야 한다고 합시다.

그럼 feed(Dog aDog), feed(Cat aCat), feed(Rabbit aRabbit)이렇게 3개의 메소드를 각각 만들어야 합니다.

이건 좀 아니죠~

여기에 feed(Animal aAnimal)이라는 메소드를 만들어 Dog, Cat, Rabbit 상관없이 사용한다면 더욱 확장성이 늘어나겠지요??   --> 이런것을 다형성이라고 합니다..(하더라구요...)

이런 필요성은 아~주 많이 사용될 것입니다...

 

객체는 네가지의 선언마다 Puppy가 생성되나,

그 변수가 가리키는 것은 위의 그림과 같이 자신이 알 수 있는 부분을 지정합니다..

캐스팅 가능 Puppy po = (Puppy) o; 하면 됩니다... ( Object클래스의 인스턴스 변수 o가 Puppy클래스의 인스턴스 변수로 캐스팅..) 그러면 po는 Puppy클래스 모두를 사용할 수 있게 됩니다..

Puppy op = new Object(); 당연하게 안되겠죠???

Puppy blackDol = new Puppy(“GGamdol”); 이라고 하는 순간

Puppy의 상위클래스들이 모두 만들어 지며(생성자가 없다면 계속 기본 생성자를 호출하면서 상속관계를 올라갑니다..)

모두 만들어진 최종 객체가 생겨나게 되고, 그 객체를 지역변수(인스턴스 변수)에 할당하여 사용 할 수 있도록 만들어 줍니다.

만약  Dog myDog = new Puppy(); 라고 하면, 모든 클래스(Puppy까지)가 만들어져 myDog에 연결되고, myDog는 Object, Animal, Dog까지만 인식하게 됩니다...

 

상속.. 어느 정도 감이 잡히나요??

아님 저만 혼자 주저리주저리 하고 있는 건가요??

여기에 상위클래스가 가진 메소드를 오버라이드라도 할라 치면.. 더욱 복잡해 지겠지요??

개념만.. 개념만 확실하게 잡고 가시면 복잡할 것 하나 없습니다....

 

蛇足 : 객체지향언어의 특성상 누군가가 잘~ 만들어 놓은 객체를 가져다 사용하실 수 있습니다.

특히 자바 표준라이브러리에 있는 객체들은 상당히 잘 만들어져 있습니다.

처음부터 모든 클래스들을 설계하지 않고, 누군가가 만들어 놓은 객체를 내 프로젝트에 맞게 사용하시려면

상속!! 개념을 확실하게 잡고 넘어가셔야 겠지요???

프로젝트... 계속 가면서 중요개념을 설명하기로 하지요.... 휘리릭~~

못해먹겠네요....  메모장 혹은 Editplus, ultraEdit등으로 코딩하고, java, javac, javadoc등의

명령어로 컴파일, 실행, 문서화 하는거 말입니다..

다음 시간에는 IDE를 사용해 봅시다... java에 특화된 Eclipse 말이지요....

댓글

댓글 본문