: 추상적인 것으로 만듦
: 데이터와 함수들을 클래스 내에 댐고 사용자가 사용할 수 있는 부분만 보이도록 함, 나머지는 내부에 감춤
: 확장, 특수화 → 부모는 자식을 품을 수 있지만 자식은 안된다..
Child는 Parent의 내용을 가짐
오버 로딩
오버 라이딩
특징
→ 인터페이스 이용
Book class의 경우, Book에 관한 속성을 정의하는 책임을 가져야 하는데 load(), show() 등 메소드를 포함해 load, show에 대한 책임도 가지고 있는다.
따라서 BookManager(동작)와 Book(데이터 모델)을 분리하도록 한다. 이때 loader와 viewer가 변경될 수 있으므로 setter를 두어 변경 가능하도록 한다.
loader와 viewer는 수정될 수 있으므로 loader.load()
/ viewer.show()
함수는 그대로 두고, 다형성을 이용해 상속받은 자식 클래스로 재정의 하도록 한다.
class Rectangle {
private int width;
private int height;
public Rectangle(int w, int h) {
width = w;
height = h;
}
public int getPerimeter() {
return 2 * (width + height);
}
public void setWidth(int w) {
width = w;
}
public void setHeight(int h) {
height = h;
}
}
class Square extends Rectangle {
public Square(int w) {
super(w, w);
}
public void setWidth(int w) {
super.setWidth(w);
super.setHeight(w);
}
public void setHeight(int h) {
super.setWidth(h);
super.setHeight(h);
}
}
class Main {
public static void main(String[] args) {
Rectangle r = new Rectangle(3, 5);
System.out.println(r.getPerimeter());
Square s = new Square(3);
System.out.println(s.getPerimeter());
r = s;
r.setWidth(3);
r.setHeight(5);
System.out.println(r.getPerimeter()); #16을 기대하지만 20이 나온다.
}
}
Rectangle을 상속받은 Square는 부모를 대체하지 못하고 있다.
BookManager는 추상 클래스인 BookDataViewer
, BookDataLoader
에 의존하고 있다.