추상화

2022. 5. 25. 15:53OOP

OOP(객체지향 프로그래밍)에서 중요한 추상화에 대해 알아보자...

검색해보면.....

 

추상화(Abstraciton)
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있겠다.

 

예제

추상화는 일반화를 통해서 구현될 수 있다. 일반화는 구체적인 사물들간의 공통점을 취하고 차이점을 버리는 것을 말합니다. 예를 들어, 아래와 같이 SuperCar, SnowCar, FastCar가 있다고 합시다.

 

 

public class SuperCar {

    public void move() {
        System.out.println("슈퍼하게 달립니다.");
    }
}

public class SnowCar {

    public void move() {
        System.out.println("겨울에 잘 달립니다.");
    }
}

public class FastCar {

    public void move() {
        System.out.println("빠르게 달립니다.");
    }
}

 

 

그리고 이들을 움직이게 하기 위하여 사용자 입장에서는 아래와 같이 코드를 작성할 것입니다.

 

 

public class Main {

    public static void main(String[] args) {
        final SuperCar superCar = new SuperCar();
        final SnowCar snowCar = new SnowCar();
        final FastCar fastCar = new FastCar();

        superCar.move();
        snowCar.move();
        fastCar.move();
    }
}

 

 

 

 

그런데, 움직인다는 행위는 같으므로 차의 공통된 속성인 'move'를 상위 클래스로 뽑아낼 수 있습니다. 똑같은 자동차들이므로 Car라는 상위 클래스를 두어 상속 관계를 만들어도 무방할 것입니다. 이때, 저는 저번 시간에 배운 캡슐화를 지키기 위해서 추상 클래스로 만들었습니다.

 

 

public abstract class Car {

    public abstract void move();
}

public class FastCar extends Car{

    @Override
    public void move() {
        System.out.println("빠르게 달립니다.");
    }
}

public class SnowCar extends Car {

    @Override
    public void move() {
        System.out.println("겨울에 잘 달립니다.");
    }
}

public class SuperCar extends Car {

    @Override
    public void move() {
        System.out.println("슈퍼하게 달립니다.");
    }
}

 

 

그리고 하위 클래스들은 추상 메소드를 재정의하면 됩니다. 사용자 입장에서 아래와 같이 소스 코드를 작성할 수 있습니다.

 

 

public class Main {

    public static void main(String[] args) {
        final List<Car> cars = Arrays.asList(new SuperCar(), new SnowCar(), new FastCar());
        for (final Car car : cars) {
            car.move();
        }
    }
}

 

 

 

 

결과적으로 우리는 일반화를 통해 추상화를 구현하자고 생각했고, 그 목적을 위한 방식은 바로 타입입니다. 좀 더 상위 타입을 정의함으로써 추상화와 동시에 다형성을 구현할 수 있게 된 것이죠. 그리고 상위 타입의 방식으로 상속을 사용하였습니다. 더불어, 상위 타입은 추상 클래스로 선언함으로써 캡슐화까지도 지킬 수 있었습니다.

 

 

 

정리

예제에서는 타입과 상속을 통해 추상화를 구현하였지만, 이 방법에만 사고가 갇히시면 안 됩니다. 불필요한 것을 지우고 핵심을 남겨둔다는 추상화의 기본 사고를 기억하시면서 여러 가지 상황에 적용하시길 바랍니다

'OOP' 카테고리의 다른 글

캡슐화  (0) 2022.05.27
다형성(polymorphism)  (0) 2022.05.24