Why Abstraction??
우리는 이전의 글을 통해 Abstraction의 개념을 간략하게 이해했습니다.
Abstraction(추상화) 기본 개념 - 1편
Abstraction(추상화)란? 자바에서는 추상클래스 , 추상메서드 , 추상화 등 "추상"이라는 말이 자주 쓰입니다. 또한 Abstract으로 선언된 클래스 , 메서드 등을 보고 추상화시켰다 합니다. 그렇다면 추상
masiljangajji-coding.tistory.com
추가적으로 다음 글을 읽는 것을 추천드립니다.
Specification 기본 개념 및 활용
Specification 프로그램에서 터지는 버그는 대부분 동작에 대한 오해로 발생합니다. 이러한 동작의 오해를 줄이기 위한 대표적인 방법으로 Spec(명세)이 존재합니다. 또한 완성된 프로그램은 필수적
masiljangajji-coding.tistory.com
이 글에서는 이전 글과 비슷한 내용을 다루되 더욱 세세한 부분을 보려고 합니다.
Abstraction을 하게되면 얻을 수 있는 핵심 이점은 다음과 같습니다.
- 시스템을 구성 요소 또는 모듈로 나누어 재사용할 수 있다록 한다.(Modularity 모듈성)
- 모듈 주의에 벽을 구축하여 모듈이 자체적으로 책임지고 시스템의 다른 부분에서 발생한 버그가 모듈의 무결성을 손상시킬 수 없도록 한다.(Encapsulation 캡슐화)
- 모듈의 구현 세부사항을 숨겨 세부사항을 변경해도 시스템의 나머지 부분을 변경하지 않아도 된다. (Imformation Hiding)
- 기능을 모듈의 책임으로 만들어 여러 모듈에 걸쳐 분산되지 않도록 한다. (Separation of Concerns 관심사분리)
어떻게 이런 일이 가능한 것일까요??
자바에서 제공하는 List에 대해서 보겠습니다.
ArrayList , LinkedList 둘 다 List Interface를 상속받아 구현하는 방식으로 설계돼있습니다.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
LinkedList
지금부터 이러한 구조의 이점을 알아보겠습니다.
List Interface
List라는 타입이 필수적으로 가져야 하는 연산을 명시한 것입니다.
연산에대한 간단한 Specification을 명시한 것이죠
따라서 우리는 앞으로 List라는 타입이 가져야하는 연산을 알 수 있습니다.
(List에 명시돼있는 size , isEmpty , contains 연산의 Specification)
사용자는 List의 구현체를 보지 않아도 , 즉 내부적인 구현이 어떤식으로 이루어져있는지 몰라도
간단한 Spec만으로 충분한 사용이 가능해집니다. (Imformation Hiding)
사용자가 List 내부구현에 의존하지 않고 사용하기 떄문에 갑작스럽게 List 구현체의 내부구현을 바꾸더라도
아무런 문제가 발생하지 않을 것 입니다. (Encapsulation)
Spec을 명시함으로써 자연스럽게 연산의 구조를 알 수 있게됐고 이를통해 세세한 메서드 분리가 가능해집니다.
이는 PreCondition , PostCondition 같은 조건들을 제공하고 Unit Test를 돕습니다.
후에 배열구조나 노드구조를 사용하지 않는 새로운 구조의 List를 만든다고 했을때도
List Interface를 재사용 함으로써 코드의 재사용성을 증가시킬 것 입니다. (Modularity)
List이외에도 Collection FrameWork 안에있는 Abstract Data Type은 Interface를 두고 구현체를 따로 두는 방식을 채택합니다.
이러한 방법은 쓸대없는 일을 여러번 하는 것 처럼 보이지만 실제로는 위에서 기술 한 것처럼 많은 이점이 있는것이죠
Collection 의 Super Type으로 Iterable가 존재하는 것도 같은 이치입니다.
계속해서 강조하자면 Abstraction은 매우 큰 범위를 갖고있는 말입니다.
사용자에게 내부구현 정보를 숨기는 것 ... Abstraction
새로운 구조를 갖는 List가 필요할때 implements 받아 연산 정의 절차를 줄이는 것 ... Abstraction
무언가를 "간추린다" 면 전부다 Abstraction에 해당하기 떄문이죠
이 글에서는 Abstraction이 갖는 이점과 보다 세세한 관점에 대해서 다뤘습니다.
도움이 되셨다면 좋겠습니다.