자바를 기준으로 설명합니다. 하지만 객체지향언어에선 대부분 비슷할 것이라고 생각됩니다.
본인이 웹 개발을 공부하며 느끼고 이해한 내용에 대해 말합니다.
문법적으로 먼저 보면, 인터페이스는 상수와 추상메소드만 존재하는 추상클래스이다.
추상메소드라는 것은 메소드의 선언부만 있고, 몸통부분은 없는 메소드이다.
(java8부터? 유지보수의 편의를 위해 default, static메소드 등도 포함되었다)
public abstract class MyInterface {
public abstract void run();
}
// 실제로 인터페이스는 인터페이스 키워드를 사용한다.
public interface MyInterface {
public void run(); // 컴파일러가 추상메소드로 바꿔준다.
}
이렇게 얘기해서는 감이 잘 안올 것이다.
<aside> 💡 먼저 추상화에 대해 생각해보자.
예를들어 일반적인 컴퓨터를 사용할 때는 윈도우와 Mac같은 GUI OS를 사용한다. 이 OS를 뜯어보면 실제 로직은 커널을 조작하는 명령어가 있을 것이다. 또 이 명령어는 전기 신호로 변환되어 cpu에서 동작할 것이다.
이렇게 전기 신호를 명령어로 추상화하고, 명령어를 다시 GUI환경으로 추상화 한 것이다.
이렇게 추상화를 하면, 추상화 단계의 최상단에 있는 사용자는 내부 로직이 바뀌더라도 이전과 동일하게 사용할 수 있다.
애플의 인텔 맥과 ARM 맥은 사용자 입장에서 큰 변화 없이 동일하게 사용할 수 있다.
</aside>
<aside> 💡 다형성은 뭐냐? 한 가지 타입으로 여러가지 구현체를 사용할 수 있는 것이다.
예를들어 닌텐도 스위치를 쓴다고 하자. 마리오 게임용 닌텐도 스위치, 젤다 게임용 닌텐도 스위치를 따로 사지 않아도 닌텐도 스위치 하나에서 모든 게임을 동작시킬 수 있다.
브라우저도 마찬가지이다. 네이버용 브라우저, 구글용 브라우저, 유튜브용 브라우저 따로 만들지 않는다. 한가지 브라우저로 모든 웹사이트를 이용할 수 있다.
자동차 운전면허도 현대 운전면허, 포드 운전면허, 벤츠 운전면허가 존재하지 않는다.
사용자는 각 상황에 맞는 스위치, 브라우저, 운전면허를 알 필요가 없다. 대표적인 하나만 알고 있으면 되는거다.
</aside>
많은 이유가 있겠지만 본인이 쓰면서 가장 몸소 느낀바는 다형성이다.
유지보수의 편의를 위해서다. 기존의 코드의 로직이 변경될 때 변경되는 부분을 최소화 시키기 위해 한단계 추상화 하는 것이다.
http://tcpschool.com/deep2018/deep2018_deeplearning_framework