남들이 변수에 의존하지 않도록 변수는 private 으로 정의한다. 그렇다면 왜 조회(get)와 설정(set)을 제공하는 메서드는 public하게 외부에 노출하는 것일까?
변수 사이에 함수라는 계층을 넣는다고 구현이 감춰지는건 아니다. 구현을 감추기 위해서는 추상화가 필요하다.
// 구체적인 클래스 (구현을 외부로 노출시킴)
public class Point {
private double x;
private double y;
}
// 추상적인 클래스 (구현을 숨김)
public interface Point {
double getX();
double getY();
void setCatesian(double x, double y);
double getR();
double getTheta();
double setPolar(double r, double theta);
}
// 구체적인 클래스 (구현을 외부로 노출)
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
// 추상적인 클래스 (구현을 숨김)
public interface Vehicle {
double getPercentFuelRemaining();
}
자료를 세세하기 공개하기 보다는 추상적인 개념으로 표현해야 한다. 인터페이스나 조회/설정 메서드로는 추상화가 이뤄지지 않는다.
// 절차적인 클래스
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 double width;
}
public class Geometry {
public final double PI = 3.141592653585793;
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
}
}
}