(대충 객체자향 프로그래밍 주요 개념 소개하겠다는 말)
하이 마이 네임 이즈 Encapsulation!
마이 네임 이즈 inheritance!
Abstraction!
Polymorphism!
데이터와 기능을 하나 단위로 묶어준다.
데이터(속성)과 기능(메서드)를 따로 정의하지 않아도 돼!!!!!!!
아무나 못 건드리게 은닉(hiding)도 한다. (구현숨김,동작노출)
객체 내 구현을 필요한 정도 수정해도 외부에서 동작할 때 코드흐름이 바뀌지 않는다.
더 엄격한 클래스는 속성의 직접적인 접근을 막고 설정하는 (setter), 불러오는 함수(getter)를 철저하게 나눈다.
느슨한 결합(Loose Coupling)에도 유리해서 언제든 구현을 수정할 수 있다.
코드 실행 순서에 따라 절차적으로 코드를 작성하지 않고,
코드가 상징하는 실제 모습과 닮게 코드를 모아 결합!
*재사용이 가능하다!!!
부모 클래스의 특징을 자식 클래스가 물려받는 것. (불필요한 중복 제거)
자바스크립트는 프로토타입을 기반으로 상속을 구현한다.
예를 들어 아버지와 날 비교했을 때, 이름 성과 머리숱, 키, 좋아하는 음식 등은 같다. (유전자의 힘(프로토타입..?)이라고 생각하자)
위의 같은 값들은 유전자의 힘으로 아버지에게 상속받은 것이다.
그럼 난 아버지와 완전히 같은 사람인가? 아니다.
아버지에게 상속받은 것 말고도 학교, 친구, 직업 등 물려받지 못하고 내가 스스로 추가해야하는 속성/메서드도 있을 것이다.
요로케 상속에 대해 설명해봤다.
내부 구현은 복잡, 실제 노출부분은 단순
부품 설계는 복잡, 제품 기능사용은 단순 (버튼?)
내 머릿 속은 복잡, 정작 하는 짓..은 단순(…..?)
..예를 들어 사람에게는 다양한 특징들이 있는데 내가 궁금한건 이름과 나이뿐인 것이다.. 그 이상의 것, 이름을 누가 지어줬는지, 왜 그 이름인지, 한자인지, 나이가 만으로 계산된건지, 출생신고를 늦게했는지 등은 딱히 관심없고 그냥 이름이랑 나이가 궁금한거다. 이 때, 이름과 나이는 노출이 가능하지만 그 외의 복잡한 정보(위에 서술한것보다도 더 많은)는 노출하지 않는다.
왜냐면 사실 딱히 궁금하지 않으니까. 궁금해 할 일이 없으니까..?
이게 캡슐화에서 말하는 ‘은닉’과 다른 점 아닐까..?
아니 사실 둘은 결이 같은데 그냥 그나마 약간의 차이를 나눠보자면 그렇다는 것이다.
추상화에서 말하는 은닉은 ‘궁금하지 않은 사실을 모르게 한다’,
캡슐화에서 말하는 은닉은 ‘궁금할 수 있는 사실이더라도 코드 진행에 오류가 발생하지 않도록 숨긴다’는 느낌에 가깝다고 생각한다.
똑같은 메서드라 하더라도, 다른 방식으로 구현될 수 있음.
특정 기능을 설계하는 부분과 동작하는 부분으로 분리하고 그 동작방법을 다양하게 만든 후 선택해서 사용할 수 있게 기능한다.
자바스크립트의 객체지향 언어는 프로토타입을 기반
자바스크립트의 클래스는 프로토타입을 기반.