객체지향의 꽃
정의:
상속관계에 있는 클래스에서 상위클래스가 동일한 메시지로 하위클래스들을 서로 다르게 동작시키는 객체지향 원리(개념) -> 오버라이딩이 그 예시.
다형성을 인자로 활용:
기본적으로 메소드에 파라미터로 기본 데이터 타입외에 배열도 올 수 있고 클래스도 올 수 있다.
상속관계에 있는 부모 클래스를 파라미터로 넣으면 자식 클래스를 어떻게 활용할 수 있을까?
예를 들어서, Animal
라는 부모와 Dog
그리고 Cat
라는 상속관계의 클래스들이 있다.
Dog d = new Dog();
feed(d);
Cat c = new Cat();
feed(c);
public void feed(Animal animal) {
animal.eat();
}
자식 클래스에 공통으로 가지고 있는 eat()
을 메소드 feed()
를 통해서 실행 할수 있다.
그리고 파라미터로 받은 부모 객체를 다형성인수라고 부른다.
다형성배열:
Animal[] animal = new Animal[2];
animal[0] = new Dog();
animal[1] = new Cat();
animal[0].eat();
animal[1].eat();
여기서 animal[0]과 animal[1]을 실행하면 오버라이딩된 eat()
가 실행된다
Animal 의 eat()은 구현부가 있지만, 근데 이건 결국 절대 출력이 안될 메소드이다. 필요없는 메소드이다.
그래서 구현부분은 지우고 그냥 바디만 사용하는걸 추상메소드라한다
public abstract void eat()
불완전한, 장애가 있는 메소드
왜 만들까?
재정의를 하도록, 다형성을 보장하기 위해서!
단하나의 추상메서드라도 만들면 클래스는 추상클래스가 되어져야한다
추상클래서 물론 구현코드가있는 메소드도 실행가능하다
그 추상클래스는 반드시 상속을 해야 쓸수있다 논리적으로 당연한말 구현부가 없는 추상메소드를 만들었는데 어떻게 사용? 그리고 상속받은 자식클래스는 반드시 추상메서드를 구현해야한다