데이터와 기능을 한 단위로 묶는것.
데이터(속성)와 기능(메소드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것입니다.
은닉: 구현은 숨기고, 동작을 노출시킴.
은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것입니다.
느슨한 결함에 유리: 언제든 구현을 수정할 수 있음.
느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미합니다.
추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념입니다.
인터페이스(interface)를 단순화할 수 있습니다.
캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면,
추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있습니다.
클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 부릅니다.
기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속하는 것이다.
객체들의 타입이 다르면 똑같은 메세지가 전달되어도 서로 다른 동작을 하는 것이다.
만일 언어 자체에서 다형성을 제공하지 않는다면, 기본(부모) 클래스에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것입니다.
자식클래스가 부모클래스의 상속을 받고 있으면 부모의 속성을 가져다가 사용할 수 있지만,
자식클래스의 상황에 맞지 않을 때, Overriding을 통해 해당 클래스에서만 속성을 재정의 할 수 있습니다.
재사용성
캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높입니다.
상속 역시 불필요한 코드를 줄여 재사용성을 높입니다.
유지보수에 용이함/객체 단위 코드 디버깅 하기 편하다.
추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 인해 변화에 대한 영향을 최소화합니다
다형성으로 인해 동일한 메소드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.
출처 : 코드스테이츠