추상화란 무엇인가? 🤔
프로그래밍에서 추상화는 복잡한 데이터, 구조, 시스템 등에서 핵심적인 부분만을 추출해 덜 자세하게 만드는 과정을 말한다. 즉, 불필요한 세부사항이나 절차를 감추고, 인터페이스를 통해 간단한 접근만 가능하도록 하여 시스템의 복잡도를 줄이는 방법이다. 추상화는 복잡한 시스템을 더 쉽게 다룰 수 있게 해주기 때문에, 개발에서 매우 중요한 개념이라고 할 수 있다.
사실, 내가 이 추상화 개념을 저번 달에 공부한 Spring Boot 강의에서 자주 접했었기 때문에, 이 개념이 좀 더 쉽게 와닿았다. 특히, Spring Boot의 구조에서 인터페이스와 클래스들이 어떻게 추상화되어 있는지를 보면서 추상화가 왜 중요한지 조금 더 이해할 수 있었다.
데이터 추상화 🐱🐶🐵
데이터 추상화는 특정 데이터들의 공통점만을 모아내고, 차이점은 버리는 방식이다. 예를 들어, 고양이, 강아지, 원숭이와 같은 동물들을 생각해보자. 이 동물들은 모두 "동물"이라는 큰 범주에 속할 수 있는데, 그럼 이들을 동물이라는 카테고리로 묶을 수 있다. 즉, 고양이, 강아지, 원숭이는 공통적으로 동물이라는 특징을 가지므로, 이를 하나의 추상화된 객체로 묶을 수 있다.
자바 코드를 예로 들면, Animal
이라는 추상화 클래스에서, "잠을 자는 소리"는 모든 동물들이 똑같이 "zzz"라는 소리를 낸다고 정의할 수 있다. 하지만 "울음소리"는 동물마다 다르게 나오기 때문에, 울음소리는 각 동물 클래스에서 따로 구현된다. 이렇게 공통적인 특징은 추상화 클래스로 묶고, 각기 다른 부분은 개별 클래스로 구현하는 방식으로 데이터를 추상화할 수 있다.
abstract class Animal {
abstract void sound(); // 울음소리
void sleep() {
System.out.println("zzz");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
이렇게 sound
는 각 동물마다 다르게 구현되고, sleep
은 모든 동물들이 공통적으로 "zzz"를 출력하는 방식으로 추상화된다.
그런데, 왜 데이터를 이렇게 추상화하는 걸까? 이게 정말 필요한 걸까? 내가 생각했을 때, 코드가 복잡하지 않게 유지되면서도 재사용성이 증가하기 때문이다. 예를 들어, sleep()
메서드는 모든 동물에게 공통적으로 적용될 수 있고, 각 동물에 대해 울음소리만 다르게 구현하면 되기 때문에 코드가 더 깔끔하고 유지보수도 쉬워진다.
프로세스 추상화 🖥️
프로세스 추상화는 내부 프로세스를 숨기는 것을 의미한다. 즉, 우리가 실제로 어떤 프로세스가 어떻게 동작하는지 모르더라도, 그 프로세스를 처리할 수 있는 단순한 인터페이스를 제공하는 것이다.
예를 들어, 우리가 데이터베이스에 데이터를 저장한다고 할 때, 데이터베이스가 어떻게 데이터를 저장하는지에 대한 세부적인 구현을 알 필요는 없다. 우리는 단순히 insert
, update
와 같은 쿼리만 알고 있으면 된다. 실제로 데이터베이스가 내부적으로 어떻게 데이터를 처리하는지, 어떤 방식으로 저장되는지에 대한 세부사항은 우리가 알 필요가 없는 것이다.
class Database {
void insert(String data) {
// 실제 데이터베이스에 데이터를 삽입하는 과정
System.out.println(data + " 데이터 삽입");
}
void update(String data) {
// 데이터베이스에서 데이터를 수정하는 과정
System.out.println(data + " 데이터 수정");
}
}
public class Main {
public static void main(String[] args) {
Database db = new Database();
db.insert("사용자 정보");
db.update("사용자 정보");
}
}
우리는 단순히 insert()
나 update()
와 같은 메서드만 사용하면 되지만, 실제로 데이터가 어떻게 저장되는지, 수정되는지에 대해서는 신경 쓸 필요가 없다. 이런 식으로 프로세스의 세부적인 구현을 추상화하면, 사용자는 복잡한 내부 동작을 신경 쓰지 않고, 오직 필요한 작업만을 수행할 수 있게 된다.
이렇게 추상화를 통해 복잡한 세부 사항을 감추고 필요한 기능만 제공함으로써, 개발자에게 더 단순하고 직관적인 인터페이스를 제공할 수 있다.
추상화는 프로그램을 더 간결하게 만들고, 유지보수가 쉬운 구조로 만들어준다. 그러나 그 과정에서 내부의 세부 구현이나 프로세스가 어떻게 동작하는지에 대해 고민하지 않아도 되기 때문에, 이를 적절하게 활용해야 한다는 점에서 고민이 될 때도 있다. 이 개념이 잘 활용되면, 정말로 효율적이고 깔끔한 코드가 만들어질 수 있을 것이다.
'CS 공부' 카테고리의 다른 글
# JIT 컴파일러 (1) | 2025.02.16 |
---|---|
# 오버헤드와 가비지 컬렉션 (1) | 2025.02.16 |
# 오버로딩과 오버라이딩 (0) | 2025.02.16 |
# static 키워드 (0) | 2025.02.16 |
# 클래스와 객체, 인스턴스 (0) | 2025.02.16 |