Abstract Class

똘이주인·2021년 5월 18일
0

추상클래스

실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

추상클래스는 객체를 생성할 수 없다. 아직은 실체성이 없고 구체적이지 않기 때문이다.

추상클래스와 실체클래스는 상속관계이다

추상클래스 정의

  • 추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의한다.
  • 추상 클래스는 미완성의 추상 메소드를 포함할 수 있다.
    • 추상 메소드란, 내용이 없는 메소드 이다. 즉 구현이 되지 않은 메소드이다.
    • 추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 한다.
  • 추상 클래스는 인스턴스를 생성할 수 없다.
public abstract class Animal {
    public String kind;
     
    public void breath(){
        System.out.println("숨 쉰다.");
    }
    //추상메서드
    public abstract void sound();//구체적인 구현부는 없다
}
/*
해당 추상클래스를 상속받는 실체클래스들은 반드시
sound()라는 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
*/

// ------------------------------------------------------------------------------------

public class Dog extends Animal{
     
    public Dog(){
        this.kind = "포유류";
    }
     
    @Override
    public void sound() { //sound() 추상메서드를 오버라이딩해서 구현
        System.out.println("왈왈!");
    }
}

// ------------------------------------------------------------------------------------

public class Cat extends Animal{
 
    public Cat(){
        this.kind = "포유류";
    }
    @Override
    public void sound() {
				// Dog와 같지만 sound() 추상메서드는 Cat실체클래스에 맞게끔 자기스타일대로 구현
        System.out.println("야옹!");
    }
}

추상클래스 변수에, 추상클래스를 상속받아 구현한 실체클래스 인스턴스를 주입하면 해당 추상클래스 변수는 자동 타입변환을 발생시켜 실체클래스 인스턴스처럼 사용할 수 있다

public class AnimalExample {
 
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
         
        dog.sound();
        cat.sound();
         
        Animal animal = null;
         
        animal = new Dog(); //자동 타입변환
        animal.sound(); //Dog에 구현된 Sound()메서드 실행
         
        animal = new Cat(); //자동 타입변환
        animal.sound(); //Cat에 구현된 Sound()메서드 실행
         
         
        animalSound(new Dog()); //자동 타입변환 (매개변수도 가능)
        animalSound(new Cat()); //자동 타입변환 (매개변수도 가능)
    }
    
    private static void animalSound(Animal animal) {
        animal.sound();
    }
		//자동 타입변환 : 추상클래스 타입 변수는 추상클래스를 
		//상속받은 실체클래스의 타입으로 자동 타입변환이 된다. 
}

0개의 댓글