달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

추상클래스와 인터페이스의 차이를 명확히 이해하는 건 시간이 걸릴 것 같다.

나를 포함한 대부분의 초급 개발자들은 이게 뭐다(what)의 개념은 알고 있지만, 왜 사용해야 하며(why), 어떤 경우에(where)에 사용해야 하는지는 명확히 설명하지 못하고 있는 것 같다.

 

등장순서 : abstract -> interface

Java의 발전 역사를 알면 어떤 필요에 의해 저 개념들이 등장했는지 이해할 수 있을텐데 거기까지 조사하긴 귀찮다.

일단 추상클래스가 먼저 등장했고, 그 후 또 다른 필요성에 의해 인터페이스가 등장했다는 것 정도만 알아도 되겠다.

 

존재 이유

일반 상속 : 공통적으로 구현해야 하는 사항을 구현해 둠에 초점

추상클래스 : 공통적으로 구현해야 하는 사항의 개별적 구현에 초점

인터페이스 : 정의과 구현을 분리하기 위해 사용

 

<인터페이스>

인터페이스는 대충 거칠게 말하자면 어떻게 사용하겠다는 약속만 해두는 것이다.

구현은 처음에 정한 제약사항(구조)만 잘 지키면 어떻게 하든 상관없다.

 

이렇게 하면 뭐가 좋은가?

구현에 의존적이지 않은 코드를 만들 수 있어서 좋다. 구현된 코드가 맘에 안들면 갈아 끼우면 되는 식이다.

쉽게 예를 들면 인터페이스는 usb와 같은 규격이라고 말할 수 있다. usb포트를 지원하는 키보드라면 어떤 회사 제품이든 상관없이 꽂아서 쓸 수 있을테니까.

 

<추상클래스를 통한 상속 vs 일반클래스를 통한 상속>

일반 상속의 예 : 기존 스마트폰 v1모델에서 VR기능을 추가한 v2모델. 여기서 v2모델은 v1을 상속받아서 VR을 추가하면 된다.

추상클래스 상속의 예 : 동물이 있고, 그것의 하위로 개, 고양이, 원숭이가 있다. 이때 동물이 추상클래스가 된다.

차이가 뭐냐면... 일반상속의 부모가 되는 v1은 그것 자체로도 실체가 있지만, 추상클래스의 부모인 동물은 그것 자체로는 실체가 있는 것이 아니다. 즉, instance화 될 수 없다는 얘기.

 

 

아무튼 얕은 이해도를 바탕으로 정리하자면..

 상속은 "기존 것에 추가"

 추상클래스는 "공통점 묶음"

 인터페이스는 "약속"

정도로 보면 될 것 같다.

 

근데 이 주제는 사실 글만 보고 머리로 익힐 주제는 아닌 것 같다.

무수한 사례를 실무를 통해 겪어 보고 몸으로 체득해야 올바른 개념이 정립될 것이다.

이 주제에 한해선 현재의 지식이 옳고 그름은 중요하지 않다. 객체지향이나 디자인패턴은 설계에 관한 "철학"이라고도 할 수 있기 때문에 자신만의 설계에 대한 생각을 정립하고 있는지가 중요하다. 난 현재 가지고 있는 생각대로 설계하여 프로그램을 짤 것이고, 앞으로 잘못된 부분에 대해서 꾸준히 바로잡다 보면 어느순간 올바른 개념정립이 되어 있으리라고 본다.

(그러므로 이 글은 현재는 정확한 내용이 아닐 수 있으며, 추후 업데이트할 예정이다.)

:
Posted by 클레잇