[Java] 추상 메서드 / 추상 메서드 오버라이딩 (cf. 일반 메서드 오버라이딩)
추상 메서드
부모 클래스에서 간단히 선언하고, 자식 클래스에서 오버라이딩 받아 구체화 하는 것.
부모 클래스에서 추상 메서드를 선언할 땐 메서드 앞에 abstract 제어자를 붙여준다.
추상 메서드 사용 예
//부모클래스에선 이렇게 단순하게만 선언
public abstract void horn();
//자식클래스에서 구체적이게 구현
public void horn() {
System.out.println("빵빵");
}
추상 메서드는 자식의 메서드 오버라이딩을 강제할 수 있다.
상속받은 클래스에서 추상 클래스의 추상메서드가 반드시 오버라이딩 되어야한다.
추상 메서드 오버라이딩과 일반 메서드 오버라이딩의 차이
추상 메서드 오버라이딩을 공부하다보니 궁금한 점이 생겼다.
추상 메서드 오버라이딩과 일반 메서드 오버라이딩은 거의 비슷한 역할을 하는데 추상 메서드로 오버라이딩 할 필요성이 뭐가 있지 ?
추상 메서드는 추상 부모 클래스에서 모호하게 만들고 자식 클래스에서 구체화하는 건 알겠는데.. 왜 비슷한 기능인 일반 메서드 오버라이딩이 있는데도 굳이 추상 메서드로 오버라이딩이 필요한가 궁금했다.
1. 추상 메서드를 사용하지 않고 일반 메서드 오버라이딩을 해버리면 설계관점에서 좀 아쉬울 수 있다는 것이다.
자식 클래스에서 다 오버라이딩해서 쓰는 여러번 반복되는 코드임에도 부모 클래스에서 미리 구체화해서 함수를 정의해버리면 .. 덜 효율적인 코드가 된다. 그래서 부모 클래스에선 추상 메소드로 선언만 해주고 구체화는 각자 자식 클래스에서 하는 식으로 설계할 때 쓰인다는 것이다.
2. 추상 메서드는 자식 클래스에서 메서드 오버라이딩을 강제할 수 있다.
추상화는 보통 클래스들을 여러개 선언하다보니까 공통되는 부분이 있고, 큰 틀은 같은데 각 클래스 별로 로직이 조금 다르다면, 그 때 부모 추상 클래스를 선언해서 상속해주는 식으로 코드를 작성한다고 한다. 이런 식으로 설계할 때, 자식 클래스들에서 통일하기로 한 그 메서드의 오버라이딩이 무조건 필요하니까 추상 메서드로 강제할 필요가 있다.