[4단원]자바가 확장한 객체지향 초읽기 - Abstract 키워드 - 추상메서드와 추상 클래스

추상 메서드와 추상 클래스

추상 메서드

  • 선언만 있고 구현부가 없는 메서드이다.
  • 메서드에서 어떤 일을 해야하는지만 알려주고, 실제로 그 일을 어떻게 할 지는 하위 클래스에서 결정한다.
  • 같은 메서드명을 가지면서 각각 다른 기능을 수행 할 수 있게 된다.

추상 메서드 예시

public class Driver {
    public static void main(String[] args) {
        동물[] 동물들 = new 동물[5];
        
        동물들[0] = new 쥐();
        동물들[1] = new 고양이();
        동물들[2] = new 강아지();
        동물들[3] = new 송아지();
        동물들[4] = new 병아리();
        
        for (동물 동물 : 동물들) {
            동물.울어보세요();
        }
    }
    
    private static class 동물 {
        void 울어보세요() {
            System.out.println("나는 동물! 어떻게 울어야 하나요?");
        }
    }
    
    private static class 쥐 extends Driver.동물 {
        void 울어보세요() {
            System.out.println("찍찍");
        }
    }
    
    private static class 고양이 extends Driver.동물 {
        void 울어보세요() {
            System.out.println("야옹");
        }
    }
    
    private static class 강아지 extends Driver.동물 {
        void 울어보세요() {
            System.out.println("멍멍");
        }
    }
    
    private static class 송아지 extends Driver.동물 {
        void 울어보세요() {
            System.out.println("음메");
        }
    }
    
    private static class 병아리 extends Driver.동물 {
        void 울어보세요() {
            System.out.println("삐약");
        }
    }
}
  • 상속받는 경우, 동물 클래스에는 항상 코드가 구현되어있어야한다.
  • 하지만, 동물 클래스로 구현한 경우 이상한 코드가 실행된다..
  • 만약 사용자가 이러한 코드를 수행하는 경우, 사실상 오류 라고 볼 수 있다.
  • 이를 해결하기 위하여! 추상클래스가 등장했다.

추상클래스

  • 하나 이상의 추상 메서드를 포함한 클래스이다.
  • 추상 클래스는 인스턴스를 직접 생성할 수 없음
  • 하위 클래스를 통해서만 사용될 수 있다.
  • 일종의 템플릿의 역할을 하게된다.
// 추상 클래스 선언
public abstract class 동물 {
    // 추상 메서드 선언
    abstract void 울어보세요();
}

// 하위 클래스 구현
public class 고양이 extends 동물 {
    void 울어보세요() {
        System.out.println("나는 고양이! 야옹 야옹!");
    }
}

왜 추상클래스가 필요한지?

  • 하위 클래스가 반드시 이 메서드를 구현해야 한다.
    • 일관성을 유지하고
    • 유연성을 높일 수 있다.
  • 동물 이라는 추상 클래스에서 울어보세요 라는 추상 메서드가 존재하는 경우, 이를 상속받은 고양이, 강아지 등의 서브 클래스에서 반드시 울어보세요 의 메서드를 구현해야한다.
  • 그렇지 않으면 컴파일 에러가 발생하게 된다.

추상 클래스와 일반 클래스와 차이

  • 추상 클래스는 인스턴스를 직접 생성할 수 없습니다.
동물 동물 = new 동물();

위 코드가 일반 클래스에선 가능했지만 , 추상클래스에선 불가능함.


Uploaded by N2T