: 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것
: 필드, 메소드를 하나로 묶고 실제 구현 내용을 외부에 감추는 것
: 부모 객체는 자기가 가지고 있는 필드와 메소드를 자식 객체에게 물려주어 자식 객체가 사용할 수 있도록 함
: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
SOLID를 모두 무조건 지키는 건 어려움
SOLID 원칙을 따르면 객체 지향적으로 코드를 짜기 용이
객체지향의 목적
: 유지보수하기 쉬운 코드
-> 기존 코드를 최대한 유지하는 방향
interface : 사용설명서
class : interface에 맞게 제품 라인을 구축 해놓은 것
객체 : 제품라인에서 찍어져 나온 제품
-> new로 선언 후 생성자가 찍힘과 동시에 객체가 됨
: 하나의 객체는 하나의 책임만을 갖는다.
: 코드 상에서 기능 확장이 필요할 때, 확장에는 개방적이어야 하고, 변경에는 폐쇄적이어야 한다.
상속의 장점
1. 기존 코드 재사용 => 강한의존성 생기는 단점도 있음
2. 타입 계층
-> 상속할수록 클래스(타입)는 구체적이게 됨 / 부모 클래스는 가장 추상적임
: 부모 타입 변수에 해당 부모 자식 인스턴스가 뭐가 오든 간에 코드는 잘 작동해야 한다.
: 인터페이스 계의 단일 책임 원칙
-> 인터페이스 구성 시 최대한 잘게, 원자적으로 구성
-> 가장 보편적인 기능만 들어가게
인터페이스 : 클래스 설명서
-> 실제 내부 구현은 안 되어있으므로, 인터페이스가 최상단 클래스보다 추상적
: 구체적인 개념에서 추상적인 개념 방향으로 설계
-> 자기보다 구체적인 객체에게 의존하지 말 것
- 기존 : 자동차 객체 -> 스피커 객체 ( 의존 방향)
= 구체적 객체 -> 구체적 객체- 의존 역전 : 자동차 객체 -> 스피커 인터페이스 <- 스피커 객체
= 구체적 객체 -> 추상적 객체 <- 구체적 객체
인터페이스는 최대한 원자적으로 구성되어 있어서 잘 안 바뀜
-> 객체를 수정/변경할 가능성이 낮다
-> 인터페이스를 의존하고 있는 객체들이 변경될 여지가 적다
-> 스피커 객체를 수정해도 자동차 객체는 수정할 필요가 없음