상속 관계에서 부모 클래스의 역할은 갖기 위한 클래스이며 추상 메소드와 일반 메소드를 가질 수 있다.
추상 메소드는 메소드의 몸체가 없는 메소드이며 자식 클래스에서 재정의 하도록 하기 위한 메소드다.
추상 클래스는 new동적 할당자를 통해 인스턴스 객체를 만들 수 없다.
생성자,필드,메소드 선언을 할 수 있다.
(생성자는 상속관계로 오버라이딩 할 떄 자식 클래스에서 생성자 호출이 있을 수 있으므로 생성자 호출이 가능하다)
부모 클래스 역할만 한다. 일반 메소드도 가질 수 있고 필드도 가질 수 있다.
추상 클래스는 인스턴스화 되지 않는다.
이 부분은 그렇게 되면 어찌 설명 되는가? -> Shape이라는 클래스를 호출하는 자식 클래스의 생성자가 호출한다.
인터페이스는 일반적으로 추상 메소드만 가지며 Interface 키워드를 이용해 정의한다.
특정 클래스가 인터페이스를 구현하기 위해서는 implements 키워드를 통해 구현한다.
상속과 달리 인터페이스는 하나의 클래스가 둘 이상의 인터페이스를 동시에 구현 할 수 있다.
인터페이스를 통해 설계와 구현을 완전히 분리 할 수 있다.
인터페이스에는 필드, 추상메소드, Static메소드, default메소드를 정의할 수 있다.
인터페이스에 정의하는 모든 필드는 public static final(사용자 정의 상수)이 자동으로 적용된다.
Java8부터 인터페이스에 static메소드를 추가할 수 있으며, static 메소드의 사용은 일반 클래스와 동일하다.
Java8부터 default 메소드가 추가 되었으며 이 메소드는 그 자체로 완전한 메소드이며, 구현 클래스는 선택적으로 재정의 할 수 있다.
생성자를 가질 수 없으며, 추상메소드로 구현한다.
서로 다른 부모 클래스를 갖는 클래스간에도 같은 인터페이스를 구현할 수 있다.
같은 인터페이스를 구현하고 있는 클래스간에는 그 인터페이스로 하여금 대표성을 갖게 할 수 있따.
인터페이스만 인스턴스화 x
하나의 프로그램의 다수의 클래스들이 서로 관계를 형성하게 되고 각 클래스들은 역할에 따라 구분한다.
클래스들간에 관계를 밀접하게 구성하게 되면 특정 클래스에서 변경이 일어날 경우 많은 클래스들이 영향을 받는다.
따라서 클래스 간에 관계를 구성할 때 관계를 느슨하게 관리하는것이 중요하다.
클래스와 클래스 사이에 인터페이스를 구성하면 직접적인 접근이 없는 느슨한 관계를 구성할 수 있다.