HeadFirst Java study(7. 상속, 다형성 )

chaean Lee·2021년 1월 17일
0
post-thumbnail

👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.

👿상속,다형성 정리.


상속을 먼저 이해하고 다형성을 이해하자.
일단 상속 왜 사용하는가?

코드 중복을 방지하기 위해서 이다.

상속 예제로 많이 쓰이는 Animal계층 구조를 보자.


우선 인스턴스 변수를 모든 Animal형식에 적용할 수 있다고 가정하자.
사자class가 있고 그사자의 고유 picture,food,hunger,boundaries,location 값이 있다.
하마class도 인스턴스의 변수의 값은 다르지만,
어쨌든 변수자체는 다른 Animal 형식에 있는 것과 똑같은 것을 가지고 있다.
개, 호랑이 등의 동물에서도 똑같다. 하지만 행동도 그럴까?
사자와 개가 똑같은 소리를 낼까? 고양이가 하마와 똑같은 식으로 먹을까?

그래서 override라는 것을 사용한다.

하위 클래스에서 상위클래스의 메소드를 사용하되 각 개체의 특성에 맞게 커스터마이징을 한다.

✨오버라이드 정의: 하위클래스에서 메소드의 역할을 변경하거나 확장할 필요가 있을때 상속받은 메소드를 새로 정의 하는것이다.


오버라이드 규칙

하위 클래스의 메소드는 상위 클래스의 메소드와 똑같아야 한다.
즉 인자와 리턴형식이 동일해야 하는 것을 의미한다.
컴파일러에서는 어떤 레퍼런스에 대해 특정한 메소드가 제대로 호출할 수 있는지를 결정할 때 레퍼런스의 형식을 살펴본다.
Dog에 대한 Animal의 레퍼런스가 있을때,
Animal a = new Dog();
컴파일러에서는 Animal레퍼런스에 대해 호출하는 메소드가 Animal 클래스에 있는지만 신경쓴다.
하지만 실행할 땐 JVM에서는 레퍼런스 형식이 아닌 힙에 들어있는 실제 Dog객체를 사용한다.
따라서 컴파일러에서 메소드 호출을 허가한 후에도 오버라이드하는 메소드의 인자와 리턴형식이 똑같을 때에만,
그 메소드가 제대로 작동한다.

🅰일련의 클래스에 대한 상위클래스를 만들면 그 상위 클래스 형식이 들어갈 수 있는 모든 자리에 해당 클래스와 임의 하위 클래스에 속하는 객체를 마음대로 사용할 수 있다.

이것이 다형성을 사용하는 이유이다.

아래 예제를 보면서 이해해 보자.

다형성을 사용하면 레퍼런스 유형을 실제 객체 유형의 상위 상위클래스 유형으로 지정 할 수 있다.

'A는 B다'의 공식이 적용된 상속관계에서 모든 하위 객체(Dog,Hippo,Cat..)는 상위객체(Animal)에 대입할 수 있다. 이렇게 하면 배열을 만드는 것과 같은 일을 할 수 있다.
Animal[] a = new Animal[5];
a[0] = new Dog();
a[1] = new Cat();
a[2] = new Lion();
a[3] = new Hippo();

for(int i =0;i<a.length;i++){
       a[i].eat(); //각 클래스에 들어있는 eat메소드가 실행.
}
또한 인자와 리턴 유형에 대해서도 다형성을 적용할 수 있다.
class Vet(){//주사를 맞으면 소리가 남.
 public void giveShot(Animal a){ //✨ 
     a.makeNois();
 }
}

class petOwner(){
 public void start(){
      Vet v = new Vet();
      Dog d = new Dog();
      Hippo h = new Hippo();
      v.giveShot(d);  //Dog의 노이즈가 실행
      v.giveShot(h);  //Hippo의 노이즈가 실행
 }
}
✨표시 부분에서 인자가 Animal을 사용할 수 없다고 생각해보자.
만약 다형성을 사용할 수 없었다면, Vet클래스에선 giveShot 메소드가 하나가 아니라 하위클래스 갯수만큼의 메소드가 필요할 것이다. 왜? petOwner에서 giveShot을 호출할때 어떤 객체를 보낼지 모르기 때문이다.

🅰다형적인 인자를 사용하는 코드를 만들면, 즉 메소드 매개변수를 상위 클래스 유형으로 선언하면 실행할 때 어떤 하위 클래스의 객체도 전달할 수 있다.

🅰다형성을 활용하면 새로운 하위 클래스 형식을 프로그램에 추가하더라도 코드를 굳이 바꿀 필요가 없다. 위에 나와있는 Vet클래스 giveShot 메소드에서 선언된 인자는 새로운 하위클래스에 대한 사전 지식이 없어도 그 새로운 하위클래스 형식의 객체를 전달 받을 수 있다.

출처:headfirst (저자:케이시 시에라,버트 베이츠)

profile
왜! 언제! 어떻게! 😁

0개의 댓글