# 추상화 1. 추상화는 객체지향 프로그래밍의 핵심 개념 중 하나 2. 추상화는 사용자와 관련 있는 내용만 노출하고 나머지 세부 내용은 숨기는 개념 3. 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 애플리케이션이 수행하는 일 자체에 집중할 수 있음 **[MY Answer]** 추상화는 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 추상화를 통하여 사용자와 관련 있는 내용만을 노출하고 세부내용을 숨김으로써 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 수행하는 일 자체에 집중할 수 있습니다. **[BOOK Answer]** 아인슈타인은 **모든 것은 더 단순하게 만드는 것이 아니라 가능한 한 단순하게 만들어야 한다.** 고 말했습니다. 추상화는 사용자를 위해 무언가를 최대한 간단하게 만들고자 하는 **객체지향 프로그래밍의 핵심 개념 중 하나**입니다. 객체지향 프로그래밍의 객체는 **싸용자에게 높은 수준의 작업 집합만 노출하고 작업의 내부 구현 내용은 숨겨야 한다는 말**이 있습니다. 이 개념을 구현하는 **추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 수행하는 일 자체에 집중할 수 있습니다.** 즉, 내용을 노출하는 복잡성을 줄이고 코드의 재사용성을 높이며 코드 중복을 방지하고 낮은 결합도와 높은 응집도를 유지합니다. 또한 중요한 내용만 공개하여 애플리케이션의 보안과 재량권을 유지합니다. 실생활의 예를 들어보겠습니다. 차를 운전하는 남자가 있다고 가정하겠습니다. 이때 남자는 각각의 페달이 무슨 일을 하는지, 핸들이 무슨 일을 하는지 알고 있지만, 페달과 핸들에 힘을 실어주는 차 내부의 메커니즘은 전혀 알지 못하는 경우가 많습니다. 이것이 추상화입니다. [Excemple] 추상화를 좀 더 이해하도록 차를 운전하는 남자에 관해서 계속 이야기해보겠습니다. 이 남자는 적절한 페달을 이용해서 차의 속도를 높이거나 늦출 수 있습니다. 또한 바퀴 조종장치의 도움으로 우회전화 좌회전을 할 수도 있습니다. 이 모든 작업은 Car라는 이름의 인터페이스로 통합할 수 있습니다. ```java public interface Car{ public void speedUp(); public void slowDown(); public void turnRight(); public void turnLeft(); public string getCarType(); } ``` 다음으로 각 차량 타입은 Car 인터페이스 구현에 정의된 동작의 내용을 제공하기 위해 method를 Override 해야 합니다. 이 구현 내용은 차를 운전하는 남자인 사용자에게는 노출되지 않습니다. 예를 들어 myCar 클래스는 다음과 같이 나타낼 수 있습니다. ```java public class MyCar implements Car{ private final String carType; public MyCar(String carType){ this.carType = carType; } @Override public void speedUp(){ System.out.println("속도올리기"); } @Override public void slowDown(){ System.out.println("속도줄이기"); } @Override public void turnRight(){ Sytem.out.println("우회전 하기"); } @Override public void turnLeft(){ System.out.println("좌회전 하기"); } @Override public String getCarType(){ return this.carType; } } ``` 위 myCar 클래스의 사용자는 구현 내용을 전혀 몰라도 public mathod에 접근할 수 있습니다. ```java public class Main{ public static void main(String[] args){ Car myCar = new MyCar("BMW"); Car petrolCar = new PetrolCar("Audi"); System.out.println("Driving my car: "+myCar.getCarType()+"\n"); myCar.speedUp(); myCar.turnLeft(); myCar.turnRight(); System.out.println("\n\nDriving the petrol car: "+petrolCar.getCarType()+"\n"); petrolCar.slowDown(); petrolCar.turnRight(); } } ``` 출력 결과는 다음과 같습니다. Driving my car: BMW 속도올리기 좌회전 하기 우회전 하기 Driving the petrol car: Audi 속도줄이기 우회전 하기 질문 : petrolCar 클래스 정의가 없는데 어떻게? **[GPT Answer]** 추상화는 복잡한 시스템을 관리하기 위한 주요 기법 중 하나로, 객체 지향 프로그래밍에서 핵심적인 역할을 합니다. 추상화는 복잡성을 줄이고 코드의 재사용성을 높이는데 도움이 됩니다. 비유를 들어보자면, 자동차를 운전한다고 생각해봅시다. 우리는 자동차의 가속 페달을 밟으면 속도가 올라가고, 브레이크를 밟으면 속도가 줄어든다는 것만 알면 됩니다. 그러나 이 과정에서 엔진 내부에서 일어나는 연료 분사와 연소, 변속기의 작동 등 복잡한 메커니즘에 대해 운전자가 모두 이해하고 있지 않아도 괜찮습니다. 이처럼 사용자(혹은 개발자)에게 필요한 정보만 제공하고, 내부의 복잡한 세부 사항은 숨기는 것이 바로 추상화입니다. Java에서 추상화를 구현하는 방법 중 하나로 인터페이스와 추상 클래스가 있습니다. 예를 들어 다양한 종류의 동물들이 '음식 먹기', '걷기' 등과 같은 공통적인 행동들을 할 수 있다고 가정해 보겠습니다. 여기서 `Animal` 이라는 추상 클래스 혹은 인터페이스를 만들 수 있습니다: ```java public interface Animal { void eat(); void walk(); } ``` 그리고 각각의 동물 클래스 (예: Dog, Cat) 에서 이 인터페이스를 구현합니다: ```java public class Dog implements Animal { @Override public void eat() { System.out.println("Dog is eating"); } @Override public void walk() { System.out.println("Dog is walking"); } } public class Cat implements Animal { // ... (Cat 클래스에 대해서도 같은 방식으로 구현) } ``` 위 예제에서 `Animal` 인터페이스는 '음식 먹기', '걷기'라는 행동을 정의하며, 실제 세부적인 구현(개가 어떻게 걷느냐, 고양이가 어떻게 먹느냐 등)은 각 동물 클래스에서 처리합니다. 이렇게 하면 개와 고양이의 세부적인 행동 방식을 알지 못해도, 모든 동물이 '음식을 먹는다'와 '걷는다'는 공통된 행동을 할 수 있다는 것만 알면 됩니다. 따라서 추상화를 통해 우리는 복잡한 시스템 내부의 세부 사항을 숨기고, 필요한 기능만 제공함으로써 코드를 더 간결하고 이해하기 쉽게 만들 수 있습니다.