1. 추상화
- 메소드를 무조건 재정의하게 만든다.
- 추상화의 목적은 사용방법이 동일한 메소드를 만들기 위해서다.
추상 클래스(Abstract Class)
- 미완성 설계도이며 인스턴스를 생성할 수 없다.
- 미완성 메서드(추상 메서드)를 포함하고 있는 클래스다.
- 생성자와 일반 구현메소드도 보유할 수 있다.
- abstract 키워드를 사용해서 정의할 수 있다.
- 보편적으로 인터페이스와 구현클래스의 중간역할을 한다. 중간 구현을 담당함으로써 구현클래스의 구현부담을 감소해준다.
- 추상 클래스는 new 키워드를 사용해 객체를 생성할 수 없다.
추상 메소드 (Abstract Method)
-
메소드의 구현부가 없는 메소드다.
-
abstract 키워드를 사용해서 정의할 수 있다.
-
추상클래스와 인터페이스만 추상메소드를 보유할 수 있다.
-
추상 메서드의 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.
public abstract class Printer {
public abstract void print(); // 추상메소드
}
-
구현 클래스
- 추상 클래스를 상속받은 클래스다. 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해야한다.
- new 키워드를 사용해서 객체생성할 수 있다.
-
구현 메소드
- 추상 메서드를 재정의한 메서드다.
- 메소드의 구현부가 있는 메소드다. (구현부가 있고, 수행문이 하나도 없어도 구현 메소드다.)
2. 인테페이스
- 일종의 추상클래스다. 추상클래스보다 추상화 정도가 높아서 오직 추상메서드와 상수만을 멤버로 가질 수 있다. 다른 요소는 허용하지 않는다.
- 인터페이스에는 구현 클래스가 구현할 기능에 대한 명세(규격에 대한 정의)가 정의되어 있다.
- 추상클래스가 부분적으로만 완성된 '미완성 설계도'라면, 인터페이스는 밑그림만 그려져 있는 '기본 설계도'다.
- 접근제어자로 public, default만 사용할 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
- 인터페이스는 다중상속이 가능하다.
- implements 키워드를 사용한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
- 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상클래스로 선언해야 한다.
- 인터페이스의 메소드를 너무 한 곳에 몰아서 정의하면 구현 클래스가 구현하지 못할 상황이 올 수도 있기 때문에 인터페이스는 가급적 분리하는 것이 좋다.
- 다양한 조합과 확장성을 위해 인테페이스는 분리되어야 한다.
- 인터페이스를 통해 구현클래스의 기능을 짐작할 수 있다.
디폴트 메서드
- 인터페이스에 추상 메서드를 추가해야할 때 default 키워드를 붙이면 구현클래스를 변경하지 않아도 된다.
새로 추가된 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌하는 경우 해결하는 방법은 다음과 같다.
- 여러 인터페이스의 디폴드 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴드 메서드를 오버라이딩해야 한다.
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
인터페이스 멤버 제약사항
- 모든 멤버변수는 public static final이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.
(Java 8부터 deflut메소드, static 메소드도 가능해졌다.)
인터페이스를 이용한 다형성
- 인터페이스는 이를 구현한 클래스의 조상이라 할 수 있다.
- 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
인터페이스의 장점
- 개발시간을 단축시킬 수 있다.
- 표준화가 가능하다.
- 서로 관계없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.
- 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 독립적인 프로그래밍이 가능하다.
마크업 인터페이스
- 추상메소드가 하나도 없는 인터페이스
- 네트워크로 주고받을 수 있는 인터페이스라고 표시하는 목적의 인터페이스다.