default 접근 제한
클래스를 선언할 때 public을 생략했다면 클래스는 default 접근 제한을 가집니다. 클래스가 default 접근 제한을 가지면 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한됩니다.
public 접근 제한
클래스를 선언할 때 public 접근 제한자를 붙였다면 클래스는 public 접근 제한을 가집니다. 클래스가 public 접근 제한을 가지면, 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있습니다. 클래스를 다른 개발자가 사용할 수 있도록 라이브러리 클래스로 개발한다면 반드시 public 접근 제한을 갖도록 해야 합니다. 인터넷으로 배포되는 라이브러리 클래스도 모두 public 접근 제한을 가지고 있습니다.
Interface와 Abstract Class는 상속(extends)받거나, 구현(implements)하는 Class가 Interface나 Abstract Class 안에 있는 Abstract Method를 구현하도록 강제하는 공통점을 가지고 있습니다.
Interface는 부모, 자식 관계인 상속 관계에 얽메이지 않고, 공통 기능이 필요 할때, Abstract Method를 정의해놓고 구현(implements)하는 Class에서 각 기능들을 Overridng하여 여러가지 형태로 구현할 수 있기에 다형성과 연관되어 있습니다.
Interface는 해당 Interface를 구현하는 Class들에 대해 동일한 method, 동작을 강제하기 위해 존재합니다.
Java에서 다중 상속이 안되어 발생하는 Abstract Class의 한계도 보완해줄 수 있다. Interface의 implements에는 제한이 없어 다중 구현이 가능합니다.
하지만 모든 Class가 Interface를 이용한다면, 공통적으로 필요한 기능도 implements하는 모든 Class에서 Overrindg해 재정의해야 하는 번거로움이 존재합니다.
Interface는 각각 다른 Abstract Class를 상속하는 Class들의 공통 기능을 명시할때 사용하면 편리합니다.
Abstract Class는 부모와 자식 즉, 상속 관계에서 Abstract Class를 상속(extends)받으며 같은 부모 Class(여기서는 Abstract Class)를 상속받는 자식 Class들 간에 공통 기능을 각각 구현하고, 확장시키며 상속과 관련되어 있습니다.
상속은 SuperClass의 기능을 이용, 확장 하기 위해 사용됩니다.
Abstract Class는 IS - A "~이다"이고, Interface는 HAS - A "~을 할 수 있는"입니다.
cf) IS - A: 일반적인 개념과 구체적인 개념의 관계입니다.
cf) HAS - A: 포함 관계
Abstract Class를 상속하며 Class들간의 구분이 가능해집니다.
Java에서는 다중 상속을 지원하지 않기 때문에 Abstract Class 만으로 구현해야하는 Abstract Method를 강제하는데는 한계가 존재합니다.