오늘은 오랜만에 친누나가 집에왔다. 그래서 근황 개발토크 를 하다보니 시간이 정말 순식간에 지나갔다. 최근에 누나가 겪고있는 이슈는 무엇인지, 어떻게하면 그 이슈를 해결할 수 있을지, 내가 최근에 작업한 내용 공유 등등.. 이런저런이야기를 하다보니 세시간정도가 사라졌다.
대화를 하면서 내가 모르던 부분도 알 수 있었고, 누나가 모르던 부분을 알려줄 수도 있어서 좋았다. 뿐만아니라 내가 알고있는줄 알았지만, 설명할줄모르는 내용도 있었기에.. 아주 유익한 시간이었다.
독서: 추상클래스와 인터페이스
오늘의 독서는 추상클래스와 인터페이스에 대한 부분이다. 이에 관하여 과거에도 글을 읽어본 경험이 있는데, 당시에는 내가 명확하게 둘의 차이점과 존재의 필요성을 인지하지 못했다. 그리고 시간이 어느정도 지난 지금, 해당 내용을 다시보니 어느정도 와닿으면서 이해가 가는듯하다.
추상클래스와 인터페이스
추상클래스와 인터페이스는 정말 자주 이야기가 되는 듯하다. 코드 설계를 할때, 설계 원칙에 대해 이야기를 할때 등등 정말 많이 이야기과 되는 것 같다.
인터페이스를 사용하여 객체지향의 추상화, 다형성, 설계원칙을 구현할 수 있으며, 추상 클래스를 사용하여 객체지향의 다형성, 상속 등을 구현을 할 수 있다.
어느정도 공부를 해본 사람이라면, 여기까지는 크게 어렵지 않게 이해하고 받아들여질 수 있을 것 같다.(물론 나는 아니었지만..) 그런데 나는 "추상 클래스와 인터페이스가 각각 따로따로 필요한 것인가?" 이해를 하지 못했다.
추상클래스와 인퍼테이스의 차이점
추상클래스의 특징은 다음과 같다.
- 추상 클래스는 인스턴스화 할 수 없으며, 상속만 가능하다.
- 추상클래스는 속성과 메서드를 포함할 수 있다.
- 하위 클래스는 추상클래스를 상속할 때, 추상 클래스의 모든 추상 메서드를 구현해야한다.
다음으로, 인터페이스의 특징은 다음과 같다.
- 인터페이스는 속성을 포함할 수 없다.
- 인터페이스는 메서드를 선언할 수 있으나, 실제 코드 구현을 포함할 수 없다.
- 클래스가 인터페이스를 구현할 때는 인퍼테이스에 선언된 모든 메서드를 구현해야한다.
물론 Java 의 1.8 이후부터는 인터페이스의 메서드에 코드 구현이 포함될 수 있고, 정적 멤버 변수가 포함될 수 있으나, Java 를 제외하면 인터페이스는 위 특성을 그대로 갖고있다.
정리를해본다면, 문법적인 관점에서, 추상클래스가 속성과 메서드 구현을 정의할 수 있는 반면, 인터페이스는 속성을 정의하거나 메서드에 실제 코드 구현을 포함할 수 없다.
이와같은 문법적인 차이점 이외에도 설계적인 관점에서 차이점이 존재한다. 추상클래스는 상속 관계(Is-a) 관계이지만, 인터페이스는 특정 기능이 있음을 나타내는 has-a 관계이다.
추상 클래스는 왜 필요할까?
추상 클래스는 상속을 할 수 있고, 상속을 통해, 코드의 재사용성을 증진시킬 수 있음을 의미한다. 하지만 이는 일반 클래스를 상속함으로써 얻을 수 있는 이점이기도하다. 그럼 왜 일반 클래스가아닌 추상 클래스를 사용하는 것일까?
추상클래스는 다형성을 얻을 수 있다. 추상 메서드를 다양하게 구현할 수 있기 때문이다. 물론 누군가는 일반클래스에서도 추상 메서드처럼 빈 메서드를 정의하고, 하위 클래스에서 구현하면되는 것아니냐? 할 수 있지만, 그럴바엔 추상클래스를 쓰는게 훨씬 낫다.
- 추상 메서드는 구현을 강제하지만, 일반클래스의 빈 메서드는 비어있어도 컴파일에러가 발생하지 않는다.
- 빈 메서드를 가진 클래스인 경우, 인스턴스를 생성할 수 있으며, 이는 오용될 가능성이 발생한다.
인터페이스는 왜 필요할까?
인터페이스는 일련의 계약(API)라고 할 수 있다. 즉 이는 동작의 추상화이다. 인터페이스를 사용함으로써, 호출자는 추상 인터페이스에만 주의를 기울이며, 구현 방식 자체에 대해서는 알 필요가 없다. 따라서, 인터페이스는 규칙과 구현의 분리를 실현하여, 코드의 결합 정도를 줄이고(디커플링) 코드의 확장성을 향상 시킬 수 있기 때문에 인터페이스는 필요하다.
이렇게 정리를하다보니, 이거 차라리 따로 포스팅으로 정리 하는 것이 좋을 것같다... 자꾸만길어진다..!
Product 작업내용 반영
오늘은 Product
'회고 > TIL' 카테고리의 다른 글
3시간의 짧고 재밌었던, 최종 인터뷰 후기 (0) | 2023.10.13 |
---|---|
기술 인터뷰 후기 (0) | 2023.10.06 |
Optional 정리, Product DataAccess 계층 내, 다양한 Product 의 속성 값을 가지고 조회할 수 있는 유스케이스를 추가한다. PR 작성, 독서 (0) | 2023.09.19 |
기술면접 준비, Product DataAccess 계층 내 유스케이스 추가, 육각형개발자 독서: 아키텍처 (0) | 2023.09.18 |
한주 마무리, 동적쿼리 개발, Optional 에 관하여 (0) | 2023.09.17 |