Truck truck= (Truck)v1; 와 같이 명시적으로 자료형을 반드시 써 주어야 합니다. 상위 클래스로는 묵시적으로 형 변환이 되지만, 하위 클래스로 형 변환을 할때는 명시적으로 해야 하기 때문입니다.
추상 클래스는 항상 추상 메서드를 포함합니다.
추상 메서드는 구현 코드가 없습니다. 함수의 구현 코드가 없다는 것은 함수 몸체(Body)가 없다는 뜻입니다.
int add(int x, int y) {
return x + y;
}
구현 코드가 없는 인터페이스
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
int add( int num1, int num2 );
int substract( int num1, num2 );
int times( int num1, int num2 );
int divide( int num1, int num2 );
}
위 처럼 인터페이스에 선언한 메서드는 모두 구현 코드가 없는 추상 메서드입니다.
public abstract 예약어를 명시적으로 쓰지 않아도 컴파일 과정에서 자동으로 추상 메서드로 변환됩니다.
인터페이스에 선언한 변수는 모두 컴파일 과정에서 값이 변하지 않는 상수로 자동 변합니다.
public static final 예약어를 쓰지 않아도 무조건 상수로 인식합니다.
위와 같은 인터페이스를 클래스가 사용하는 것을 '클래스에서 인터페이스를 구현한다'라고 표현합니다.
인터페이스 구현과 형 변환
인터페이스를 구현한 클래스가 있을 때 그 클래스는 해당 인터페이스형으로 묵시적 형 변환이 이루어지며,
형 변환되었을 때 사용할 수 있는 메서드는 인터페이스에서 선언한 메서드 뿐입니다.
따라서, 인터페이스의 역할은 인터페이스를 구현한 클래스가 어떤 기능의 메서드를 제공하는지 명시하는 것입니다.
그리고 클라이언트 프로그램은 인터페이스에서 약속한 명세대로 구현한 클래스를 생성해서 사용하면 됩니다.
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
...
}
인터페이스는 추상 메서드로 이루어지므로 인스턴스를 생성할 수 없으며 멤버 변수도 사용할 수 없습니다.
위와 같이 변수를 선언해도 오류가 발생하지 않는 이유는 선언한 변수는 컴파일하면 상수로 변환되기 때문입니다.
default 메서드
인터페이스의 디폴트 메서드는 인터페이스에서 구현 코드까지 작성한 메서드입니다.
인터페이스를 구현한 클래스에 기본적으로 제공할 메서드라는 것입니다.
정적 메서드
정적 메서드는 인스턴스 생성과 상관없이 사용할 수 있는 메서드입니다.
그렇지만 인터페이스에 디폴트/정적 메서드를 추가했다고 해서 인스턴스를 생성할 수 있는 것은 아닙니다.
디폴트 메서드는 일반 메서드와 똑같이 구현하면 되고, 메서드 자료형 앞에 default 예약어만 써 주면 됩니다.
만약,
이미 인터페이스에 구현되어 있는 디폴트 메서드가 새로 생성한 클래스에서 원하는 기능과 맞지 않는다면, 하위 클래스에서 디폴트 매서드를 재정의 할 수 있습니다.
정적 메서드는 static 예약어를 사용하여 선언하며 클래스 생성과 무관하게 사용할 수 있습니다.