다음 글은 Thinking in Java(Bruce Eckel 저)와 Clean Code(로버트 C. 마틴 저)를 참고하여 작성하였습니다. 틀린 부분 혹은 피드백이 있다면 댓글 남겨주시면 감사하겠습니다.
___
모든 프로그래밍 언어에서는 추상화(abstraction)를 제공[1]한다. 명령형 언어인 C를 예로 들면 크게 데이터와 제어, 두 가지를 추상화했다고 할 수 있다.
- 데이터 추상화
- 컴퓨터에 저장되는 비트(0, 1) 및 메모리 공간 관점이 아닌 사람의 관점에서 데이터를 정의
- 예를 들어, 변수의 경우 타입과 변수명으로 정의
- 제어 추상화
- 실제 컴퓨터 내에서 반복은 CPU의 이동 명령(GOTO)을 통해서 구현
- for, while 등으로 반복의 개념을 추상화
즉 컴퓨터 공학에서의 추상화란 세부 구현을 숨김으로써 컴퓨터가 아닌 사람의 관점에서 바라본 것으로 이해할 수 있다. 또한 이러한 추상화의 필요성으로는 코드의 재사용성과 가독성으로 인한 생산성 증가를 들 수 있음을 쉽게 이해할 수 있다.
특히 객체지향 언어인 자바는 4대 특성[2] 중 하나로 추상화가 들어갈 정도로 그 중요성이 강조된다. 자바에서는 인터페이스와 추상 클래스를 통해[3] 추상화를 구현할 수 있는데, 이러한 공통 인터페이스가 필요한 이유는 같은 인터페이스에 대하여 각 서브 타입(파생 클래스)마다 다른 내용을 실행할 수 있도록 하기 위함이다. 클린 코드 1장에는 아래와 같은 내용이 언급되어 있다.
오랜 경험 끝에 나는 모든 프로그램이 아주 유사한 요소로 이뤄진다는 사실을 깨달았다. 한 가지 예가 '집합에서 항목 찾기'다. 직원 정보가 저장된 데이터베이스든, 키/값 쌍이 저장된 해시 맵이든, 여러 값을 모아놓은 배열이든, 프로그램을 짜다 보면 어떤 집합에서 특정 항목을 찾아낼 필요가 자주 생긴다. 이런 상황이 발생하면 나는 추상 메서드나 추상 클래스를 만들어 실제 구현을 감싼다. 그러면 여러 가지 장점이 생긴다. 첫째, 실제 기능 외에 다른 코드는 추상 클래스나 추상 메서드가 제공하는 기능을 사용할 수 있으므로 '진짜' 문제에 신경 쓸 여유가 생긴다. 둘째, 실제 구현은 언제든지 바꿀 수 있으므로 지금은 간단하게 재빨리 구현했다가 나중에 필요할 때 바꾸면 된다(p14).
___
1. 추상화의 정도는 얼마나 프로그래밍 언어가 높은 수준인지를 정의한다. 예를 들면 명령형 언어인 C는 어셈블리어를 추상화한 것으로 추상화 수준이 낮아서 우리가 해결하려는 문제 구조보다는 여전히 컴퓨터 구조의 관점에서 생각해야 한다.
2. Abstraction, Encapsulation, Inheritance, Polymorphism
3. Java8] Interface vs. Abstract class
___
참고자료
'공부 > Java' 카테고리의 다른 글
날짜 유효성 검사 (0) | 2022.01.17 |
---|---|
출력 (0) | 2021.08.13 |
자바 다형성 (0) | 2020.12.14 |
오류 코드보다 예외를 사용하라! (0) | 2020.12.12 |
Java 8 참고자료 (0) | 2020.11.28 |
댓글