주체(Subject)가 다른 실체를 바로 볼 때, 그 실체가 바로 객체(Object)이다. 한 마디로, 객체는 우리가 보고 느끼고 인지할 수 있는 그 모든 것을 의미한다고 할 수 있다. 그리고 객체는 속성(State)과 동작(Behavior)를 갖고 있다.
객체 지향 프로그래밍은 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍 패러다임이다. 그렇기 때문에 객체간의 상호작용을 중시한다. 객체 지향 프로그래밍은 절차적 프로그래밍이 갖고 있던 순차적 프로그래밍 방식이라는 한계점을 보완하고자 등장했다.
자판기에서 음료를 구매하기
캡슐화란 추상화를 목표로 서로 연관있는 속성과 동작들을 하나의 캡슐(Class)로 결합(집합화)하는 것이다. 이를 통해 '정보 은닉'을 활용할 수 있는데, 데이터에 대한 외부 간섭을 차단해 정보를 보호할 수 있다. 사용자 입장에서 중요한 부분은 강조하고 중요하지 않는 부분은 숨기는 것이다.
<레스토랑 예시>
- 고객은 유통 구조, 레시피 등은 알 필요가 없음 => 고객에게 과한 정보 & 기업의 민감 정보
- 즉, 고객은 메뉴 이름, 재료, 맛 설명 등 필요 정보만 알면 됨
상속성은 Class의 속성과 동작을 타 Class(하위 Class)가 물려받아 사용하는 것을 의미한다. 이런 특징으로 재사용성과 확장성을 높여준다.
추상화는 인스턴스의 실체화를 위해 공통된 속성과 동작을 추출하고 정의하는 것을 의미한다. Class는 인스턴스(객체)를 만드는 틀로, 객체의 공통된 특징만을 갖고 있다. 그렇기 때문에 불필요한 세부 사항들은 제거해 복잡성을 줄인 단순화를 지향한다.
<자동차 예시>
- 자동차 설계도(Class) : 추상화(틀) => 공통된 특징을 집합화
- 속성: 색상, 바퀴, 엔진, 등..
- 기능: 전진하기, 후진하기, 등..
- 산출물(실체화) : 인스턴스(객체)
- Ford Bronco, Jeep Wrangler, etc
다형성은 기존 Class와는 별도로 상속받은 하위 Class에서 오버라이딩과 오버로딩을 통해 동작을 재정의 하는 것을 말한다.
하나의 Class는 하나의 책임을 가져야한다.
확장(상속성 및 다형성)에는 열려 있으나 변경에는 닫혀 있어야 한다.
하위 객체는 상위 객체의 정확성을 방해하지 않아야 한다.
- 하위 객체의 특징이 변경(치환)되어도, 상위 객체는 정상적으로 동작해야 한다.
사용자가 필요하지 않은 것들에 의존하게 되지 않도록, 인터페이스를 작게 유지해야 한다.
- 단일 상위 클래스 인터페이스보단 여러개의 상위 클래스로 분리해 활용해야 한다.
실체화가 아닌 추상화, 즉 틀의 중요성을 인지하고 의존해야 한다.
https://velog.io/@teo/Javascript%EC%97%90%EC%84%9C%EB%8F%84-SOLID-%EC%9B%90%EC%B9%99%EC%9D%B4-%ED%86%B5%ED%95%A0%EA%B9%8C#d---dip--%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%97%AD%EC%A0%84-%EC%9B%90%EC%B9%99
https://iosdevlime.tistory.com/entry/CSBasic-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%84%A4%EA%B3%84%EC%9B%90%EC%B9%99
https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95