프로그래밍 언어에서의 추상화(Abstraction in OOP)

두비니

·

2021. 3. 4. 14:16

 

 


Abstraction in OOP(Object Oriented Programming)


 

 

이 글은 아래의 글을 참고했습니다. : stackify.com/oop-concept-abstraction/

 

OOP Concept for Beginners: What is Abstraction?

Abstraction is one of the key concepts of object-oriented programming (OOP) languages. Read examples to better handle complexity.

stackify.com

 

객체지향 프로그래밍 언어에서 추상화는 매우 중요한 개념입니다. 저도 추상화가 뭔지 알고는 있지만, 남에게 설명해보라고 했을 때 자연스럽고, 남이 충분히 받아들일 수 있을 만큼 구사할 수 없다고 생각하여 글을 작성합니다. 

 

1. 추상화의 정의

 

추상화란, 구체적인 것은 감추고, 대략적이고 전체적인 그림만 드러내는 것을 의미합니다. 이렇게 추상화를 통해서 얻을 수 있는 장점은 유저가 구체적인 논리와 로직을 모르더라도 더 복잡한 논리를 구현할 수 있도록 합니다.

 

계속 말로만 풀어내려고 하다보니 내용이 너무 복잡해지는 것 같아 예시를 들어보겠습니다. 추상화의 가장 기초적인 예시는 함수입니다. 즉, 함수의 이름을 통해서 구체적으로 하는 일을 추상화 시켜서 나타내는 것이죠.

예를 들어서 C언어의 가장 대표적인 함수인 "printf()"의 경우, 인자에 해당하는 부분을 output으로 출력시켜주는 역할을 합니다. 사용자들은 정확히 어떤 식으로, 어떤 로직을 통해서 printf()함수가 구동하는지는 모르지만, 이 함수를 통해서 아무튼 출력을 시킬 수 있다는 사실을 알고 있고, 이 함수를 응용하여 다양한 프로그램 구현에 이용합니다.

 

 

2. 추상화의 예시

 

printf도 결국 프로그래밍 이야기니, 진짜 실생활 예시를 들어봅시다.

직장인 A모씨는 매일 아침 집에서 직접 커피 머신을 통해 커피를 내려서 출근한다고 합니다. 커피 머신을 통해 커피를 내리는 걸 예시로 들어보겠습니다.

커피머신을 통해서 커피를 내리기 위해서는 물, 커피콩, 그리고 어떤 종류의 커피를 만들지 고를 필요가 있습니다. 여기서 가장 중요한 것은 준비물만 있으면 나머지는 커피머신이 알아서 커피를 만들어 준다는 점입니다. 즉, 물의 온도는 어느정도여야 하는지, 몇 그람의 커피콩을 갈아야 할지는 알 필요가 없다는 뜻입니다. 커피를 만드는 복잡한 과정은 버튼으로 '추상화'가 되었기 때문에 누구나 커피를 집에서도 만들 수 있게 된거죠.

 

위 예시를 통해 추상화는 지식을 표현하는 도구로 사용함과 동시에, 이해를 돕는 방법으로도 사용하고 있다는 것을 보여줍니다. 

 

CoffeMachine 예시

 

그럼 이제는 직접 프로그래밍을 통한 추상화를 직접 해봅시다.

저는 다음 링크에서 예시를 참고했습니다: https://github.com/thjanssen/Stackify-OopAbstraction

 

thjanssen/Stackify-OopAbstraction

Contribute to thjanssen/Stackify-OopAbstraction development by creating an account on GitHub.

github.com

 

import org.thoughts.on.java.coffee.CoffeeException;
import java.utils.Map;

public class CoffeeMachine {
    private Map<CoffeeSelection, CoffeeBean> beans;

    public CoffeeMachine(Map<CoffeeSelection, CoffeeBean> beans) { 
         this.beans = beans
    }

    public Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException {
        Coffee coffee = new Coffee();
        System.out.println(“Making coffee ...”);
        return coffee;
    }
}

 

다음 코드는 간단하게 위에서 말로 서술한 예시를 코드로 옮긴 것입니다. org.thoughts.on.java.coffee.CoffeeException이라는 패키지를 참고하였고, 그걸 기반으로 CoffesSelection, CoffeeBean 등을 사용하고 있는 것을 확인할 수 있습니다. 그리고 결론적으로 추상화가 된 것은 CoffeeMachine임을 확인할 수 있죠?

 

코드를 조금 설명하기 위해, CoffeeSelection은 커피 종류를 고르기 위한 단순한 enum타입입니다.

 

public enum CoffeeSelection { 
    FILTER_COFFEE, ESPRESSO, CAPPUCCINO;
}

 

그리고 CoffeeBean과 Coffee는 단순한 자바 오브젝트입니다.

 

public class CoffeeBean {
     private String name;
     private double quantity;
  	
     public CoffeeBean(String name, double quantity) {
         this.name = name;
        this.quantity;
    }
}
public class Coffee {
    private CoffeeSelection selection;
    private double quantity;
  	
    public Coffee(CoffeeSelection, double quantity) {
        this.selection = selection;
        this. quantity = quantity;
    }
}

 

하지만 결론적으로 중요한 것은, 저 CoffeeMachine 클래스만 봐도 충분히 저 CoffeeMachine이 어떤 일을 할지 충분히 이해가 가능하다는 것이죠. 이것이 추상화를 잘 시켰다는 반증이라고 볼 수 있을 것 같습니다.

 

CoffeeMachine 추상화 이용하기

 

그럼 CoffeeMachine을 통해서 커피를 직접 만드는 과정을 코딩해봅시다.

 

import org.thoughts.on.java.coffee.CoffeeException;
import java.util.HashMap;
import java.util.Map;

public class CoffeeApp {
    public static void main(String[] args) {
        // create a Map of available coffee beans
        Map<CoffeeSelection, CoffeeBean> beans = new HashMap<CoffeeSelection, CoffeeBean>();
        beans.put(CoffeeSelection.ESPRESSO, 
            new CoffeeBean("My favorite espresso bean", 1000));
        beans.put(CoffeeSelection.FILTER_COFFEE, 
            new CoffeeBean("My favorite filter coffee bean", 1000));

        // get a new CoffeeMachine object
        CoffeeMachine machine = new CoffeeMachine(beans);

        // brew a fresh coffee
        try {
	    Coffee espresso = machine.brewCoffee(CoffeeSelection.ESPRESSO);
	} catch(CoffeeException  e) {
	    e.printStackTrace();
        }
    } // end main
} // end CoffeeApp

 

코드를 보면 커피콩을 골라서 커피가 만들어지는 과정임을 알 수 있습니다. 즉 CoffeeApp은 CoffeeMachine을 이용한 또다른 추상화 결과임을 알 수 있습니다. 실제로 제가 가지고 온 org.thoughts.on.java.coffee.CoffeeException은 다음과 같은 추상화가 진행되어있습니다.

 

 

다음과 같이 추상화가 잘 진행되어 있을 때의 장점은 각 단계별로 추상화가 덕분에 다양한 응용을 할 수 있다는 것입니다. 위에 예시를 든 것처럼 커피머신을 이용하는 API(CoffeeApp)를 만들 수도 있고, CoffeeMachine안에 포함된 Grinder객체를 들고와서 그라인더를 세척하는 API도 만드는 등 자신에게 필요한 부분만 들고와서 응용할 수 있습니다.

 

 

마무리하며

 

추상화는 실제 생활과 객체지향 프로그래밍에서 충분히 만날 수 있는 개념입니다. 그리고 추상화는 프로그래밍의 중요한 도구이기 때문에, 그것을 제대로 활용할 수 있는 개발자가 되어야 합니다. 결국 우리가 만드는 코드들은 결국 쌓여있는 지식 위에다가 숟가락을 올리는 정도일 뿐이니까요.

 

 

 

'Coding_Algorithm' 카테고리의 다른 글

아스키 코드표  (0) 2019.06.27
[코딩 꿀팁] 프로그래밍 코드 예쁘게 복붙하기  (0) 2019.03.17