Java
추상 메소드와 오버라이딩

추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버 (필드,메소드)를 통일화 하는데 목적이 있다.


메소드의 선언만 통일화하고 , 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 예를들어 모든 동물은 소리를 내기 때문에 Animal 추상 클래스에서 sound()라는 메소드를 정의했다고 하자.


추상메소드를 선언하는 방법은

[pulic | protected ] abstract 리턴타입 메소드명(매개변수,...);


밑에서는 void라는 리턴타입과 sound라는 메소드 명을 이용하였다.


[Animal.java]
public abstract class Animal{
public String kind;
public void breathe(){
System.out.println("숨을 쉽니다.");
}
public abstract void sound();{ //추상메소드
}


추상메소드는 추상클래스에서만 선언할 수 있는데 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다. 추상클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우, 해당 메소드를 추상 메소드로 선언하면 된다.


자식 클래스는 반드시 추상 메소드를 재정의(@Ovrride)해서 실행 내용을 작성해야 한다.


[Dog.java] 추상 메소드 오버라이딩
public class Dog extends Animal{ //추상클래스를 상속받아야한다.
public Dog(){
this.kind="포유류";
}
@Override
public void sound(){
System.out.prinfln("멍멍");
} //추상메소드 재정의



[Cat.java] 추상 메소드 오버라이딩
public class Cat extends Animal{ //추상클래스를 상속받아야한다.
public Cat(){
this.kind="포유류";
}
@Override
public void sound(){
System.out.prinfln("야옹");
} //추상메소드 재정의


이제 이것을 실행시켜야한다 . 실행시키기 위해 AnimalExample.java 만들어서 실행 해 보겠다.


[AnimalExample.java]
public class AnimalExample{
public static void main(String[] args){
//sound()메소드를 호출하는 방법 1번째
Dog dog=new Dog();
Cat cat=new Cat();
dog.sound();
cat.sound();
System.out.println("-----------");
//2번째
Animal animal=null;
animal=new Dog();
animal.sound();
animal=new Cat();
animal.sound();
System.out.println("-----------");
//3번째
animalSound(new Dog());
animalSound(new Cat());
}
public static void animalSound(Animal animal){
animal.sound();
}
}


첫번째는 가장 일반적인 방식으로 Dog.Cat변수를 호출했고

두번째는 Animal변수로 타입 변환해서 sound()메소드를 호출했다.

자식타입은 부모타입으로 자동 타입변환이 될 수 있고, 메소드가 재정의되어 있을경우 재정의된 자식 메소드가 호출되는 상속의 특징이 그대로 적용된다.


세번째는 부모타입의 매개 변수에 자식 객체를 대입해서 메소드의 다형성을 적용했다. 매개 변수의 다형성에 대한 설명은 앞으로 포스팅하도록 하겠습니다.

댓글 0