CS 공부

# 추상화란 무엇인가?

박태정 입니다. 2025. 2. 16. 03:03
반응형

추상화란 무엇인가? 🤔

프로그래밍에서 추상화는 복잡한 데이터, 구조, 시스템 등에서 핵심적인 부분만을 추출해 덜 자세하게 만드는 과정을 말한다. 즉, 불필요한 세부사항이나 절차를 감추고, 인터페이스를 통해 간단한 접근만 가능하도록 하여 시스템의 복잡도를 줄이는 방법이다. 추상화는 복잡한 시스템을 더 쉽게 다룰 수 있게 해주기 때문에, 개발에서 매우 중요한 개념이라고 할 수 있다.

사실, 내가 이 추상화 개념을 저번 달에 공부한 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