객체를 직접 생성 할 수 있는 클래스는 실체 클래스
클래스들의 공통적인 특성을 추출해서 선언한 클래스
추상 클래스와 실체 클래스는 상속관계(추상 클래스가 부모)
추상 클래스 키워드는 abstract
abstract 키워드를 붙이면 new 연산자로 객체 생성 불가
new 연산자로 직접 생성자를 호출은 불가능 하지만
자식 객체가 생성될 때 묵시적으로 super(...)를 호출해서
추상 클래스 객체를 생성하기 때문에
추상 클래스도 반드시 생성자 필요
추상 메소드와 재정의
추상 클래스는 실체 클래스의 멤버(필드, 메소드)를 통일하는 목적
모든 실체들이 가지는 메소드의 실행 내용이 동일하다면
추상 클래스에 메소드를 작성하는 것이 좋음
하지만
메소드의 선언만 통일하고 실행 내용은
실체 클래스마다 달라야 하는 경우가 있음
예로 새의 종류에는 오리, 닭, 까치 등등이 있는데
공통적으로 울음 소리를 지정 해주어야 하지만
울음소리가 각각 달라서
추상 클래스에서 일반 메소드로
sound를 하나로 통일하기엔 무리가 있음
그렇기 때문에 추상 클래스에서는
추상 메소드를 선언 할 수 있음
public abstract class Bird{
abstract void sound();
}
public class Duck extends Bird{
}
public class Chicken extends Bird{
}
위에 그림에서 Duck과 Chicken에 오류가 떠있는데
추상 클래스에서 추상메소드를 선언하고
실체 클래스에서 재정의를 안해주어 오류가뜸
추상 메소드를 선언하면 자식 클래스에서 무조건 재정의 해주어야함
이렇게 한다면 자식 클래스 마다 공통적으로
sound메소드가 존재해야하고 내용은 다르게 할 수 있다
public class Duck extends Bird{
@Override
void sound(){
System.out.println("꽥꽥");
}
}
public class Chicken extends Bird{
@Override
void sound(){
System.out.println("꼬끼오");
}
}
이렇게 각 실체 클래스에서 sound메소드를 재정의해주면 오류가 사라짐
public class Test{
public static void main(String[] args){
Duck duck = new Duck();
Chicken chicken = new Chicken();
duck.sound();
chicken.sound();
}
}
public class Test{
public static void main(String[] args){
Duck duck = new Duck();
Chicken chicken = new Chicken();
birdSound(duck);
birdSound(chicken);
}
static void birdSound(Bird bird){
bird.sound();
}
}
Bird는 추상 클래스이자 부모 클래스이기 때문에
이렇게 자동 타입 변환도 가능
'프로그래밍 > Java' 카테고리의 다른 글
중첩 클래스와 중첩 인터페이스 (0) | 2019.12.05 |
---|---|
인터페이스 (0) | 2019.12.04 |
타입 변환과 다형성 (0) | 2019.12.04 |
상속 (0) | 2019.12.03 |
final필드와 상수 (0) | 2019.12.03 |