JAVA - Interface 관련 정리 및 JAVA 8에서의 Default, Static
들어가기 앞서
정확한 개념의 이해는 아주 중요하다고 느끼는 요즘 헷갈렸던 부분(default 관련)들이 있어 이번 기회를 통해 인터페이스에 관한 내용들을 정리하려고 한다.
인터페이스란?
자바의 객체 지향 프로그래밍의 장점인 다형성을 구현하는 방법 중 하나이다. 인터페이스는 추상 클래스보다 추상화 정도가 높아 추상 클래스와는 달리 몸통(바디)을 갖춘 일반 메서드와 멤버 변수를 가질 수 없다. 기능을 명시적으로 선언하는 역할로 추상 메서드와 상수로만 이루어져 있다.
컴파일 과정에서 인터페이스의 변수는 상수(public static final)로 메서드는 추상 메서드(public abstract)로 변환된다.
비유적으로 추상클래스는 부분적으로 완성된 미완성 설계도이고 인터페이스는 밑그림만 그려져 있는 기본 설계도라 이해하면 편한다.
인터페이스 다중 상속
자바에서는 다중 상속이 안되지만 이를 해결하기 위해 인터페이스로 부터의 다중 상속이 가능하다.
인터페이스는 인터페이스로부터만 상속 받을 수 있다. (클래스는 다중 상속 x)
public interface MyInterface extends X, Y {
}
다중 상속시에는 extends 키워드를 통해 받고 , 로 구분해서 나열한다.
public class MyClass extends PMyClass implements MyInterface {
}
클래스에서의 상속(extends)과 인터페이스의 구현(implements)을 동시에 할때는 다음과 같이 한다.
자바 8에서의 default, static
자바8부터는 디폴트메서드와 정적메서드가 추가되었다. 하나씩 정리해보자.
public interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ){
//구현부
}
//정적 메소드
static 타입 메소드명(매개변수) {
//구현부
}
}
상수 - 인터페이스에서 정한 값을 참조해라 (절대적)
추상메서드 - 구현해야 될 메서드를 가이드만 해줌. 오버라이딩해서 재구현해야함(강제적)
디폴트메서드 - 인터페이스에서 기본적으로 제공해줌(바디부분 구현가능), 하지만 변경시에는 오버라이딩해서 구현 내용 변경 가능함(선택적)
정적메서드 - 인터페이스에서 제공해주는 것으로 무조건 사용(절재적), 사용시 클래스명이 아닌 인터페이스명.메서드로 호출해야한다.
추상메서드? 디폴트메서드?
디폴트메서드는 왜 생겼을까? 당연 장점이 있으니 생겼겠지만 바로 딱 와닿지 않을 수 있어 예시를 들어본다.
만약 추상메서드로만 이루어진 A 인터페이스가 있다고 가정해보자. B라는 서비스는 A 인터페이스(스팩)를 꼭 구현해야된다는 가정하에 갑자기 추가적으로 기능이 필요하다고 할때 추상메서드를 추가하게 되면 이를 implements하고 있는 모든 클래스에서 강제적으로 추상메서드를 구현해야한다. 구현하지 않는다면 전부 에러가 발생한다.
바로 이때 default메서드를 쓰게되면 이러한 상황에서 유연함을 더할 수 있다. default메서드를 쓰게 된다면 A 인터페이스를 implements하고 있는 모든 클래스에서 구현하는 것이 아닌 추가적으로 생긴 기능을 필요로하는 곳에서만 default메서드를 그대로 사용하든 아니면 내용에 차이가 있다면 재정의해서 사용하면 된다.