서론
객체지향 프로그래밍에서 '추상화 수준'은 코드의 가독성과 유지보수성을 크게 향상시킬 수 있는 중요한 개념입니다. 이 글에서는 추상화 수준이 무엇인지, 왜 중요한지, 그리고 어떻게 적용할 수 있는지 살펴보겠습니다.
객체지향 프로그래밍
객체지향 프로그래밍(OOP)은 소프트웨어 개발의 주요 패러다임 중 하나로, 프로그램을 객체들의 모임으로 구조화하는 프로그래밍 방식입니다. 이 방식은 실제 세계를 모델링하여 소프트웨어를 설계하고 구현하는 데 효과적입니다.
객체지향의 핵심 개념
a) 객체(Object): 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶은 것.
b) 클래스(Class): 객체를 생성하기 위한 템플릿 또는 청사진.
c) 캡슐화(Encapsulation): 객체의 내부 구현을 숨기고 외부에서는 정의된 인터페이스로만 접근할 수 있게 하는 개념.
d) 상속(Inheritance): 기존 클래스의 특성을 새로운 클래스가 물려받아 재사용성을 높이는 메커니즘.
e) 다형성(Polymorphism): 같은 인터페이스나 메서드가 다양한 형태로 동작할 수 있게 하는 개념.
객체지향의 장점
- 코드 재사용성 증가
- 유지보수의 용이성
- 대규모 프로젝트에 적합한 구조
- 실제 세계를 모델링하기 쉬움
객체지향과 추상화
객체지향 프로그래밍에서 추상화는 복잡한 시스템을 단순화하고 필수적인 특징만을 강조하는 과정입니다. 이는 불필요한 세부사항을 제거하고 문제의 본질에 집중할 수 있게 해줍니다.
추상화는 인터페이스와 추상 클래스를 통해 구현될 수 있으며, 이를 통해 코드의 유연성과 확장성을 높일 수 있습니다.
추상화 수준과 객체지향
추상화 수준은 객체지향 설계의 품질을 결정짓는 중요한 요소입니다. 적절한 추상화 수준을 유지함으로써, 우리는 객체들 간의 관계를 더 명확히 정의하고, 각 객체의 책임을 적절히 분배할 수 있습니다.
추상화와 추상화 수준이란?
추상화는 복잡한 시스템에서 핵심적인 부분만을 골라내는 과정입니다. 객체지향 언어에서는 객체의 공통된 특성을 뽑아 일반화하는 것을 의미합니다.
추상화 수준은 객체나 메서드가 얼마나 일반적이거나 구체적인지를 나타내는 정도입니다. 높은 추상화 수준은 더 일반적이고, 낮은 추상화 수준은 더 구체적입니다.
추상화 수준의 중요성
- 코드 가독성 향상: 같은 추상화 수준의 코드는 읽기 쉽습니다.
- 유지보수성 개선: 각 객체나 메서드가 한 가지 일만 담당하게 되어 수정이 용이합니다.
- 테스트 용이성: 작은 단위로 나누어져 있어 단위 테스트가 쉬워집니다.
- 재사용성 증가: 잘 나누어진 기능은 다른 곳에서도 쉽게 재사용할 수 있습니다.
실제 예시 : 쇼핑시나리오
낮은 수준의 추상화 코드
public void goShopping() {
walkToStore();
grabShoppingCart();
findMilk();
findEggs();
goToCheckout();
payForItems();
walkHome();
}
이 코드는 너무 구체적이고 한 메서드가 여러 가지 일을 하고 있습니다.
높은 수준의 추상화 코드
public void goShopping() {
Store store = new Store();
ShoppingCart cart = store.getShoppingCart();
List<Item> items = store.getItems(Arrays.asList("milk", "eggs"));
cart.addItems(items);
store.checkout(cart);
}
이 코드는 각 객체가 자신의 책임만 수행하도록 되어 있어 더 읽기 쉽고 유지보수하기 좋습니다.
실제 예시 : 자동차 경주
낮은 수준의 추상화 코드
class Car {
private int position = 0;
private IntSupplier powerGenerator;
public void moveOnGeneratedPowerExceedsThreshold() {
if (powerGenerator.getAsInt() > 4) {
position++;
}
}
}
높은 수준의 추상화 코드
class Car {
private Position position;
private PowerGenerator powerGenerator;
public void move() {
if (powerGenerator.generatePower() > PowerThreshold.MOVE_THRESHOLD) {
position.increase();
}
}
}
class Position {
private int value = 0;
public void increase() {
value++;
}
}
interface PowerGenerator {
int generatePower();
}
추상화 수준 개선하기
a) 메서드 추출 : 긴 메서드를 여러 개의 작은 메서드로 나눕니다.
b) 새로운 클래스 도출 : 관련된 책임을 가진 메서드들을 새로운 클래스로 묶습니다.
c) 인터페이스 사용 : 구체적인 구현 대신 인터페이스를 사용하여 추상화 수준을 높입니다.
결론
추상화 수준을 일관되게 유지하는 것은 객체지향 프로그래밍의 핵심 원칙 중 하나입니다. 이를 통해 우리는 더 깔끔하고, 이해하기 쉬우며, 유지보수가 용이한 코드를 작성할 수 있습니다. 항상 "이 객체나 메서드가 한 가지 일만 하고 있는가?"를 질문하며 코드를 작성하고 리팩토링하는 습관을 들이면, 자연스럽게 좋은 추상화 수준을 유지할 수 있을 것입니다.
출처 : https://www.youtube.com/watch?v=1VwRtsLDiyM&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=4
'코딩공부 > 개발지식' 카테고리의 다른 글
디자인 패턴: 반복적인 문제상황에서 재사용 가능한 해결책 (0) | 2024.07.18 |
---|---|
SOLID 원칙: 객체 지향 프로그래밍의 다섯 가지 핵심 원칙 (0) | 2024.07.18 |
데이터베이스 인덱스(Index)의 이해와 활용 (0) | 2024.07.18 |
도커(Docker)와 쿠버네티스(Kubernetes)의 개념 (0) | 2024.07.17 |
Part 1. 전산기초 (0) | 2023.09.08 |