Final은 클래스를 상수화 시킨다고 보면 된다
더 이상 변경이 없다고 선언하는 것으로 상속이 불가능하다
Abstract는 시그니쳐로서 역할만하고 상속을 해서 사용을 강제한다 (사용자에게 동작 방법을 넘김)
Abstract 자체 로직을 가질 수 없기때문에 상속 받은 클래스에서 Overriding을 통해 로직을 만들어줘야한다
메소드 중에 하나라도 Abstract가 있다면 클래스도 Abstract이어야한다
Abstract는 추상 메소드 말고 다른 메소드들도 가질 수 있다
공통적인 부분은 Abstract를 통해 시그니쳐로서 놔두고
가변적이고 추가적인 부분들은 사용자들이 자유롭게 상속 받아서 재정의해서 사용할 수 있도록 한다
위의 예제는 합계(sum)를 실행하고 평균(avg)을 실행하는 절차를 메소드 run을 통해서 한 번에 실행되도록 한 코드이다. 그런데 경우에 따라서 합계와 평균을 화면에 출력하는 모습을 달리해야 하는 경우가 있다고 치자. 그런 경우에 상황에 따라서 동작 방법이 달라지는 메소드(sum, avg)는 추상 메소드로 만들어서 하위 클래스에서 구현하도록 하고 모든 클래스의 공통분모(setOprands, run)의 경우에는 상위 클래스에 두어서 코드의 중복, 유지보수의 편의성 등을 꾀할 수 있다.