2022. 5. 25. 15:53ㆍOOP
OOP(객체지향 프로그래밍)에서 중요한 추상화에 대해 알아보자...
검색해보면.....
예제
추상화는 일반화를 통해서 구현될 수 있다. 일반화는 구체적인 사물들간의 공통점을 취하고 차이점을 버리는 것을 말합니다. 예를 들어, 아래와 같이 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 |