JAVA) 자바 추상화(abstract)
추상화는 상속을 강제하는 방법 중 하나다.
abstract로 지정하면 바로 사용할 수 없고 상속을 해야만 사용할 수 있다.
추상화 사용이유
1) 상속과 오버라이딩을 강제하기 위해
강제성을 부여하지 않고 클래스를 정의하게될 때 문제점.
a가 A를 상속한다고 했을때, a는 A의 메서드를 오버라이딩해서 사용할 수 있다.
근데 오버라이딩은 선택일뿐 자식은 부모의 것을 쓰든 안쓰든 부모입장에서는 강제할 방법이 없다.
즉, 자식은 자유성을 가지고 있다.
근데 만약 만약 모든 부품을 똑같이 만들어야되는데 자식이 실수로 하나를 빠뜨리게된다면??
이런 상황을 막기 위해 필수로 사용해야 하는 것을 추상메서드로 적는다.
자식이 빠뜨렸을 경우, 오류가 나게해서 무조건 쓰게 만드는것이다.
2) 공통된 기능을 통일하기 위해.
꼭 강제로 사용하지 않더라도, 공통된 부분들이 많을 경우 미리 틀을 만드는 역할도 한다.
틀만 만들어 놓고(추상화) 자식들이 가져다가 쓰게 하여 클래스 구현시 시간이 절약된다.
추상화 형태
추상 클래스: [접근제한자] abstract class 클래스명 { }
추상클래스는 추상메서드, 일반 메서드 둘 다 포함할 수 있다.
abstract class TestClass { }
추상 메서드: [접근제한자] abstract [리턴타입] 메서드명( );
public abstract void test_method();
추상메서드는 바디(구현부){ } 가 없다.
그래서 위에 바로 사용할 수 없고 상속해야만 사용할 수 없다는 말이
어차피 구현부가 없어서 실행하려해도 실행할 내용이 없다.
추상화 예시
abstract class A {
String var;
public void normalMethod() {
System.out.println("부모 추상클래스의 일반 메서드");
}
public abstract void abstractMethod1();
}
class Aa extends A {
@Override
// abstractMethod1을 오버라이드 하지 않으면 컴파일에러 발생.
public void abstractMethod1() {
System.out.println("추상화 1번 메서드");
}
}
부모의 추상화메서드는 자식 여러 개가 나눠서 오버라이드해도 괜찮다.
A가 추상1, 추상2를 만들었고, Aa가 추상1만 가져왔을때 Aa2가 나머지 추상1을 구현해도 된다는 의미다.
abstract class A {
public void normalMethod() {
System.out.println("부모 추상클래스의 일반 메서드");
}
public abstract void abstractMethod1();
public abstract void abstractMethod2();
}
abstract class Aa extends A {
@Override
public void abstractMethod1() {
System.out.println("추상화 1번 메서드");
}
}
class Aa2 extends Aa {
@Override
public void abstractMethod2() {
System.out.println("추상화 2번 메서드");
}
}