추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버 (필드,메소드)를 통일화 하는데 목적이 있다.
메소드의 선언만 통일화하고 , 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 예를들어 모든 동물은 소리를 내기 때문에 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()메소드를 호출했다.
자식타입은 부모타입으로 자동 타입변환이 될 수 있고, 메소드가 재정의되어 있을경우 재정의된 자식 메소드가 호출되는 상속의 특징이 그대로 적용된다.
세번째는 부모타입의 매개 변수에 자식 객체를 대입해서 메소드의 다형성을 적용했다. 매개 변수의 다형성에 대한 설명은 앞으로 포스팅하도록 하겠습니다.
아직 댓글이 없습니다. 첫번째 댓글 작성자가 되어주세요 :)