남들이 변수에 의존하지 않도록 변수는 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
		}
	}
}