18. 인터페이스
인터페이스는 클래스의 기능을 확장하게 해주는 역할을 한다.
인터페이스는 모든 프로퍼티와 함수를 구현해줄 수 있지만, 꼭 그래야 하는 것은 아니다.
만약 구현된 부분이 있다면 그 인터페이스를 사용하는 클래스가 오버라이딩을 할 수도 있다.
============================================================================
Drivable이라는 인터페이스를 생성해보자.
Drivable 인터페이스 안에는 maxSpeed, drive함수(함수가 구현되지 않아서 함수 헤드만 존재한다.), brake함수가 있다.
Car에서 Drivable 인터페이스의 기능을 확장하고 싶다면 인터페이스에 있는 프로퍼티를 구현해야 한다.
위는 Car클래스에 Drivable 인터페이스를 확장했지만 프로퍼티를 구현하지 않았기 떄문에 에러가 발생한다.
아래 코드에서 maxSpeed라는 프로퍼티를 확장시킬 클래스 "Car"의 생성자 안에 구현했고,
String형태의 drive함수를 구조에 맞게 구현해준다.
Car 클래스가 Drivable 인터페이스를 확장하기 때문에 변수와 함수를 구조에 맞게 구현해야한다.
따라서 프로퍼티(maxSpeed)는 Car클래스 생성자에서 구현했고, drive함수는 구조에 맞게 구현했다.
============================================================================
위 코드의 인터페이스나 슈퍼 클래스에서 구현된 super.brake()는 실행이 된다.
더하여 그 후에 추가한 함수 brake 또한 실행이 된다.
인터페이스를 구현하는 클래스의 서브 클래스도 똑같이 인터페이스를 구현하는 것이다.
하나 더 추가하면 인터페이스는 다른 인터페이스에서도 상속받을 수 있다.
왜? 인터페이스를 사용해야할까
바로 구현하지 않고 나중에 구현하고 싶은 특정 함수와 클래스 프로퍼티가 있다면 유용하다.
또는 구체적인 함수 body를 만들고 싶지 않을 때 사용한다.