한모로그 2023. 1. 19. 20:58

추상 클래스

  • 객체를 생성할 수 있는 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
  • 추상 클래스는 실체 클래스의 부모 역할. 공통적인 필드나 메소드를 물려받을 수 있음


    출처, 이것이 자바다


추상 클래스 선언

  • 클래스 선언에 abstract 키워드를 붙임
  • new 연산자를 이용해서 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.


    출처, 이것이 자바다


ackage ch07.sec10.exam01;

/*
 추상클래스의 멤버로 사용할수 있는 것
 - 구성요소 : 필드, 메소드, 생성자
 - 특징 
    - 객체생성 불가능
    - 상속은 가능.
 */

public abstract class Phone {
    //필드 선언
    String owner;

    //생성자 선언
    Phone(String owner) {
        this.owner = owner;
    }

    //메소드 선언
    void turnOn() {
        System.out.println("폰 전원을 킵니다.");
    }
    void trunOff() {
        System.out.println("폰 전원을 끕니다.");
    }
}

package ch07.sec10.exam01;

public class SmartPhone  extends Phone {

    //생성자 선언
    SmartPhone(String owner) {
        super(owner); //Phone부모클래스의 생성자 호출
    }

    //메소드 선언
    void internetSearch() {
        System.out.println("인터넷 검색을 합니다.");
    }
}

package ch07.sec10.exam01;

public class PhoneExample {

    public static void main(String[] args) {
        //추상 클래스는 객체생성 불가능하다.
        //Phone phone = new Phone("홍길동"); // 에러발생

        SmartPhone smartPhone = new SmartPhone("홍길동");

        smartPhone.turnOn();
        smartPhone.internetSearch();
        smartPhone.trunOff();
    }

}

추상 메소드와 재정의

  • 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 추상 메소드를 선언할 수 있음
  • 일반 메소드 선언과의 차이점은 abstract 키워드가 붙고, 메소드 실행 내용인 중괄호 { }가 없다.


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch07.sec10.exam02;

/*
 * 추상클래스
 * 구성 요소 : 필드, 생성자, 메소드, 추상 메소드
 * 특징 : 객체생성 불가능 
                  상속 가능 : 추상메소드는 반드시 구현해야 한다.
 */
public abstract class Animal {

    //메소드 선언
    public void breathe() {
        System.out.println("숨을 쉽니다.");
    }

    //추상 메소드
    public abstract void sound();

}

package ch07.sec10.exam02;

public class Dog extends Animal {

    @Override
    public void sound() {
        System.out.println("멍멍");
    }

}

package ch07.sec10.exam02;

public class Cat extends Animal {

    //Cat클래스가 일반클래스가 되기위해서는 추상 부모클래스의 추상메소드를 강제적으로 구현
    //추상부모 클래스의 추상메소드를 정상적형태로 작업한 형태 : 구현
    @Override
    public void sound() {
        System.out.println("야옹");
    }

}

package ch07.sec10.exam02;

public class Pig extends Animal {

    @Override
    public void sound() {
        System.out.println("꿀꿀");
    }

}

package ch07.sec10.exam02;

import ch06.sec13.exam03.package1.A;

public class AbstractMethodExample {

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();

        Cat cat = new Cat();
        cat.sound();

        Pig pig = new Pig();
        pig.sound();

        //매개변수의 다형성
        animalSound(new Dog());
        animalSound(new Cat());
        animalSound(new Pig());
        }

    public static void animalSound(Animal animal) {
        animal.sound();
    }
}