추상화란

Trace·2024년 6월 20일
0

Computer-Science

목록 보기
6/10

추상화의 의미

프로그래밍에서의 추상화는 복잡한 데이터, 구조, 시스템 등으로부터 핵심 만을 가려내 덜 자세하게 만드는 것, 또는 세부 사항, 절차 등을 감추고 인터페이스 등을 만드는 것으로 복잡도를 낮추는 방법을 말합니다.

추상화의 목적

  • 복잡성 감소
    • 시스템의 복잡 성을 줄이고 중요한 부분에 집중할 수 있도록 함
  • 코드 재 사용성
    • 공통적인 기능을 추출하여 재 사용 가능하도록 함
  • 유지보수성 향상
    • 코드가 더 명확하고 관리하기 쉬워짐

추상화의 종류

  • 데이터 추상화 (Data Abstraction)
    • 객체의 데이터와 이를 조작하는 메서드를 정의하여 외부에 객체의 내부 상태를 직접 접근하지 못하도록 하는 것 (캡슐화와 비슷함)
    • 어떠한 데이터들의 공통점을 모으고 차이점은 버립니다. 예를들어 고양이, 강아지, 원숭이 등의 객체들의 공통적인 특징을 묶어 동물이라는 카테고리를 카테고리화 시킵니다
      class Person {
          constructor(name, age) {
              this._name = name; // Private 속성처럼 사용하기 위해 _를 붙임
              this._age = age;
          }
      
          getName() {
              return this._name;
          }
      
          getAge() {
              return this._age;
          }
      
          setAge(age) {
              if (age > 0) {
                  this._age = age;
              }
          }
      }
      
      const person = new Person('John', 30);
      console.log(person.getName()); // 출력: John
      person.setAge(31);
      console.log(person.getAge()); // 출력: 31
      
  • 절차 추상화 (Procedural Abstraction)
    • 어떤 작업을 수행하기 위해 필요한 절차(또는 함수)를 정의하는 것, 함수나 메서드가 이러한 절차 추상화를 제공하며, 이를 통해 코드를 더 재 사용하고, 모듈화 할 수 있음
      function calculateArea(radius) {
          return Math.PI * radius * radius;
      }
      
      console.log(calculateArea(5)); // 출력: 78.53981633974483
      
  • 제어 추상화 (Control Abstraction)
    • 반복, 조건문, 함수 호출 등 제어 구조를 단순화하여 고수준의 제어 구조를 제공하는 것, 이를 통해 복잡한 제어 흐름을 단순하게 표현 가능
      function repeat(operation, times) {
          for (let i = 0; i < times; i++) {
              operation();
          }
      }
      
      function sayHello() {
          console.log('Hello');
      }
      
      repeat(sayHello, 3);
      // 출력: 
      // Hello
      // Hello
      // Hello
      
  • 인터페이스 추상화 (Interface Abstraction)
    • 클래스나 모듈이 제공해야 하는 메서드 목록을 정의하여 구현을 추상화하는 것입니다. 인터페이스를 통해 객체는 인터페이스에 정의된 메서드를 구현해야 하며, 이는 다른 객체와의 상호 작용을 표준화합니다. JavaScript에서는 명시적인 인터페이스가 없지만, TypeScript와 같은 상위 언어에서는 인터페이스를 정의할 수 있습니다.
      interface Drawable {
          draw(): void;
      }
      
      class Circle implements Drawable {
          draw() {
              console.log('Drawing a circle');
          }
      }
      
      class Square implements Drawable {
          draw() {
              console.log('Drawing a square');
          }
      }
      
      function render(drawable: Drawable) {
          drawable.draw();
      }
      
      const circle = new Circle();
      const square = new Square();
      render(circle); // 출력: Drawing a circle
      render(square); // 출력: Drawing a square
      
  • 클래스 추상화 (Class Abstraction)
    • 클래스 추상화는 추상 클래스와 이를 상속받는 구체 클래스를 통해 구현됩니다. 추상 클래스는 직접 인스턴스화될 수 없으며, 이를 상속받는 클래스에서 구체적인 구현을 제공해야 합니다.
      class Animal {
          constructor(name) {
              if (new.target === Animal) {
                  throw new Error('Cannot instantiate abstract class');
              }
              this.name = name;
          }
      
          speak() {
              throw new Error('Method "speak()" must be implemented');
          }
      }
      
      class Dog extends Animal {
          speak() {
              console.log(`${this.name} barks`);
          }
      }
      
      class Cat extends Animal {
          speak() {
              console.log(`${this.name} meows`);
          }
      }
      
      const dog = new Dog('Buddy');
      dog.speak(); // 출력: Buddy barks
      
      const cat = new Cat('Whiskers');
      cat.speak(); // 출력: Whiskers meows
      
  • 프로세스 추상화

    • 어떠한 내부 프로세스를 숨기는 것을 말합니다 .예를 들어 데이터베이스가 어떻게 데이터를 저장하는지 모르지만 단순하게 insert, upsert 등의 쿼리로 데이터를 저장할 수 있습니다.

      ex) MySQL 아키텍처

      코드뿐만 아니라 실제 시스템에서도 추상화는 이뤄져있습니다. 대표적인 예로 데이터베이스 시스템이 있습니다. 데이터베이스 내의 내부프로세스와는 상관없이 “쿼리”를 통해 접근할 수 있습니다.

profile
개발하는사람

0개의 댓글