클래스끼리의 공통 분모를 미리 구현해 나중에 사용할 수 있도록 만드는 것.
추상 클래스를 만들어 상속하면, 자식 클래스는 상속받은 부모 클래스가 가진 모든 추상 메서드를 구현해야 한다.
접접이 있는 기능들을 최대한 많이 추상 클래스로 구현해두고 사용하면 좋겠지만, 메서드가 중복되는 코딩이 발생할 경우 메소드 출처에 대한 모호성때문에 자바에서는 기본적으로 클래스의 다중 상속을 금지한다.
인터페이스 또한 비슷한 기능이나, 추상 클래스가 가진 다중 상속 불가의 한계점을 극복했다. 여러개를 동시에 하나의 클래스에 상속할 수 있다. 이게 가능한 이유는 바로 인터페이스는 모든 메서드가 추상 메서드여야 하고, 그 덕분에 메서드들끼리 합치더라도 아무 문제가 없기 때문이다.
하지만 추상 클래스와 동일하게 상속받은 클래스에서는 인터페이스에 존재하는 추상 메서드들을 전부 구현해야 하는데, 만약 구현하지 않는다면 추상 클래스로 바뀌게 된다.
부모 클래스를 자료형으로 하여 인스턴스 변수를 만들어 부모 클래스를 상속받고 있는 모든 클래스에 접근이 가능할 뿐만 아니라 불필요한 코드를 줄이고 각 클래스들의 유지보수가 용이해진다.
프로젝트의 크기가 커지면 커질수록 더 핵심적으로 작용할 듯 하다.
추상 클래스는 자식 클래스가 하나의 추상 클래스만을 상속받을 수 있고, 인터페이스는 여러개를 상속받을수 있다.
공통 분모를 미리 구현한다고 보았을 때, 추상 클래스는 주로 없어서는 안될 핵심적인 공통분모를 정의할 때 사용하고, 인터페이스는 언제든지 추가하고 제거할 수 있는 부가기능들을 정의할 때 사용하지 않을까 생각한다.
참조 변수가 형 변환이 가능한 타입인지 체크한다.
@Override 와 같이 프로그램에서 추가적인 정보를 제공하고 오류를 방지하는 역할을 한다. 스프링에서 많이 사용된다고 하니 어떤 녀석인지는 알아두도록 하자.