Claire's Study Note

07-3. 추상 클래스

by Hi.Claire
반응형

📓 혼자 공부하는 자바 (신용권, 한빛미디어)

 

07. 상속

07-3. 추상 클래스

실체 클래스

객체를 직접 생성할 수 있는 클래스

 

추상 클래스(Abstract class)

실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스

 

추상 클래스와 실체 클래스는 상속 관계를 가진다.

추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성(필드, 메소드)을 물려받고, 거기에 더해 추가적인 특성을 가질 수 있다.

 

07-3-1. 추상 클래스의 용도

공통된 필드와 메소드의 이름을 통일할 목적

실체 클래스를 설계하는 사람이 여러 사람일 경우 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수도 있다.

데이터와 기능이 모두 동일함에도 불구하고 이름이 달라지면 객체마다 사용 방법이 달라지는 문제가 생긴다.

이를 방지하기 위해 추상 클래스에 필드와 메소드를 선언하고 각각의 실체 클래스에서 추상 클래스를 상속함으로써 필드와 메소드 이름을 통일할 수 있다.

 

실체 클래스를 작성할 때 시간 절약

공통적인 필드와 메소드는 추상 클래스에 모두 선언해두고, 다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는 데 시간을 절약할 수 있다.

 

07-3-2. 추상 클래스 선언

추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙인다.

abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.

 

예시1. 추상 클래스

public abstract class Phone {

    //필드
    public String owner;
    
    //생성자
    public Phone(String owner) {
        this.owner = owner;
    }
    
    //메소드
    public void turnOn() {
        System.out.println("폰 전원을 켭니다.");
    }
    
    public void turnOff() {
        System.out.println("폰 전원을 끕니다.");
    }
}

 

예시2. 실체 클래스

public class SmartPhone extends Phone {

    //생성자
    public SmartPhone(String owner) {
        super(owner);
    }
    
    //메소드
    public void internetSearch() {
       System.out.println("인터넷 검색을 합니다.");
    }
}

 

예시3. 실행 클래스

public class PhoneExample {

    public static void main(String[] args) {

        //Phone phone = new Phone();
        
        SmartPhone smartPhone = new SmartPhone("홍길동");
        
        smartPhone.turnOn();
        smartPhone.internetSearch();
        smartPhone.turnOff();
    }
}

폰 전원을 켭니다.

인터넷 검색을 합니다.

폰 전원을 끕니다.

 

07-3-3. 추상 메소드와 재정의

추상 메소드

abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드를 말한다.

 

추상 메소드 선언

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

 

모든 실체 클래스에서 공통적으로 가져야 하지만 구체적인 실행 내용은 달라야 하는 메소드가 있을 수 있다.

그럴 경우 메소드의 선언만 통일하고 실행 내용은 실체 클래스마다 다르게 작성되어야 한다.

 

예를 들어 강아지, 고양이 등의 공통적인 특성을 추출해서 동물이라는 추상 클래스를 선언할 수 있다.

모든 동물은 소리를 내기 때문에 동물 추상 클래스에서 sound() 라는 메소드를 정의하게 된다.

하지만 동물마다 다양한 소리를 내기 때문에 어떤 소리를 낼 것인지는 실체 클래스인 강아지, 고양이 클래스에서 직접 작성되어야 한다.

 

이런 경우를 위해서 추상 클래스는 추상 메소드를 선언할 수 있다.

추상 클래스 설계 시 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있다면 해당 메소드를 추상 메소드로 선언한다.

자식 클래스는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.

 

예시1. 추상 메소드 선언

public abstract class Animal {

    public String kind;
    
    public void breathe() {
        System.out.println("숨을 쉽니다.");
    }
    
    public abstract void sound();
}

 

예시2. 추상 메소드 재정의

public class Dog extends Animal {

    public Dog() {
        this.kind = "포유류";
    }
    
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

 

예시3. 추상 메소드 재정의

public class Cat extends Animal {

    public Cat() {
        this.kind = "포유류";
    }
    
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

 

예시4. 실행 클래스

public class AnimalExample {

    public static void main(String[] args) {

        Dog dog = new Dog();
        Cat cat = new Cat();
        
        dog.sound();
        cat.sound();
        System.out.println("----------");
        
        //변수의 자동 타입 변환
        Animal animal = null;
        animal = new Dog();
        animal.sound();
        animal = new Cat();
        animal.sound();
        System.out.println("----------");
        
        //메소드의 다형성
        animalSound(new Dog());
        animalSound(new Cat());
        System.out.println("----------");
        
        public static void animalSound(Animal animal) {
            animal.sound();
        }
    }
}

멍멍

야옹

----------

멍멍

야옹

----------

멍멍

야옹

----------

 

반응형

'☕️ Java > 혼자 공부하는 자바' 카테고리의 다른 글

08-2. 타입 변환과 다형성  (0) 2023.09.25
08-1. 인터페이스  (0) 2023.09.24
07-2. 타입 변환과 다형성  (1) 2023.09.23
07-1. 상속  (0) 2023.09.18
06-6. 패키지와 접근 제한자  (0) 2023.09.17

블로그의 정보

Claire's Study Note

Hi.Claire

활동하기