- OOP(Object Oriented Programming)가 무엇인지?
- 여러가지 기능을 Class(like blueprint)라는 단위로 '구분'하여 부분부분을 재활용
(상속의 기능이 있기때문에) 할 수 있게 한다.
- 작게 구분하는 단위가 Class이고, 이러한 Class를 사용해서 코딩하는 것을 객체 지향형 프 로그래밍(Object Oriented Programming) 이라고 한다.
- 하나의 묶음 지향한다는 의미이다.
- Object = variables(property) and methods(변수와 메소드의 묶음)
- subclass 는 superclass 의 properties and methods를 상속 받는다.
- polymorphism(다형성)이란 : when a method inherited from a base class is redefined(기본 클래스에서 상속 된 메서드가 재정의 될 때)
- oop의 기본적인 특징
*캡슐화(Encapsulation) : (정보은닉)
- 하나의 주 된 사물의 정보나 작동을 주 된 오브젝트에 담는다 캡슐화한다고 한다.
*추상화(abstraction)
- EndUser에게 단순하고 간편한 모습을 보이고, 내부적인 작동 원리나 구조는 숨겨서 물건 이나 웹을 사용하는 사용자들이 편리하게 사용할 수 있도록 하는 것을 의미한다.
상속(Inheritance)
-부모(베이스)가 되는 요소의 특징(속성과 메소드)을 물려 받는 것을 의미한다. 상속이 왜 필요하냐고 말한다면 중복적인 기능을 제외하고 추가적인 기능만 추가함으로써 나중에 코드 에 대한 유지와 보수를 좀 더 간편하기 때문이다. 코드의 재사용율을 높인다.
다형성(Polymorphism)
- when a method inherited from a base class is redefined(기본 클래스에 서 상속 된 메서드가 재정의 될 때), 강점은 상속해서 보존하고, 추가되는 부분만 다시 정의를 해주는 것
- JavaScript에서 Object를 생성하는 여러가지 방법들
- 함수를 이용해서 만들수 있다. 이유는 함수도 객체이기 때문이다.
- JavaScript에서 Prototype은 무엇이고 왜 사용해야 하는지?
- 프로토 타입 객체는 데이터를 넣어두려는 목적보다는 하나의 틀로 사용하기 위해 만든다.
- 인스턴스 객체를 만들때 메모리의 효율적인 관리를 위함.
- --proto--, constructor, prototype 이 각각 어떤 관계를 가지고 있는지 조사해봅니다.
- --proto-- 는 [[Prototype]]과는 다르다. [[Prototype]] 의 getter(획득 자)이자 setter(설정자)이다.
- [[Prototype]]
함수를 포함한 모든 객체가 가지고 있는 internal slot이다.
객체의 입장에서 자신의 부모 역할을 하는 프로토타입 객체를 가리키며 함수 객체의 경우 Function.prototype를 가리킨다.
- prototype 프로퍼티
함수 객체만 가지고 있는 프로퍼티이다.
함수 객체가 생성자로 사용될 때 이 함수를 통해 생성될 객체의 부모 역할을 하는 객체(프 로토타입 객체)를 가리킨다.
let insects = {
eats: true
};
let ant = {
fast: true
};
ant.__proto__ = insects; // (*)
// 프로퍼티 eats과 fast를 ant에서도 사용
alert( ant.eats ); // true (**) // from insects
alert( ant.jumps ); // true
-
(*)로 표시한 줄에선 insects이 ant의 프로토타입이 되도록 설정
-
“ant의 프로토타입은 insects입니다.” 혹은 "ant는 insects를 상속받는다."라고 말할 수 있음.
-
프로토타입을 설정해 준 덕분에 ant에서도 insects에 구현된 유용한 프로퍼티와 메서드를 사용할 수 있다.
-
이렇게 프로토타입에서 상속받은 프로퍼티 =>'상속 프로퍼티(inherited property)'
-
constructor의 역할 : to create object from class from which it is being created.(class 내에서 객체를 생성하고 초기화하기 위한 특별한 메서드)
-
class는 constructor라는 이름을 가진 특별한 메서드를 하나씩만 가진다.
-
constructor 메서드는 super 키워드를 사용하여 super class의 생성자 메서드를 호출 할수 있다.
-
생성자 메서드를 지정하지 않은 경우엔 기본 생성자 메서드를 사용한다.
- Object.create 메소드에 대해 이해합시다.
- --proto-- 대신 Object.create 메서드들을 사용
let insects = {
eats: true
};
// 프로토타입이 insects인 새로운 객체를 생성합니다.
let ant = Object.create(insects);
alert(ant.eats); // true
alert(Object.getPrototypeOf(ant) === insects); // true
Object.setPrototypeOf(ant, {}); // ant의 프로토타입을 {}으로 바꿉니다.
- ES6 class 키워드 및 super 키워드 이용 방법을 알아봅니다.
-
클래스 상속(Class Inheritance)은 코드 재사용 관점에서 매우 유용하다. 새롭게 정의 할 클래스가 기존에 있는 클래스와 매우 유사하다면, 상속을 통해 그대로 사용하되 다른 점 만 구현하면 된다. 코드 재사용은 개발 비용을 현저히 줄일 수 있는 잠재력이 있으므로 매 우 중요하다.
-
extends 키워드
- extends 키워드는 부모 클래스(base class)를 상속받는 자식 클래스(sub class)를 정의할 때 사용한다.
-
오버라이딩(Overriding)
상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의하여 사용하는 방식이다.
-
오버로딩(Overloading)
매개변수의 타입 또는 갯수가 다른, 같은 이름의 메소드를 구현하고 매개변수에 의해 메소드를 구별하여 호출하는 방식이다. 자바스크립트는 오버로딩을 지원하지 않지만 arguments 객체 를 사용하여 구현할 수는 있다.
-
프로토타입 체인은 특정 객체의 프로퍼티나 메소드에 접근하려고 할 때 프로퍼티 또는 메소드 가 없다면 [[Prototype]] 내부 슬롯이 가리키는 링크를 따라 자신의 부모 역할을 하는 프로토타입 객체의 프로퍼티나 메소드를 차례대로 검색한다. 그리고 검색에 성공하면 그 프로 퍼티나 메소드를 사용한다.
-
super 키워드
- super 키워드는 부모 클래스를 참조(Reference)할 때 또는 부모 클래스의 constructor를 호출할 때 사용한다.
- super 메소드는 자식 class의 constructor 내부에서 부모 클래스의 constructor(super-constructor)를 호출한다.
- 즉, 부모 클래스의 인스턴스를 생성한다.
const Grub = require('./Grub');
class Bee extends Grub{//Grub이 부모 클라스에서 상속한다고 정의
constructor() {
super (); // 부모의 생성자를 호출
this.age = 5;
this.color = 'yellow';
this.job = 'Keep on growing';
}
eat () {
super.eat(); //부모 클래스(Base Class)에 대한 참조
}
}
module.exports = Bee;
- require()함수는 module.exports를 리턴한다.
- require() 함수는 모듈을 불러오기 위한 함수이다.
- module.exports 는 파일의 결과를 반환하는 것이다.