// 구체적인 Point 클래스
public class Point1 {
public double x;
public double y;
}
// 추상적인 Point 클래스
public class Point2 {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
추상화
가 필요해요. 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되는게 아니라, 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스예요.<aside> 💡 추상화와 캡슐화의 차이?
</aside>
// 구체적인 Vehicle 클래스
public interface Vehicle {
double getFuelTankCapacityInGallons(); // 변수값을 읽어 반환할 뿐
double getGallonsOfGasoline();
}
// 추상적인 Vehicle 클래스
public interface Vehicle {
double getPercentFuelRemaining(); // 정보가 어디서 오는지 드러나지 않는다
}
아무 생각없이 조회/설정 함수를 추가하는 방법이 가장 나빠요.
→ 그럼 Java에서 많이 쓰던 getter/setter를 포함한 클래스들은요..?
객체 추상화 뒤로 자료를 숨김. 자료를 다루는 함수만 공개
자료 구조 자료를 그대로 공개. 별다른 함수 제공하지 않음.
각 도형 클래스는 간단한 자료 구조, 아무 메서드도 제공하지 않아요.
//// 도형 자료 구조
public class Square {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square)shape;
return s.side * s.side;
} else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle)shape;
return r.height * r.width;
} else if (shape instanceof Circle) {
Circle c = (Circle)shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
//// 새로운 함수 추가 자유로움.
}