Abstraction(추상화)란?
자바에서는 추상클래스 , 추상메서드 , 추상화 등 "추상"이라는 말이 자주 쓰입니다.
그렇다면 추상화란 무엇일까요?
추상화는 프로그래밍에서 매우 중요한 개념 중 하나이며 매우 큰 범위를 지칭하는 말로
데이터나 절차를 단순하게 표현하여 간추리는 것을 의미합니다.
또한 Abstraction을 추상화라고 직역하는 것도 상당히 어폐가 있음으로 추상화를 전부 Abstraction으로 지칭하겠습니다.
이제 Abstraction을 크게 2가지로 포괄적으로 이해해보겠습니다.
1. Data를 간략화 시킨 Data Abstraction
2. 절차를 간략화 시킨 Procedure Abstraction
(단순히 코드를 Extends하여 상속받는 것 또한 Code Abstraction에 속합니다.)
Data Abstraction
Data Abstraction은 Data를 다루고 저장하는 방법을 간략화 시킨 것 입니다.
예시로는 Array , List , Stack , Queue 와 같은 자료구조들이나 사용자가 정의하는 타입이 이에 해당합니다.
Stack과 Queue에 가장 큰 특징은 각각이 FILO , FIFO 구조를 띈다는 것입니다.
이 규칙을 지키기만 한다면 내부적으로는 Array로 구현하든 List로 구현하든 상관없이 Stack 과 Queue라는 자료구조로 지칭됩니다.
또한 Set처럼 중복을 허용하지 않는 구조나 Map처럼 특정 Key를 통해 1:1 Mapping되는 구조등 다양한 구조가 존재합니다.
이러한 자료구조는 Data를 다루는 방식을 명시하고 규칙으로 지정한 것입니다.
또 이러한 규칙을 가진 구조를 단순히 Stack , Queue 등의 타입으로 간략화 시켜 사용가능하게 만든것을 Data Abstraction이라 합니다.
이 구조가 내부적으로 어떻게 구현됐는지 몰라도 간단한 사용법만 알면 충분히 사용하게 만드는 것이죠.
만약 프로그램이 Set이라는 자료구조로 작성이 됐다면
프로그램의 코드를 확인하지 않더라도 중복을 허용하지 않는 프로그램이구나 ! 라고 충분히 유추가 가능합니다.
이렇게 사용자가 정확한 내부의 구현을 모르더라도 충분히 사용이 가능하고 유추가 가능하게 만드는 것 또한 Abstraction 이라 합니다.
Procedure Abstraction
Procedure Abstraction은 절차를 간략화 시키는 것입니다.
절차를 간략화 시킨다는 것은 사용자가 수동으로 처리해야 할 부분을 프로그래밍 언어에서 자체적으로 처리하게 만들거나
기능이 비슷한 연산들을 묶어서 하나로 표현하는 것을 의미합니다.
간단한 사칙연산 프로그램을 예시로 들어보겠습니다.
public class Main {
public static void main(String[] args) {
int number1 = 100;
int number2 = 5;
System.out.println(plus(number1, number2));
System.out.println(minus(number1, number2));
System.out.println(multiply(number1, number2));
System.out.println(divide(number1, number2));
}
public static double plus(int a, int b) {
return a + b;
}
public static double minus(int a, int b) {
return a - b;
}
public static double multiply(int a, int b) {
return a * b;
}
public static double divide(int a, int b) {
return a / b;
}
}
간단한 사칙연산 프로그램이며 큰 문제는 없어 보입니다.
하지만 자세히 보면 메서드들의 파라미터와 반환 타입이 동일합니다.
이점을 이용해 사칙연산 코드를 하나의 연산으로 묶는 Procedure Abstraction을 해보겠습니다.
SubTyping 을 이용한 Procedure Absraction
public class Main {
public static void main(String[] args) {
int number1 = 100;
int number2 = 5;
System.out.println(calc(new Add(), number1, number2));
System.out.println(calc(new Minus(), number1, number2));
System.out.println(calc(new Multi(), number1, number2));
System.out.println(calc(new Divide(), number1, number2));
}
public static double calc(Calculator calculator, int a, int b) {
return calculator.calc(a, b);
}
}
class Add implements Calculator {
@Override
public double calc(double a, double b) {
return a + b;
}
}
class Minus implements Calculator {
@Override
public double calc(double a, double b) {
return a - b;
}
}
class Multi implements Calculator {
@Override
public double calc(double a, double b) {
return a * b;
}
}
class Divide implements Calculator {
@Override
public double calc(double a, double b) {
return a / b;
}
}
@FunctionalInterface
interface Calculator {
double calc(double a, double b);
}
Calculator 라는 Interface를 지정한 후 implements 를 이용해 SubType관계를 만들어 줬습니다.
이 관계를 이용해 4개의 메서드로 분리돼있던 기능이 calc 메서드 하나로 묶인것을 볼 수 있습니다.
이런식으로 공통된 부분을 묶어주어 간추리는 방식을 Procedure Abstraction이라 합니다.
실제로 SubTyping 을 이용하는 테크닉은 매우 효율적이지만 이 예시에서는 클래스를 여러개 만들어 코드의 양이 많아지고
복잡해 보이는 문제점을 갖게됐습니다. 좋은 Procedure Abstraction은 아닌 것 이죠
따라서 이 코드를 다른 방법으로 Abstraction 하겠습니다.
Lambda 를 이용한 Procedure Abstraction
public class Main {
public static void main(String[] args) {
int number1 = 100;
int number2 = 5;
System.out.println(calc((a, b) -> a + b, number1, number2));
System.out.println(calc((a, b) -> a - b, number1, number2));
System.out.println(calc((a, b) -> a * b, number1, number2));
System.out.println(calc((a, b) -> a / b, number1, number2));
}
public static double calc(Calculator calculator, int a, int b) {
return calculator.calc(a, b);
}
}
@FunctionalInterface
interface Calculator {
double calc(double a, double b);
}
똑같은 역할을 하는 프로그램이지만 Lambda식을 사용함으로써 연산 절차를 간추리는 Abstraction과 코드의 재사용성을 늘려줬습니다.
이 글에서는 Abstraction에 대해서 간략하게 알아 봤습니다.
Abstraction은 프로그래밍을 더욱 효율적으로 만들어주는 중요한 원칙 중 하나입니다 .
또한 매우 큰 범위를 지칭하는 말이기 떄문에 이 글에서 사용된 것 외에도 더욱 많은 예시가 존재합니다.
더 많은 이점을 알고 싶다면 다음을 추천합니다Abstraction(추상화) 기본 개념 - 2편
Abstraction(추상화) 기본 개념 - 2편
Why Abstraction?? 우리는 이전의 글을 통해 Abstraction의 개념을 간략하게 이해했습니다. Abstraction(추상화) 기본 개념 - 1편 Abstraction(추상화) 기본 개념 - 1편 Abstraction(추상화)란? 자바에서는 추상클래스
masiljangajji-coding.tistory.com
도움이 되셨다면 좋겠습니다.
'프로그래밍 기초 > 전산학 기초' 카테고리의 다른 글
[추상클래스 Vs 인터페이스] (0) | 2023.10.22 |
---|---|
클래스 설계와 Abstraction Barrier (0) | 2023.10.22 |
[Static Vs Dynamic] Series (4) | 2023.10.19 |
Thread Safety 개념과 방법 [Monitor,Mutex,Semaphore] (2) | 2023.10.15 |
I/O Stream 기본 개념 (0) | 2023.09.29 |