오늘도 역시나 내 머리속에 있고 나 혼자서는 응~그치그치~ 하면서 이해할 수 있는 내용이지만, 남에게 설명하려면 입이 안 떨어지고 어버버하게되는 그런 과제였다. 그 과제가 뭐냐구요..?

  1. 인터페이스가 가지고 있는 객체 지향의 특징에는 어떤 것이 있는지
  2. 그렇게 생각하는 이유는 무엇인지

자! 오늘도 머리에 있는걸 열심히 끄집어 내보자🤯

내 머릿속에 있는 생각

객체지향의 특징에는 캡슐화, 추상화, 다형성, 상속이 있다. 인터페이스는 이 속성들 4가지를 모두 가지고 있다고 생각한다.

  1. 캡슐화
    • 인터페이스는 상수와 추상메소드만을 가질 수 있다.
    • 추상메소드만을 가질 수 있다는 것은 메소드의 구현을 클래스에게 위임하였다는 뜻으로, 각 기능의 정의와 구현을 분리하여 캡슐화를 한 것이다.
  2. 추상화
    • 인터페이스는 공통된 기능을 추출해서 정의한 것이기 때문에 추상화 되었다.
  3. 다형성
    • 인터페이스를 구현한 클래스라면, 인스턴스의 참조변수 타입을 인터페이스로 할 수있다.
  4. 상속
    • 인터페이스도 인터페이스를 상속받을 수 있다.

구글이 알려준 깔끔한 답

  1. 인터페이스의 캡슐화 : 객체는 상태와 행위를 하나로 묶은 후에 외부에서는 반드시 접근해야만 하는 행위만을 골라서 공용 인터페이스를 통해서 노출해야 한다. 그러므로 데이터 캡슐화는 인터페이스와 구현을 분리하기 위한 전제조건이다.

  2. 인터페이스의 추상화 : 인터페이스는 일종의 추상 클래스로, 추상 클래스와 다른점이 있다면더 높은 추상화 정도를 가지고 있다는 것이다.

  3. 인터페이스의 상속 : 인터페이스도 인터페이스로부터 상속받을 수 있으며 다중상속이 가능하다.

  4. 인터페이스의 다형성 : 클래스에서 인터페이스를 구현한다는 것은 인터페이스가 해당 클래스의 상위 클래스 위치에 있다는 뜻이다. 그래서 인터페이스 타입 참조 변수에 하위 클래스의 인스턴스를 생성할 수 있다.

번외 : 확장(extends)과 구현(implement)

인터페이스의 상속에 대해서 작성을 하려고 할 때 순간 멈칫했다. 인터페이스 입장에서 인터페이스를 상속 받는 것(확장)을 작성해야 하나, 인터페이스를 구현한 클래스의 입장(구현)에서 작성해야 하나 고민을 했다. 내가 알고 있는 상속의 뜻은 ‘기존의 클래스에 기능을 추가하거나 재정의 하는 것’이기 때문에 인터페이스 입장에서 작성하는 것이 더 적당하다는 결론을 내렸다.

확장과 구현에 대한 개념이 완벽하게 자리잡은게 아니라서 저런 고민을 한거 같다. 그래서 번외로 정리해보는 상속과 구현의 정의!(feat.구글)

  • 클래스의 계층을 표현하기 위해 상속이 만들어졌으며, 상속을 하게되면 하위 클래스는 상위 클래스의 멤버들을 모두 사용할 수 있다. 이때, 상위 클래스의 멤버를 새롭게 구현 하는가 / 그대로 사용 하는가에 따라서 상속의 형태가 나누어 진다.
  • extends : 상속의 대표적인 형태
    • 상위 클래스에서 멤버를 선언 및 정의한다.
    • 하위 클래스에서 상위 클래스 멤버를 그대로 사용하며, 필요시에는 오버라이딩하여 사용할 수 있다.
  • implements : 인터페이스 구현
    • 상위 클래스는 선언만 하여 가이드를 제공하며, 하위 클래스는 상위 클래스의 멤버를 오버라이딩하여 정의한다.
    • 하위 클래스에서 메소드의 구현이 강제된다.