OOP 4대 특성
추상화
- 객체들의 공통적인 특징(속성, 기능을) 묶어 표현하는 것
- 현실 세계의 복잡성을 단순화하여 객체를 바라볼 수 있게 한다.
캡슐화
- 관련있는 속성과 기능을 하나로 묶는 것, 외부에서 반드시 접근해야만 하는 행위를 인터페이스를 통해 노출 시킨다.(정보은닉)
- 속성을 스스로 관리할 수 있도록 함으로써 자율적인 객체를 만들 수 있게 된다.
- 완전한 자율적인 객체는 내부의 변경이 외부에 영향을 끼치지 않는다.
캡슐화의 잘못된 예
남은 연료와 연료통의 용량을 Car가 직접 계산하여 주행가능 여부를 판단
public class Car { private Fuel fuel; private int efficiency; public void run() { if((fuel.getAmount() - efficiency) / fuel.getMaxCapacity()* 100 > 10) { System.out.println("run"); } else { System.out.println("can't run"); } } } public class Fuel { private double amount; private double maxCapacity; public double getAmount() { return amount; } public double getMaxCapacity() { return maxCapacity; } }
연료가 고체 연료가 바뀐다고 가정을 하면?
- 연료 뿐만아니라 Car도 바꿔야한다. → 변경점이 늘어나 유지보수가 어렵다!
public class ChangedFuel { private int quantity; private int maxCapacity; public int getQuantity() { return quantity; } public int getMaxCapacity() { return maxCapacity; } }

캡슐화의 올바른 예
- 연료의 내부 구현을 감추고 효율값을 넘겨주며 충분한지 물어보고 있음
package goodCapsulation; public class Car { private Fuel fuel; private int efficiency; public Car(Fuel fuel) { this.fuel = fuel; } public void run() { if(fuel.isEnough(efficiency)) { System.out.println("run"); } else { System.out.println("can't run"); } } } public class Fuel { private double amount; private double maxCapacity; public boolean isEnough(int efficiency) { return (amount - efficiency) / maxCapacity * 100 > 10; } }
연료가 고체 연료로 바뀌었을 때를 가정해보면…
public class ChangedFuel { private int quantity; private int maxCapacity; public boolean isEnough(int efficiency) { return efficiency - (quantity / maxCapacity * 100) > 0; } }
핵심 로직에는 변화가 없다..!

Fuel을 isEnough() 추상메서드를 포함하는 추상클래스 또는 인터페이스로 사용하면 더욱 더 좋을 듯 합니다...!
상속
- 슈퍼 타입의 특징을 서브 타입이 물려받는 것
- 비용, 시간 절감
- 서브 타이핑
- 서브 클래스가 슈퍼 클래스를 대체할 수 있는 경우
- 설계의 유연성이 주 목적
- 인터페이스 상속이라고도 함
- 서브 클래싱
- 서브 클래스가 슈퍼 클래스를 대체할 수 없는 경우
- 중복제거, 재 사용성이 주 목적
- 구현 상속이라고도 함
다형성
- 같은 메시지에 서로 다른 응답을 할 수 있는 특성
- 오버로딩
- 함수이름, 반환형이 같지만 매개 변수가 다른 경우

- 오버라이딩
- 슈퍼 클래스의 메서드를 하위 클래스에서 재정의하여 사용
