클래스와 인스턴스라는 용어를 이해할 수 있다 .
new 키워드의 사용법을 이해할 수 있다. => 클래스로 부터 새로운 인스턴스를 만들때 사용!
class 키워드의 사용법을 이해할 수 있다. => 새로운 클래스를 만들때 사용!
현실 세계의 모델을 바탕으로 클래스의 메소드와 속성을 디자인할 수 있다.
객체 지향 프로그래밍 특징을 이해할 수 있다. => 객체 지향 프로그래밍은 프로그래밍을 수많은 '객체'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식. 객체란 하나의 역할을 수행하는 메소드와 속성 묶음! JS는 프로토타입 기반 객체 지향 프로그래밍!
상속 => 부모 클래스(기본 클래스) 의 특징을 자식 클래스(파생 클래스)가 물려받는 것
추상화 => 내부 구현은 복잡한데, 실제노출되는 부분은 단순하게 만든다는 개념
캠슐화가 은닉화에 포커스를 맞추는 것과 달리 추상화는 사람이 필요하지 않은 메소드등은 복잡하게 노출시키지 않는 것
JavaScript에서 객체 지향 프로그래밍을 구현할 수 있다.
prototype이 무엇인지 이해할 수 있다 => 공부 필요
객체 지향 프로그래밍의 상속(Inheritance)의 개념을 이해하고 코드로 작성할 수 있다.
상속관계를 가진 현실 세계의 모델을 코드로 작성할 수 있다.
클래스 상속의 원리를 이해할 수 있다.
Prototype chain을 이해하고 설명할 수 있다. (proto)
C언어는 절차 지향 프로그래밍. 절차는 순차적인 처리가 중요. 그러나
소프트웨어의 발달로 하드웨어속도가 소프트웨어의 속도에 못 따라감. 그래서 객체지향 프로그래밍이 나옴.
모듈화를 통해 하드웨어가 불필요한 연산을 하지않게 하고 모듈을 재활용함으로써 효율정 재고!
객체 지향 프로그래밍(Object-Oriendted Programming 이하 OOP)는 데이터와 기능을 한 곳에 묶어서 처리.
속성과 메소드가 하나의 "객체"라는 개념에 포함되며, JS의 object랑은 다르게 클래스(Class)라는 이름이 있음.!
function makeCounter() {
return {
value: 0,
increase: function() {
this.value++ // 메소드 호출을 할 경우, this는 makeCounter 함수가 리턴하는 익명의 객체입니다
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() // -2
function makeCounter() {
return {
value: 0,
increase: function() {
this.value++ // 메소드 호출을 할 경우, this는 makeCounter 함수가 리턴하는 익명의 객체입니다
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() // -2
객체 지향 프로그래밍 : 하나의 모델이 되는 청사진(blueprint)를 만들고,
그 청사진을 바탕으로 한 객체(object)를 만드는 프로그래밍 패턴!
ex) Car 청사진을 만들고, 그걸로 Avante, mini, Beetles 등의 objct를 생성
여기서 청사진을 바탕으로 한 '객체'는 instance object 줄여서 instance
, 청사진은 class
!
function Car(color) { } // Car는 Class! let avante = new Car('blue'); // new 키워드 사용! let mini = new Car('cyan');
새로운 인스턴스를 만들때는 new 사용!
각각의 인스턴스는 클래스의 고유한 속성과 메소드를 갖게 됨.
클래스를 만드는 규칙으로 대문자, 그리고 일반명사 사용! (그냥 함수랑 다르게)
클래스를 만들때는 function 쓰거나 ES6에서는 class 키워드 사용!
Example) 클래스의 정의 법 두가지
function Car(brand, name, color) {
// 함수로 정의하는 방법
}
class Car {
constructor(brand, name, color) {
// class키워드 사용법
}
}
참고로 생성자 함수(여기서 쓴 함수)는 return값 만들지 않음!
tip) 속성과 메소드의 차이 꼭 확인!!
Example) 클래스 문법을 이용한 실습
class Counter { // Counter라는 클래스 만듦
constructor() { // 계속 컨스트럭터 왜 쓰는거임? 인스턴스를 생성하고 초기화하기 위한 특수 메소드!
this.value = 0; // 생성자 호출을 할 경우, this는 new 키워드로 생성한 Counter의 인스턴스!!
}
increase() {
this.value++
}
decrease() {
this.value--
}
getValue() {
return this.value
}
}
let counter1 = new Counter() // 생성자 호출 여기서 counter1은 인스턴스네.
counter1.increase() // increase 메서드
counter1.getValue() // 1
- 우선 태초에 절차 지향 프로그래밍이 있음. C언어 같은
절차적 언어는 순차적인 명령의 조합.
그런데 객체 지향 언어로 바뀌면서
"클래스" 라고 부르는 대이터 모델의 청사진을 사용해 코드 작성
대표적으로 Java, C++, C# 임
자바스크립트는 프로토타입 기반 객체지향 언어라 객체 지향 언어는 아니지만 , 객체 지향 패턴으로 작성 가능!
객체는 한번 만들고 나면, 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지됨
- 객체 내에는 "데이터와 기능이 함께 있다"는 원칙에 따라 메소드와 속성이 존재함.
예를 들어, 자동차는 빨간색 속성을 가지고 최고 속력은 200km/h를 내게 값을 부여하자!
- 클래스는 일종의 원형으로, 속성(세부사항)이 들어가지 않은, 객체를 생성하기 위한 아이디어나 청사진. (세부사항 넣으면 객체!)
- 인스턴스는 클래스의 사례(인스턴스 오브젝트)
- 클래스는 객체를 만들기 위한 생성자함수(constructor) 포함! 이 생성자함수로 속성( 세부 사항 넣어줌) like 함수의 인자
- 속성 : 자동차의 색상, 가격, 속력 등의 고유 소성
- 메소드 : 시작, 후진, 전진, 멈춤등 자동차의 기능
- 데이터와 기능을 하나의 단위로 묶는 것
데이터(속성)와 기능(메소드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것
- 은닉: 구현은 숨기고, 동작은 노출시킴
객체 외부에서 필요한 동작(메소드)만 노출시킴
- 느슨한 결합: 언제든 구현을 수정할 수 있음
예를 들어 마우스 구동을 위한 코드 작성할때 스위치가 눌리고, 전기 신호가 생겨서, 전선을 타고 흐르고.. 와 같은 전 과정 ㄴㄴ
마우스의 상태를 속성으로 정하고 클릭, 이동을 메소드로 정해서 인스턴스 객체의 기능을 상상할 수 있게 함
- 부모 클래스(기본 클래스)의 특징을 자식 클래스(파생 클래스)가 물려받는 것
예를 들어 사람이라는 클래스에는 나이, 성별 등의 속성과 먹다, 자다 라는 메서드가 있음
여기서 학생이라는 클래스를 새로만들고 싶을때 사람이라는 클래스의 나이 성별은 상속받아도 됨!
- 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념. 인터페이스가 단순해짐
- 캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면,
추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스
클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라 부름.
- 예를 들어 말하다 라는 동작의 본질은 같지만
동물들 마다 말하는 동작에서 다형성을 가짐!
DOM을 배울때 Textarea, Select, Checkbox 등은 HTML에서 요소라고 부름.
근데 이것들의 공통 부모인 HTML Element라는 클래스에 render라는 메소드를 만들고 상속을 받게 만 듬
핵심은 render라는 메소드가 각각 다르게 작동한다는거임...
if (type === 'select') {
renderSelect()
}
else if (type === 'text') {
renderTextBox()
}
else if (type === 'checkbox') {
renderCheckBox()
}
//...
기본 클래스에 종류별로 분기를 시켜 하나하나 다르게 만들어아햠...
그래서 render의 개념은 부모가 갖는게 합리적
- 캡슐화는 코드를 복잡하지 않게 만들고, 재사용성을 높임.
- 추상화는 단순화된 사용으로 인해 변화에 대한 영향을 최소화함
- OOP의 의미는 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론.
before you learn
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes
[Object prototypes - Web 개발 학습하기 | MDN
Javascript에서는 객체를 상속하기 위하여 프로토타입이라는 방식을 사용합니다. 본 문서에서는 프로토타입 체인이 동작하는 방식을 설명하고 이미 존재하는 생성자에 메소드를 추가하기 위해
developer.mozilla.org](https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes)
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}은 잠에 들었습니다`);
}
}
let kimcoding = new Human('김코딩', 30);
console.log(Human.prototype)//
{constructor: ƒ, sleep: ƒ}
console.log(Human.prototype.constructor)//
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}은 잠에 들었습니다`);
}
}
console.log(kimcoding)//
Human {name: '김코딩', age: 30}
Human.prototype.constructor === Human; // true
Human.prototype === kimcoding.__proto__; // true
Human.prototype.sleep === kimcoding.sleep; // true
document.createElement('div') 하면 div 엘리먼트 만들기 가능
console.log 쳐보면 맽 밑에 prototype에 HTMLDivElement라는 클래스의 인스턴스라고 나옴
모든 DOM 엘리먼트는 textContent와 같은 속성, 또는 append() 같은 메소드가 있음.
EventTarget의 부모로는 모든 클래스의 조상인 Object가 존재함.
인스턴스의 __proto__를 이용하면 부모 클래스의 프로토타입, 혹은 '부모의 부모 클래스'의 트로토타입을 탐색 할 수 있음.
let kimcoding = new Human('김코딩', 30);
// 속성
kimcoding.age;
kimcoding.gender;
// 메소드
kimcoding.eat();
kimcoding.sleep();
let parkhacker = new Student('박해커', 22);
// 속성
parkhacker.grade;
// 메소드
parkhacker.learn();