[JAVA] 인터페이스 / 추상 클래스
인터페이스?
- 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
- 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용
- 다중 상속이 가능함. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있음
인터페이스에서 정의하거나 구현할 수 있는 4가지
public interface 인터페이스 명{
//상수
//인터페이스에서 값을 정해주며 ‘절대적으로’ 참조
타입 상수명 = 값;
//추상메소드
//가이드만 제공하며 해당 메소드를 오버라이딩해서 재구현해야 하는 방식임
타입 메소드명(매개변수,...);
//디폴트 메소드
//인터페이스에서 기본적으로 제공해주지만, 각자 구현해서 사용할 수도 있음
default 타입 메소드명(매개변수, ...){
//구현부
}
//정적 메소드
//인터페이스에서 제공해주는 것으로 '무조건' 사용
static 타입 메소드명(매개변수){
//구현부
}
}
추상클래스 (= 추상 메서드를 포함하고 있다)
- 추상클래스로는 인스턴스를 생성할 수 없다. 미완성 클래스이기 때문이다. (+ 미완성(추상) 메서드를 포함하고 있는 클래스)
- 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
- 새로운 클래스를 작성할 때 바탕이 되는 조상클래스가 된다.
'abstract'를 붙여 추상클래스를 만들 수 있다. 또는 'abstract'를 보고 추상메서드가 있으며 상속을 통해서 구현해야한다는 것을 알아야 한다.
추상 메서드
- 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨진 메서드이다.
- 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 미완성 상태로 남겨두는 것이다.
- 추상클래스를 상속받는 자손 클래스는 조상의 추상메서드를 상황에 맞게 구현해야 한다.
//주석으로 어떤 목적으로 기능을 수행할 것인지 설명을 붙인다.
abstract 리턴타입 메서드이름();
추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상(추상클래스)의 추상메서드를 모두 구현해야 한다.
if) 조상(추상클래스)으로부터 상속받은 추상메서드를 모두 구현하지 않고 하나라도 빼먹을 것 같다면, 상속받는 자손클래스도 abstract를 붙여 추상클래스로 지정해 주어야 한다.
+) 그렇다고 추상 클래스 안에 모두 추상 메서드로 작성할 필요는 없다. 내용이 달라질 것 같은 메서드만 추상메서드로 지정하고 사용해도 무관하다.
추상메서드를 사용하는 이유?
- 메서드가 실제로 어떻게 구현되어있는지 잘 몰라도 메서드의 이름, 매개변수, return타입만 알고 있으면 추상 메서드를 만들어 사용할 수 있으므로, 내용이 없더라도 추상메서드를 사용하는 코드를 작성하는 것이 가능하다.
- 추상메서드를 작성 시, 자손 클래스에 구현된 완성된 메서드가 호출되도록 할 수 있다.