간단 지식/Java

13. 추상클래스와 추상메소드

납작한돌맹이 2020. 7. 6. 03:37
반응형

클래스는 두 부류로 나눠볼 수 있다.

1. 실체클래스

2. 추상클래스

단순하게 객체를 직접 생성할 수 있으면 실체클래스이고, 그렇지 않으면 추상클래스이다. 좀 더 정확히 말하자면 실체 클래스들의 공통적인 특성을 추출하여 만든 클래스를 추상클래스라고 한다. 즉, 이 둘은 상속관계로 묶여있다. 부모는 추상클래스, 자식은 실체클래스다. 추상클래스는 새 실체 클래스를 만들기 위해서만 사용된다. 용도가 하나밖에 없는데 왜 필요하냐고 묻는다면 이유는 2가지가 있다. 첫째, 실체 클래스들의 공통된 필드&메소드를 통일함으로써 동일한 기능을 하는 멤버가 다른 이름으로써 여럿 존재하게되는 비합리성을 줄여준다. 둘째, 실체 클래스 생성 시간을 절약해준다.

키워드는 abstract로, 선언방식은 다음과 같다.

public abstract class 클래스명 { ... }

참고로 추상 클래스는 객체를 직접 생성할 수 없기 때문에 자식 클래스의 생성자에 반드시 super(매개변수); 를 넣어 주어야 한다.


추상메소드는 메소드 선언만 동일하고 실행 내용은 각기 달라야 하는 경우에 사용된다.

선언방식은 다음과 같다.

public/protected abstract 리턴타입 메소드명(매개변수); 

다만 선언부만 있고 실행부인 { } 가 없다. 따라서 반드시 자식클래스에서 오버라이딩해서 실행부를 채워야한다. 그리고 오버라이딩을 위해 외부에서 접근을 어느정도 할 수 있게 해야하므로 접근제한자는 public과 protected만 올 수 있다.


아래는 추상클래스와 추상메소드를 다룬 예제이다.

public abstract class Animal {
    public String kind;
    public abstract void sound();
}

추상메소드 sound()는 추상클래스 Animal의 자식클래스인 Dog에서 오버라이드된다.

public class Dog extends Animal{  
    public Dog(){
        super();
    }
    @Override
    public void sound(){
        System.out.println("멍멍");
    }
}
public class MainTest {
    public static void animalSound(Animal animal){
        animal.sound();                  ------------(1)
    }

    public static void main(String[] args){
        Dog dog = new Dog();
        dog.sound();                     ------------(ㄱ)
        System.out.println("----------");
        Animal animal = new Dog();       ------------(2)
        animalSound(new Dog());          ------------(ㄴ)
    }
}

mainTest클래스에는 main 메소드와 추상클래스타입을 매개변수로 갖는 animalSound메소드가 있다. animalSound()를 실행하려면 Animal타입의 매개변수가 필요한데, 추상클래스는 객체를 직접생성하지 못하므로 (2)와 같은 과정이 필요하다. 그렇게 Dog 클래스 객체는 Animal타입으로 자동변환된다. 결론적으로는 (ㄱ)과 (ㄴ) 모두 '멍멍' 이라는 같은 결과를 내놓는다.

참고로 animalSound()는 static 클래스여야한다. 왜냐하면 매개값이 클래스타입인데, 그 클래스가 추상클래스이기 때문이다. 같은 의미로 추상클래스에서는 static메소드를 만들수는 있지만,  static 메소드를 추상으로 선언할 수는 없다.

 

 

 

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형

'간단 지식 > Java' 카테고리의 다른 글

12. 상속  (0) 2020.06.25
11. Getter & Setter  (0) 2020.06.22
10. 접근제한자(public, protected, default, private)와 싱글톤  (0) 2020.06.21
09. Package와 import  (0) 2020.06.21
08. 정적멤버(static)와 final필드와 상수  (0) 2020.06.20